[RDBMS Modeling 기초] 4. 관계(Relation) - M:N 관계
Β·
Develop/DB
M:N 관계 λΉ„μ¦ˆλ‹ˆμŠ€ 관계 N : M κ΄€κ³„λŠ” 관계λ₯Ό κ°€μ§„ μ–‘μͺ½ λ‹Ήμ‚¬μž λͺ¨λ‘μ—μ„œ 1 : M 관계가 μ‘΄μž¬ν•  λ•Œ λ‚˜νƒ€λ‚˜λŠ” λͺ¨μŠ΅μž…λ‹ˆλ‹€. 예λ₯Όλ“€λ©΄, 학생과 κ³Όλͺ©μ˜ κ΄€κ³„μž…λ‹ˆλ‹€. 학생 μž…μž₯μ—μ„œλŠ” μ—¬λŸ¬ 개 κ³Όλͺ©μ„ μˆ˜κ°•ν•  수 있고, κ³Όλͺ© μž…μž₯μ—μ„œ 보면 μ—¬λŸ¬ 학생이 이 κ³Όλͺ©μ„ 선택할 수 μžˆμŠ΅λ‹ˆλ‹€. μ–΄λŠ μͺ½μ—μ„œ 봐도 λ‹€:λ‹€ 관계가 μ„±λ¦½λ©λ‹ˆλ‹€. 관계λ₯Ό 풀어보면 PK 쀑볡이 λ°œμƒ N:M 관계λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” 또 ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ΄ ν•„μš”ν•˜λ‹€ . " 학생이 κ³Όλͺ©μ„ μˆ˜κ°•ν•©λ‹ˆλ‹€ " λΌλŠ” λΉ„μ¦ˆλ‹ˆμŠ€μ— λͺ…사와 동사λ₯Ό μ°ΎλŠ”λ‹€ --> 학생 , κ³Όλͺ© , μˆ˜κ°• 학생과 κ³Όλͺ©μ€ 관계가 μ—†λ‹€ . ν•˜μ§€λ§Œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λ“€μ–΄μ˜€λŠ” μˆœκ°„ 관계가 λ§Ίμ–΄μ§„λ‹€ μˆ˜κ°•μ΄λΌλŠ” 관계 ν…Œμ΄λΈ” - 학생과 κ³Όλͺ©μ˜ 관계λ₯Ό λ§Ίμ–΄μ€€λ‹€. μ˜ˆμ‹œ) λ²„μŠ€κ°€ 1이면 μ’Œμ„μ€ N 인가? -> ..
[μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 5. λ‹€λŒ€μΌ[N:1] / μΌλŒ€λ‹€[1:N] / μΌλŒ€μΌ[1:1] / λ‹€λŒ€λ‹€[N:M]
Β·
Spring/Spring JPA κΈ°λ³Έ
λ‹€λŒ€μΌ [N : 1] @ManyToOne 단방ν–₯ Member(N) : Team(1) 은 λ‹€λŒ€μΌ 관계 ν•œμͺ½μ΄ 관계λ₯Ό 맺은 μͺ½μ˜ μ—¬λŸ¬ 객체λ₯Ό κ°–λŠ” 것을 의미 ν•˜λ‚˜μ˜ νŒ€(1)은 μ—¬λŸ¬ 멀버(N)λ₯Ό κ°–λŠ”λ‹€ Member.class @ManyToOne @JoinColumn(name = "team_id") private Team team; Many -> One Member(N) -> Team(1) name μ†μ„±μ—λŠ” λ§€ν•‘ν•  μ™Έλž˜ ν‚€ 이름 μ§€μ •ν•œλ‹€. λ‹€λŒ€μΌ [N : 1] OneToMany μ–‘λ°©ν–₯ Team κ°μ²΄μ—μ„œ λ°˜λŒ€μͺ½ Member λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ List members λ₯Ό 생성해쀀닀. μ΄λ ‡κ²Œ μƒμ„±ν•΄μ€˜λ„ ν…Œμ΄λΈ”μ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€. @OneToMany(mappedBy = "team") private List memb..
[RDBMS Modeling 기초] 3. 관계(Relation) - 1:M 관계
Β·
Develop/DB
1:M 관계 ν•œμͺ½μ΄ 관계λ₯Ό 맺은 μͺ½μ˜ μ—¬λŸ¬ 객체λ₯Ό κ°–λŠ” 것을 의미 λΆ€μžμ§€κ°„μ˜ 관계 λΆ€λͺ¨λŠ” μžμ‹μ„ 1λͺ…, 2λͺ…, 3λͺ…, κ·Έ 이상도 κ°€μ§ˆ 수 μžˆλ‹€. λ°˜λŒ€λ‘œ μžμ‹ μž…μž₯μ—μ„œλŠ” λΆ€λͺ¨(아버지, μ–΄λ¨Έλ‹ˆμ˜ 쌍)λ₯Ό ν•˜λ‚˜λ§Œ κ°€μ§ˆ 수 밖에 μ—†λ‹€. λΆ€λͺ¨ 1 : μžμ‹ M λΆ€λͺ¨ ν…Œμ΄λΈ”μ˜ PK κ°€ μžμ‹ν…Œμ΄λΈ”μ˜ ν‚€κ°’μœΌλ‘œ λ‚˜νƒ€λ‚Όλ•Œ 이 ν‚€λ₯Ό μ™Έλž˜ν‚€(FK:Foreign Key) 라고 ν•œλ‹€. μ™Έλž˜ν‚€λŠ” 두 ν…Œμ΄λΈ”μ„ μ„œλ‘œ μ—°κ²°ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 킀이닀. μ™Έλž˜ν‚€κ°€ ν¬ν•¨λœ ν…Œμ΄λΈ”μ„ μžμ‹ ν…Œμ΄λΈ”μ΄λΌκ³  ν•˜κ³  μ™Έλž˜ν‚€ 값을 μ œκ³΅ν•˜λŠ” ν…Œμ΄λΈ”μ„ λΆ€λͺ¨ ν…Œμ΄λΈ”μ΄λΌν•œλ‹€. λΆ€λͺ¨μ™€ μžμ‹κ°„μ˜ 관계λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ— μ„ μ–Έν•΄μ£Όλ©΄ 법칙을 μ§€μΌœμ„œ λΆ€λͺ¨μ—†λŠ” μžμ‹(μ„€λͺ…ν•  수 μ—†λŠ” 데이터, ex) λΆ€λͺ¨ID:4 인 - λ°•xx )은 λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ— λ“±λ‘λ˜λŠ” 것을 막아쀀닀 . 예..
[μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 4. 연관관계 λ§€ν•‘
Β·
Spring/Spring JPA κΈ°λ³Έ
연관관계 λ§€ν•‘ 객체와 ν…Œμ΄λΈ” μ—°κ΄€κ΄€κ³„μ˜ 차이λ₯Ό μ΄ν•΄ν•˜μž 객체의 참쑰와 ν…Œμ΄λΈ”μ˜ μ™Έλž˜ ν‚€λ₯Ό λ§€ν•‘ 객체λ₯Ό ν…Œμ΄λΈ”μ— λ§žμΆ”μ–΄ λͺ¨λΈλ§ (연관관계가 μ—†λŠ” 객체) Team @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; @Column(name = "TEAM_NAME") private String name; } Member @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String name; @Column(name = "T..
[RDBMS Modeling 기초] 2. Primary Key 섀계
Β·
Develop/DB
Primary Key 섀계 μ£Ό μ‹λ³„μžλŠ” ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 역할을 λ§‘κ³  μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Όμ˜ 관계λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλ„ λ°˜λ“œμ‹œ ν•„μš”ν•œ κ²ƒμž…λ‹ˆλ‹€. μ£Ό μ‹λ³„μžλ₯Ό μ–΄λ–»κ²Œ μ„€κ³„ν•˜λŠ” 것인지에 λŒ€ν•΄μ„œ μžμ„Ένžˆ 닀루어 λ΄…λ‹ˆλ‹€. μœ μΌν•˜κ³  Not NULL 인 컬럼 후보 μ‹λ³„μžκ°€ μ—†λŠ” 경우 μš°λ¦¬κ°€ μ‹λ³„μžλ₯Ό μž„μ˜λ‘œ λ§Œλ“€μ–΄μ„œ λΆ€μ—¬ν•  수 μžˆλ‹€ ! ( 인쑰 μ‹λ³„μž ) κ°•μ œλ‘œ μ‹λ³„μž μ»¬λŸΌμ„ λ§Œλ“ λ‹€ PK의 데이터 νƒ€μž… κ²°μ • λ ˆμ½”λ“œμ˜ λ°œμƒ κ°€λŠ₯ν•œ μ΅œλŒ€ 수λ₯Ό μ˜ˆμΈ‘ν•œλ‹€ 예) 1년에 λͺ‡ 개 정도 λ°œμƒν•˜λŠ”κ°€? ν•œ 달에 λͺ‡ κ°œμ •λ„ λ°œμƒν•˜λŠ”κ°€? 예) μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” λŒ€μƒμ΄ λŒ€λž΅ λͺ‡ κ°œμ •λ„ λ˜λŠ”κ°€? 데이터 νƒ€μž…μ˜ 끝에 λ„λ‹¬ν•˜λ©΄ μ“Έ 수 μ—†κΈ° λ•Œλ¬Έ PK λ₯Ό κ΅¬μ„±ν•˜λŠ”λ° λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ μ»¬λŸΌλ§Œμ„ μ‚¬μš©ν•  ν•„μš”λŠ” μ—†λ‹€ ( 년도 - μ›” - Seq..
[μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 3. μ—”ν‹°ν‹° λ§€ν•‘
Β·
Spring/Spring JPA κΈ°λ³Έ
μ—”ν‹°ν‹° λ§€ν•‘ @Entity @Entity public class Member { @Id @GeneratedValue private Long id; private String username; } @Entityκ°€ 뢙은 ν΄λž˜μŠ€λŠ” JPAκ°€ 관리 JPAλ₯Ό μ‚¬μš©ν•΄μ„œ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘ν•  ν΄λž˜μŠ€λŠ” @Entity ν•„μˆ˜ κΈ°λ³Έ μƒμ„±μž ν•„μˆ˜(νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” public λ˜λŠ” protected μƒμ„±μž) name 속성 @Entity(name = "Member") public class Member { JPAμ—μ„œ μ‚¬μš©ν•  μ—”ν‹°ν‹° 이름을 μ§€μ •ν•œλ‹€. κΈ°λ³Έκ°’: 클래슀 이름을 κ·ΈλŒ€λ‘œ μ‚¬μš©(예: Member) λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ μžλ™ 생성 jpa: hibernate: ddl-auto: create DDL을 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œμ μ— μžλ™ 생성 ..
[RDBMS Modeling 기초] 1. κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€
Β·
Develop/DB
κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(relational database)λž€? κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λž€ ν…Œμ΄λΈ”(table)둜 이루어져 있으며, 이 ν…Œμ΄λΈ”μ€ ν‚€(key)와 κ°’(value)의 관계λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 고유 μ‹λ³„μž Unique μ—¬λŸ¬κ°œμ˜ 집합체λ₯Ό λ‹΄κ³  μžˆλŠ” ν•˜λ‚˜μ˜ ν†΅μ—μ„œ 각각을 ꡬ뢄할 수 μžˆλŠ” 논리적인 μ΄λ¦„μ˜ κ΅¬λΆ„μžλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. ν•˜λ‚˜μ˜ 엔터티에 κ΅¬μ„±λ˜μ–΄ μžˆλŠ” μ—¬λŸ¬κ°œμ˜ 속성 쀑에 μ—”ν„°ν‹°λ₯Ό λŒ€ν‘œν•  수 μžˆλŠ” 속성을 μ˜λ―Έν•˜λ©° ν•˜λ‚˜μ˜ μ—”ν„°ν‹°λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ μ‹λ³„μžκ°€ μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ°Έμ‘° 무결성 ν…Œμ΄λΈ”μ—μ„œ μ™Έλž˜ν‚€λ₯Ό μ„ μ–Έ μ™Έλž˜ν‚€λŠ” λ‹€λ₯Έ ν…Œμ΄λΈ”μ— μ •μ˜λœ 고유 μ‹λ³„μžλ₯Ό μ°Έμ‘° μ™Έλž˜ν‚€μ˜ 값은 λ‹€λ₯Έ ν…Œμ΄λΈ”μ— μ •μ˜λœ 고유 μ‹λ³„μžμ˜ κ°’μ˜ λ²”μœ„λ₯Ό λ„˜μ„ 수 없도둝 μ œν•œλ¨ μ£Ό μ‹λ³„μž(Primary Key) ν•˜λ‚˜μ˜ λ ˆμ½”λ“œλ₯Ό κ³ μœ ν•˜κ²Œ ꡬ뢄할 수 μžˆλŠ” ..
[μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 2. PersistenceContext (μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ)
Β·
Spring/Spring JPA κΈ°λ³Έ
PersistenceContext (μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ) μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλž€ μ—”ν‹°ν‹°λ₯Ό 영ꡬ μ €μž₯ν•˜λŠ” ν™˜κ²½μ΄λΌλŠ” λœ»μ΄λ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μ΄μ—μ„œ 객체λ₯Ό λ³΄κ΄€ν•˜λŠ” κ°€μƒμ˜ λ°μ΄ν„°λ² μ΄μŠ€ 같은 역할을 ν•œλ‹€. μ—”ν‹°ν‹° λ§€λ‹ˆμ €λ₯Ό 톡해 μ—”ν‹°ν‹°λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ‘°νšŒν•˜λ©΄ μ—”ν‹°ν‹° λ§€λ‹ˆμ €λŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ—”ν‹°ν‹°λ₯Ό λ³΄κ΄€ν•˜κ³  κ΄€λ¦¬ν•œλ‹€. public Long save(Member member) { em.persist(member); return member.getId(); } EntityManager.persist(member) : μ—”ν‹°ν‹° λ§€λ‹ˆμ €λ₯Ό μ‚¬μš©ν•΄ νšŒμ› μ—”ν‹°ν‹°λ₯Ό μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯ν•œλ‹€λŠ” 의미! μ‹€μ œλ‘œλŠ” DB에 μ €μž₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό ν†΅ν•΄μ„œ Entityλ₯Ό μ˜μ†ν™”ν•œλ‹€λŠ” λœ»μ΄λ‹€. μ •ν™•νžˆ λ§ν•˜λ©΄ persi..