Hamutaro - Hamtaro 4

Backend/Java

[JPA] JPA ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ 1 - 1:N, N:1, N:N

carsumin 2025. 11. 12. 16:01
JPA ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘
  • JPA๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์ด๋‹ค.
  • RDB๋Š” ํ…Œ์ด๋ธ”๊ณผ FK๋กœ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ , JPA๋Š” ์ด๋ฅผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

 

1:N (One-To-Many)
  • ํ•˜๋‚˜ -> ์—ฌ๋Ÿฌ ๊ฐœ ๊ด€๊ณ„

์˜ˆ์‹œ

  • ํšŒ์› 1๋ช… -> ์ฃผ๋ฌธ ์—ฌ๋Ÿฌ ๊ฐœ
  • ๊ฒŒ์‹œ๊ธ€ 1๊ฐœ -> ๋Œ“๊ธ€ ์—ฌ๋Ÿฌ ๊ฐœ

ํŠน์ง•

  • FK๋Š” ํ•ญ์ƒ N(๋‹ค) ์ชฝ์— ์กด์žฌ
  • ์‹ค์ œ๋กœ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ชฝ์€ ๋Œ€๋ถ€๋ถ„ N์ชฝ
  • 1์ชฝ์—์„œ 1:N ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ

๋งคํ•‘ ์˜ˆ์‹œ (์–‘๋ฐฉํ–ฅ)

  • N:1 + 1:N ์–‘๋ฐฉํ–ฅ ์กฐํ•ฉ
@Entity
class Member {
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

@Entity
class Order {
    @ManyToOne
    @JoinColumn(name = "memeber_id")
    private Member member;
}

 

 

N:1 (Many-To-One)
  • ์—ฌ๋Ÿฌ ๊ฐœ -> ํ•˜๋‚˜ ๊ด€๊ณ„
  • JPA์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด

์˜ˆ์‹œ

  • ๋Œ“๊ธ€ ์—ฌ๋Ÿฌ ๊ฐœ -> ๊ฒŒ์‹œ๊ธ€ 1๊ฐœ
  • ์ฃผ๋ฌธ ์—ฌ๋Ÿฌ ๊ฐœ -> ํšŒ์› 1๋ช…

ํŠน์ง•

  • ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ ์—ญํ•  -> FK๋ฅผ ๊ฐ€์ง„ ์ชฝ = N์ชฝ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ LAZY ์‚ฌ์šฉ ํ•„์ˆ˜

๋งคํ•‘ ์˜ˆ์‹œ

@Entity
class Comment {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private Post post;
}

 

 

N:N (Many-To-Many)
  • ์—ฌ๋Ÿฌ ๊ฐœ <-> ์—ฌ๋Ÿฌ ๊ฐœ ๊ด€๊ณ„
  • JPA์—์„œ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‹ค๋ฌด์—์„œ๋Š” ๊ฑฐ์˜ ์“ฐ์ง€ ์•Š์Œ

๋ฌธ์ œ์ 

  • ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์—”ํ‹ฐํ‹ฐ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์—†์Œ
  • ์กฐ์ธ ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ
  • ์„ฑ๋Šฅ, ์ฟผ๋ฆฌ ํŠœ๋‹ ์–ด๋ ค์›€
  • ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฟผ๋ฆฌ ์ƒ์„ฑ

์‹ค๋ฌด ํ‘œ์ค€์€?

  • ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์—”ํ‹ฐํ‹ฐ๋กœ ๋งŒ๋“ค์–ด N:1 + 1:N ๊ด€๊ณ„๋กœ ํ’€์–ด๋ƒ„
@Entity
class Enrollment {
    @ManyToOne
    @JoinColumn(name = "student_id")
    private Student student;
    
    @ManyToOne
    @JoinColumn(name = "course_id")
    private Course course;
}

 

 

์ •๋ฆฌ
  • FK๋Š” ํ•ญ์ƒ N์ชฝ
  • ์‹ค๋ฌด ํ‘œ์ค€์€ N:1 ๋‹จ๋ฐฉํ–ฅ (or ์–‘๋ฐฉํ–ฅ)
  • N:N์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ฐ„ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ถ„๋ฆฌ
  • ์„ฑ๋Šฅ ์œ„ํ•ด LAZY๊ฐ€ ๊ธฐ๋ณธ