Home > Spring > πŸƒ[Spring] JPA 연관관계에 λŒ€ν•œ 좔가적인 κΈ°λŠ₯λ“€μ—λŠ” 무엇이 μžˆμ„κΉŒμš”? - N:1관계

πŸƒ[Spring] JPA 연관관계에 λŒ€ν•œ 좔가적인 κΈ°λŠ₯λ“€μ—λŠ” 무엇이 μžˆμ„κΉŒμš”? - N:1관계
Spring Framework

πŸƒ[Spring] JPA 연관관계에 λŒ€ν•œ 좔가적인 κΈ°λŠ₯λ“€μ—λŠ” 무엇이 μžˆμ„κΉŒμš”? - N:1관계

  • N:1 κ΄€κ³„λž€ μ—¬λŸ¬ μ—”ν‹°ν‹°κ°€ ν•˜λ‚˜μ˜ 엔티티에 연관될 수 μžˆλŠ” 관계λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ‹€λŒ€μΌ 관계라고도 λΆ€λ₯΄λ©°, 예λ₯Ό λ“€μ–΄ ν•˜λ‚˜μ˜ νšŒμ›(User)은 ν•˜λ‚˜μ˜ νŒ€(Team)에 μ†Œμ†λ  수 있고, μ—¬λŸ¬ λͺ…μ˜ νšŒμ›μ΄ λ™μΌν•œ νŒ€μ— 속할 수 μžˆμ„ λ•Œ N:1 관계λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§€ν•‘ν•©λ‹ˆλ‹€.

1️⃣ N:1 κ΄€κ³„μ˜ 맀핑 방식.

  • @ManyToOne μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ N:1 관계λ₯Ό λ§€ν•‘ν•©λ‹ˆλ‹€.
    • μ΄λ•Œ λ‹€μˆ˜(N) μͺ½μ—μ„œ ν•˜λ‚˜(1) μͺ½μ„ μ°Έμ‘°ν•˜μ—¬ μ™Έλž˜ ν‚€(Foreign Key)λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

πŸ‘‰ μ˜ˆμ‹œ: νšŒμ›(User)κ³Ό νŒ€(Team) κ°„μ˜ N:1 관계.

  • νšŒμ›κ³Ό νŒ€μ˜ κ΄€κ³„μ—μ„œ, μ—¬λŸ¬ λͺ…μ˜ νšŒμ›μ΄ ν•˜λ‚˜μ˜ νŒ€μ— μ†Œμ†λ  수 μžˆμœΌλ―€λ‘œ User μ—”ν‹°ν‹°μ—μ„œ Team μ—”ν‹°ν‹°μ™€μ˜ 관계λ₯Ό N:1둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @ManyToOne // N:1 관계 μ„€μ •.
    @JoinColumn(name = "team_id") // μ™Έλž˜ ν‚€ 컬럼 이름 지정.
    private Team team;
    
    // getter, setter
}

@Entity
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @OneToMany(mappedBy = "team") // Team이 Userμ™€μ˜ μ–‘λ°©ν–₯ κ΄€κ³„μ—μ„œ 주인이 μ•„λ‹˜.
    private List<User> users = new ArrayList<>();
    
    // getter, setter
}

πŸ‘‰ μ½”λ“œ μ„€λͺ….

  • User μ—”ν‹°ν‹°μ˜ team ν•„λ“œλŠ” @ManyToOne으둜 μ„€μ •λ˜μ–΄ 있으며, JoinColumn을 μ‚¬μš©ν•˜μ—¬ μ™Έλž˜ ν‚€λ‘œ team_id μ»¬λŸΌμ„ μ§€μ •ν•©λ‹ˆλ‹€.
  • Team μ—”ν‹°ν‹°λŠ” @OneToMany(mappedBy = "team")으둜 User 엔티티와 μ–‘λ°©ν–₯ 관계λ₯Ό λ§Ίκ³  있으며, users 리슀트λ₯Ό 톡해 μžμ‹ μ˜ νšŒμ›λ“€μ„ μ°Έμ‘°ν•©λ‹ˆλ‹€.
    • μ—¬κΈ°μ„œ mappedBy 속성을 톡해 μ—°κ΄€κ΄€κ³„μ˜ 주인이 μ•„λ‹˜μ„ λͺ…μ‹œν–ˆμŠ΅λ‹ˆλ‹€.

2️⃣ 단방ν–₯κ³Ό μ–‘λ°©ν–₯.

1️⃣ 단방ν–₯ N:1 관계.

  • User μ—”ν‹°ν‹°μ—μ„œλ§Œ Team μ—”ν‹°ν‹°λ₯Ό μ°Έμ‘°ν•˜μ—¬ 관계λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” μ™Έλž˜ ν‚€(Foreign Key)κ°€ User μ—”ν‹°ν‹°μ—λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

2️⃣ μ–‘λ°©ν–₯ N:1 관계.

  • User와 Team μ—”ν‹°ν‹°κ°€ μ„œλ‘œλ₯Ό μ°Έμ‘°ν•˜λ©° μ–‘λ°©ν–₯ 관계λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.
    • User μ—”ν‹°ν‹°κ°€ μ—°κ΄€κ΄€κ³„μ˜ μ£ΌμΈμ΄λ―€λ‘œ, Team μ—”ν‹°ν‹°μ˜ users ν•„λ“œλŠ” 읽기 μ „μš©μž…λ‹ˆλ‹€.

3️⃣ N:1 κ΄€κ³„μ˜ μ˜ˆμ‹œ 상황.

  • N:1 κ΄€κ³„λŠ” λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

1️⃣ 학생(Student)κ³Ό 학ꡐ(School)

  • μ—¬λŸ¬ λͺ…μ˜ 학생이 ν•˜λ‚˜μ˜ 학ꡐ에 μ†Œμ†λ  수 있음.

2️⃣ μ£Όλ¬Έ(Order)κ³Ό 고객(Customer)

  • μ—¬λŸ¬ 개의 주문이 ν•˜λ‚˜μ˜ κ³ κ°μ—κ²Œ 속할 수 있음.

4️⃣ 주의 사항.

  • N:1 κ΄€κ³„μ—μ„œλŠ” λ‹€μˆ˜ μͺ½μ΄ μ—°κ΄€κ΄€κ³„μ˜ 주인이며 μ™Έλž˜ ν‚€λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  • ν•„μš”μ— 따라 지연 λ‘œλ”©(Lazy Loading)을 μ„€μ •ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.