μ›Ή 개발/Spring Boot

[κΉ€μ˜ν•œ_μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 5. λ‹€μ–‘ν•œ 연관관계 맀핑

shj718 2022. 6. 12. 22:28

πŸ”­ 연관관계 λ§€ν•‘μ‹œ 고렀사항 3가지

  • 닀쀑성 (λ‹€λŒ€μΌ / μΌλŒ€λ‹€ / μΌλŒ€μΌ / λ‹€λŒ€λ‹€)
  • 단방ν–₯ / μ–‘λ°©ν–₯ (참쑰용 ν•„λ“œκ°€ μžˆλŠ” μ—”ν‹°ν‹°λ‘œλ§Œ μ°Έμ‘° κ°€λŠ₯ → ν•œμͺ½λ§Œ μ°Έμ‘°ν•˜λ©΄ 단방ν–₯, μ–‘μͺ½μ΄ μ„œλ‘œ μ°Έμ‘°ν•˜λ©΄ μ–‘λ°©ν–₯)
  • μ—°κ΄€κ΄€κ³„μ˜ 주인 (μ–‘λ°©ν–₯ λ§€ν•‘μ‹œ)

 

λ‹€λŒ€μΌ 단방ν–₯ πŸ‘¨‍πŸ‘©‍πŸ‘§‍πŸ‘¦:πŸ‘©

λ‹€λŒ€μΌ(@ManyToOne) 단방ν–₯은 κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” 연관관계이닀.

μ˜ˆμ‹œ) νšŒμ› : νŒ€ = N : 1 일 λ•Œ νšŒμ› μ—”ν‹°ν‹°μ—μ„œλ§Œ νŒ€μ„ μ°Έμ‘°

@Entity
public class Member {

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

 

λ‹€λŒ€μΌ μ–‘λ°©ν–₯ πŸ‘¨‍πŸ‘©‍πŸ‘§‍πŸ‘¦:πŸ‘©

λ‹€λŒ€μΌ μ–‘λ°©ν–₯은 λ‹€λŒ€μΌ 단방ν–₯에 κ°€μ§œ 맀핑을 μΆ”κ°€ν•΄μ„œ μ–‘μͺ½μ΄ μ„œλ‘œ μ°Έμ‘°ν•  수 μžˆλ„λ‘ λ§Œλ“  것이닀.

μ΄λ•Œ DB에 영ν–₯을 μ£ΌλŠ” 'μ—°κ΄€κ΄€κ³„μ˜ 주인'은 DB κΈ°μ€€ μ™Έλž˜ν‚€κ°€ μžˆλŠ” μͺ½μΈ 'λ‹€' μͺ½μ΄λ‹€.

μ˜ˆμ‹œ) μœ„μ˜ μ˜ˆμ‹œμ— νŒ€μ—μ„œλ„ νšŒμ›μ„ μ°Έμ‘°ν•  수 μžˆλ„λ‘ νŒ€ ν•„λ“œμ— μ•„λž˜ μ½”λ“œ μΆ”κ°€

@Entity
public class Team {

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();

 

μΌλŒ€λ‹€ 단방ν–₯, μΌλŒ€λ‹€ μ–‘λ°©ν–₯ πŸ‘©:πŸ‘¨‍πŸ‘©‍πŸ‘§‍πŸ‘¦

- μΌλŒ€λ‹€ 단방ν–₯은 '일(1)'μͺ½μ΄ μ—°κ΄€κ΄€κ³„μ˜ 주인이 λ˜λŠ” 방법이닀. 참고둜 DB ν…Œμ΄λΈ”μ€ 항상 'λ‹€(N)'μͺ½μ— μ™Έλž˜ν‚€κ°€ μžˆλ‹€.

κ·Έλž˜μ„œ 이 연관관계λ₯Ό μ‚¬μš©ν•˜λ©΄ νŒ€ ν…Œμ΄λΈ”μ΄ νšŒμ› ν…Œμ΄λΈ”μ˜ μ™Έλž˜ν‚€λ₯Ό κ΄€λ¦¬ν•˜λŠ” νŠΉμ΄ν•œ ꡬ쑰가 λ§Œλ“€μ–΄μ§„λ‹€.

λ”°λΌμ„œ, μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것을 ꢌμž₯ν•œλ‹€. 이런 연관관계가 ν•„μš”ν•œ 경우(Ex. νšŒμ›μ€ νŒ€μ— μ „ν˜€ 관심이 μ—†κ³  νŒ€μ—μ„œλ§Œ νšŒμ›μ„ 관리)μ—λŠ” λ‹€λŒ€μΌ μ–‘λ°©ν–₯ 맀핑을 μ‚¬μš©ν•˜μž.

 

- μΌλŒ€λ‹€ μ–‘λ°©ν–₯은 κ³΅μ‹μ μœΌλ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹€λŒ€μΌ μ–‘λ°©ν–₯ 맀핑을 μ‚¬μš©ν•˜μž.

 

μΌλŒ€μΌ 단방ν–₯ πŸ‘©:πŸ‘©

μΌλŒ€μΌ(@OneToOne) 단방ν–₯ μ—°κ΄€κ΄€κ³„λŠ” DB의 두 ν…Œμ΄λΈ” 쀑 μ£Όν…Œμ΄λΈ”μ— μ™Έλž˜ν‚€κ°€ μžˆμ–΄λ„ 되고, λŒ€μƒν…Œμ΄λΈ”μ— μ™Έλž˜ν‚€κ°€ μžˆμ–΄λ„ λ˜λŠ” 상황이닀.

λ‹€λŒ€μΌ(N:1)κ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ, μ™Έλž˜ν‚€μ— UNIQUE 쑰건을 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

 

μ˜ˆμ‹œ) νšŒμ› : 사물함 = 1 : 1 → μ£Όν…Œμ΄λΈ” μ—”ν‹°ν‹°(νšŒμ›)μ—λ§Œ 참쑰용 ν•„λ“œ 생성

μ•„λž˜ μ½”λ“œλŠ” νšŒμ› μ—”ν‹°ν‹°(μ£Όν…Œμ΄λΈ”)μ—μ„œ 사물함(λŒ€μƒν…Œμ΄λΈ”)을 μ°Έμ‘°ν•˜λ„λ‘ μ„€κ³„ν•œ 것이닀.

@Entity
public class Member {

    @OneToOne
    @JoinColumn(name = "LOCKER_ID", unique=true)
    private Locker locker;

 

μΌλŒ€μΌ μ–‘λ°©ν–₯ πŸ‘©:πŸ‘©

μΌλŒ€μΌ μ–‘λ°©ν–₯은 μ–‘μͺ½μ΄ μ„œλ‘œ μ°Έμ‘°ν•  수 μžˆλŠ” 관계이닀.

μœ„μ˜ μΌλŒ€μΌ 단방ν–₯ μ˜ˆμ‹œμ—μ„œ 사물함 엔티티에 νšŒμ› ν•„λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μ–‘λ°©ν–₯이 λœλ‹€.

 

μΌλŒ€μΌ μ–‘λ°©ν–₯은 λ‹€λŒ€μΌ μ–‘λ°©ν–₯κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ—°κ΄€κ΄€κ³„μ˜ 주인이 μ™Έλž˜ν‚€κ°€ μžˆλŠ” μͺ½μ΄λ‹€. 주인이 μ•„λ‹Œ μͺ½μ€ mappedByλ₯Ό μ μš©ν•œλ‹€.

@Entity
public class Locker {

    @OneToOne(mappedBy = "locker")
    private Member member;

 

λ‹€λŒ€λ‹€ πŸ‘¨‍πŸ‘©‍πŸ‘§‍πŸ‘¦:πŸ‘¨‍πŸ‘©‍πŸ‘§‍πŸ‘¦

λ‹€λŒ€λ‹€(N:M) 연관관계 맀핑(@ManyToMany)은 μ‹€λ¬΄μ—μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

λŒ€μ‹ , μ—°κ²°ν…Œμ΄λΈ”μ„ μ—”ν‹°ν‹°λ‘œ λ§Œλ“€λ©΄ λœλ‹€.

 

μ˜ˆμ‹œ)

- MemberProduct (μ—°κ²° ν…Œμ΄λΈ”)

@Entity
public class MemberProduct {

    @ManyToOne
    @JoinColumn(name = "MEMBER_ID")
    private Member member;

    @ManyToOne
    @JoinColumn(name = "PRODUCT_ID")
    private Product product;

- Member

@Entity
public class Member {

    @OneToMany(mappedBy = "member")
    private List<MemberProduct> memberProducts = new ArrayList<>();

- Product

@Entity
public class Product {

    @OneToMany(mappedBy = "product")
    private List<MemberProduct> memberProducts = new ArrayList<>();

 

@JoinColumn

@ManyToOne, @OneToOneκ³Ό ν•¨κ»˜ μ‚¬μš©λ˜λŠ” @JoinColumn에 λŒ€ν•΄ ν™•μ‹€νžˆ μ•Œκ³  λ„˜μ–΄κ°€μž.

@JoinColumn(name = "[μ™Έλž˜ν‚€ 이름]")

@JoinColumn의 name 속성은 ν•΄λ‹Ή μ—”ν‹°ν‹°μ—μ„œ μ°Έμ‘°ν•˜λŠ” μ™Έλž˜ν‚€(FK) 컬럼의 이름을 μ§€μ •ν•˜λŠ” 것이닀. μƒλž΅μ΄ κ°€λŠ₯ν•˜λ©°, μƒλž΅ν•  경우 [ν•„λ“œλͺ…_μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ˜ PK 컬럼λͺ…]으둜 μžλ™ μ„€μ •λœλ‹€. μ‹€μ œλ‘œ μ™Έλž˜ν‚€κ°€ μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ˜ 컬럼λͺ…은 referencedColumnName μ†μ„±μœΌλ‘œ μ§€μ •ν•œλ‹€. 이 μ—­μ‹œ μƒλž΅ κ°€λŠ₯ν•˜λ©°, μƒλž΅ν•  경우 μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ˜ PK둜 μ•Œμ•„μ„œ μ²˜λ¦¬ν•΄μ€€λ‹€.

(μ°Έκ³ : https://hyeon9mak.github.io/omit-join-column-when-using-many-to-one/, https://boomrabbit.tistory.com/217)