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๊ฐ ๊ธฐ๋ณธ
'Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Java] ์๊ฐ์ ๊ธธ์ด๋ฅผ ํํํ๋ Duration (0) | 2026.02.13 |
|---|---|
| [JPA] JPA ์ฐ๊ด๊ด๊ณ ๋งคํ 2 - ์ฆ์ ๋ก๋ฉ(EAGER) vs ์ง์ฐ ๋ก๋ฉ(LAZY) (0) | 2025.11.12 |
| [JPA] JPA (Java Persistence API) ๋? (2) | 2025.11.07 |
| [Java] ํ๋ฆฌ๋ฏธํฐ๋ธ(Primitive) ํ์ ๊ณผ ๋ ํผ๋ฐ์ค(Reference) ํ์ (0) | 2024.12.07 |
| [Java] ์คํธ๋ฆผ์ filter()๋ก ์ํ๋ ์กฐ๊ฑด์ ๋ฐ์ดํฐ ํํฐ๋งํ๊ธฐ (2) | 2024.09.09 |