Home > Backend Development > πŸ“š[Backend Development] 단방ν–₯κ³Ό μ–‘λ°©ν–₯의 κ°œλ…μ— λŒ€ν•˜μ—¬.

πŸ“š[Backend Development] 단방ν–₯κ³Ό μ–‘λ°©ν–₯의 κ°œλ…μ— λŒ€ν•˜μ—¬.
Backend Ddevelopment JPA

β€œπŸ“š[Backend Development] 단방ν–₯κ³Ό μ–‘λ°©ν–₯의 κ°œλ…μ— λŒ€ν•˜μ—¬.”

🍎 Intro.

  • JPAμ—μ„œ μ—”ν‹°ν‹° κ°„μ˜ 관계λ₯Ό μ„€μ •ν•  λ•Œ 단방ν–₯κ³Ό μ–‘λ°©ν–₯ 관계λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ™Έλž˜ ν‚€(Foreign Key) 관계λ₯Ό 객체 지ν–₯적으둜 λ§€ν•‘ν•˜λŠ” 방식에 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€.

βœ…1️⃣ 단방ν–₯ 관계 (Unidirectional)

  • 단방ν–₯ κ΄€κ³„λŠ” ν•œμͺ½ μ—”ν‹°ν‹°λ§Œ λ‹€λ₯Έ μ—”ν‹°ν‹°λ₯Ό μ°Έμ‘°ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

πŸ“ 예제: 단방ν–₯ @OneToOne 관계.

@Entity
public class Passport {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String passportNumber;
}

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    
    @OneToOne
    @JoinColumn(name = "passport_id") // μ™Έλž˜ ν‚€λ₯Ό Person ν…Œμ΄λΈ”μ΄ 가짐
    private Passport passport;
}

πŸ“Œ νŠΉμ§•

  • Person μ—”ν‹°ν‹°μ—μ„œλ§Œ Passportλ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Passport μ—”ν‹°ν‹°μ—μ„œλŠ” Person을 μ „ν˜€ λͺ¨λ¦…λ‹ˆλ‹€.
  • ν…Œμ΄λΈ” κ΅¬μ‘°μ—μ„œλŠ” Person ν…Œμ΄λΈ”μ— passport_idλΌλŠ” μ™Έκ°œ ν‚€κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • 데이터 쑰회 μ‹œ Person을 κ°€μ Έμ˜¬ λ•Œ Passport도 ν•¨κ»˜ μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ…2️⃣ μ–‘λ°©ν–₯ 관계 (Bidirectional)

  • μ–‘λ°©ν–₯ κ΄€κ³„λŠ” 두 μ—”ν‹°ν‹°κ°€ μ„œλ‘œλ₯Ό μ°Έμ‘°ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

πŸ“ 예제: μ–‘λ°©ν–₯ @OneToOne 관계.

@Entity
public class Passport {
    @Id
    @GeneratedValue(startegy = GenerationType.IDENTITY)
    private Long id;
    private String passportNumber;
    
    @OneToOne(mappedBy = "passport") // Person μ—”ν‹°ν‹°μ˜ passport ν•„λ“œμ™€ μ—°κ²°
    private Person person;
}

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    
    @OneToOne
    @JoinColumn(name = "passport_id") // μ‹€μ œ μ™Έλž˜ ν‚€λ₯Ό μ†Œμœ 
    private Passport passport;
}

πŸ“Œ νŠΉμ§•

  • Person이 Passportλ₯Ό μ°Έμ‘°ν•˜κ³ , Passport도 Person을 μ°Έμ‘°ν•©λ‹ˆλ‹€.
  • Person이 μ™Έλž˜ ν‚€λ₯Ό μ†Œμœ (@JoinColumn(name = β€œpassport_id))”
  • Passportμ—μ„œ mappedBy = β€œpassport”λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜λŒ€νŽΈμ—μ„œ 맀핑을 담당함.
  • 두 μ—”ν‹°ν‹°κ°€ μ„œλ‘œ μ°Έμ‘°ν•˜κΈ° λ•Œλ¬Έμ— μ–‘λ°©ν–₯ 탐색 κ°€λŠ₯(예: passport.getPerson())

βœ…3️⃣ 단방ν–₯ VS μ–‘λ°©ν–₯ 비ꡐ.

ꡬ뢄 단방ν–₯ 관계 μ–‘λ°©ν–₯ 관계
μ°Έμ‘° λ°©ν–₯ ν•œμͺ½ μ—”ν‹°ν‹°λ§Œ λ‹€λ₯Έ μ—”ν‹°ν‹°λ₯Ό μ°Έμ‘° 두 μ—”ν‹°ν‹°κ°€ μ„œλ‘œ μ°Έμ‘°
ν…Œμ΄λΈ” ꡬ쑰 ν•œμͺ½ ν…Œμ΄λΈ”μ—λ§Œ μ™Έλž˜ ν‚€ 쑴재 ν…Œμ΄λΈ” κ΅¬μ‘°λŠ” λ™μΌν•˜λ‚˜ κ°μ²΄μ—μ„œ μƒν˜Έ μ°Έμ‘°
쑰회 λ°©ν–₯ ν•œμͺ½μ—μ„œλ§Œ 쑰회 κ°€λŠ₯ μ–‘μͺ½μ—μ„œ 쑰회 κ°€λŠ₯
μ‚¬μš© 예 λ‹¨μˆœν•œ μ—°κ΄€ 관계 상관 관계가 ν•„μš”ν•œ 경우

βœ…4️⃣ μ–Έμ œ 단방ν–₯/μ–‘λ°©ν–₯을 선택해야 ν• κΉŒ?

1️⃣ 단방ν–₯이 더 μ ν•©ν•œ 경우.

  • λ°˜λŒ€ λ°©ν–₯μ—μ„œ μ°Έμ‘°ν•  ν•„μš”κ°€ μ—†λŠ” 경우
    • 예: Order ➞ Payment (주문은 결제λ₯Ό μ°Έμ‘°ν•˜μ§€λ§Œ, κ²°μ œλŠ” 주문을 μ°Έμ‘°ν•  ν•„μš” μ—†μŒ)
  • μ„±λŠ₯을 μ΅œμ ν™”ν•˜κ³  λΆˆν•„μš”ν•œ 데이터 λ‘œλ”©μ„ λ°©μ§€ν•˜κ³  싢은 경우
    • μ–‘λ°©ν–₯ 관계λ₯Ό λ§Œλ“€λ©΄ λΆˆν•„μš”ν•œ μ—°κ΄€ κ°μ²΄κΉŒμ§€ λ‘œλ”©λ  수 있음.
    • FetchType.LAZYλ₯Ό μ„€μ •ν•˜λ”λΌλ„ 관리 뢀담이 컀질 수 있음.

2️⃣ μ–‘λ°©ν–₯이 더 μ ν•©ν•œ 경우.

  • μ–‘μͺ½μ—μ„œ μ°Έμ‘°ν•  ν•„μš”κ°€ μžˆλŠ” 경우
    • 예: Member ↔ Team (νšŒμ›μ΄ νŒ€μ„ μ°Έμ‘°ν•˜κ³ , νŒ€λ„ νšŒμ› λͺ©λ‘μ„ 관리해야 함)
  • λ°˜λŒ€ μ—”ν‹°ν‹°λ₯Ό μ‰½κ²Œ μ‘°νšŒν•΄μ•Ό ν•˜λŠ” 경우
    • 예λ₯Ό λ“€μ–΄ Passportμ—μ„œ Person을 μ‘°νšŒν•˜λŠ” κΈ°λŠ₯이 자주 ν•„μš”ν•˜λ‹€λ©΄ μ–‘λ°©ν–₯이 μœ λ¦¬ν•¨.
    • OneToMany, ManyToOne κ΄€κ³„μ—μ„œλŠ” μ„±λŠ₯ κ³ λ € ν›„ μ–‘λ°©ν–₯ 섀정을 ν•  μˆ˜λ„ 있음.

βœ…5️⃣ 정리

  • @OneToOne, @OneToMany, @ManyToOne, @ManyToMany κ΄€κ³„λŠ” 단방ν–₯κ³Ό μ–‘λ°©ν–₯이 λͺ¨λ‘ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 단방ν–₯은 ν•œμͺ½μ—μ„œλ§Œ μ°Έμ‘°, μ–‘λ°©ν–₯은 μ„œλ‘œ μ°Έμ‘°ν•©λ‹ˆλ‹€.
  • μ–‘λ°©ν–₯ κ΄€κ³„μ—μ„œλŠ” mappedByλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°κ΄€ κ΄€κ³„μ˜ 주인을 지정해야 ν•©λ‹ˆλ‹€.
  • λΆˆν•„μš”ν•œ μ–‘λ°©ν–₯ 관계λ₯Ό ν”Όν•˜κ³ , ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ μš©ν•˜μ—¬ μ„±λŠ₯κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ‘‰ 일반적으둜 λ‹¨λ°˜ν–₯을 기본으둜 ν•˜κ³ , ν•„μš”ν•  λ•Œλ§Œ μ–‘λ°©ν–₯을 μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.