Home
>
Spring
>
π[Spring] JPA μ°κ΄κ΄κ³μ λν μΆκ°μ μΈ κΈ°λ₯λ€μλ 무μμ΄ μμκΉμ? - `@OneToMany`
Spring
Framework
π[Spring] JPA μ°κ΄κ΄κ³μ λν μΆκ°μ μΈ κΈ°λ₯λ€μλ 무μμ΄ μμκΉμ? - @OneToMany
-
@OneToMany
λ 1:N(μΌλλ€) κ΄κ³λ₯Ό λνλ΄λ μ΄λ
Έν
μ΄μ
μ
λλ€.
- μ΄λ ν κ°μ μν°ν°κ° μ¬λ¬ κ°μ μν°ν°μ κ΄κ³λ₯Ό λ§Ίλ μν©μμ μ¬μ©λ©λλ€.
- μλ₯Ό λ€μ΄, νλμ ν(Team)μ΄ μ¬λ¬ λͺ
μ νμ(User)κ³Ό κ΄κ³λ₯Ό λ§Ίλ κ²½μ°
@OneToMany
λ₯Ό μ¬μ©νμ¬ ννν μ μμ΅λλ€.
1οΈβ£ @OneToMany
μ΄λ
Έν
μ΄μ
κΈ°λ³Έ κ°λ
.
-
μΌλλ€ κ΄κ³μμ 1(One) μͺ½μ΄ λ€μ(N) μͺ½μ μ°Έμ‘°ν λ
@OneToMany
μ΄λ
Έν
μ΄μ
μ μ¬μ©ν©λλ€.
-
λ³΄ν΅ λ€μ(N) μͺ½μ΄ μΈλ ν€λ₯Ό κ°μ§κ³ μμ΄ μΌλλ€ κ΄κ³μμ λ€μ μͺ½μ΄ κ΄κ³μ μ£ΌμΈμ΄ λ©λλ€.
-
@OneToMany
μ΄λ
Έν
μ΄μ
μ mappedBy μμ±κ³Ό ν¨κ» μ¬μ©νμ¬ μ£ΌμΈμ΄ μλμ λͺ
μνκ³ , κ΄κ³λ₯Ό μ½κΈ° μ μ©μΌλ‘ μ€μ ν©λλ€.
π μμ: ν(Team)κ³Ό νμ(User) κ°μ 1:N κ΄κ³
- ν(Team) μν°ν°μ νμ(User) μν°ν°κ° 1:N κ΄κ³λ₯Ό κ°μ§ λ, Team μν°ν°μμ μ¬λ¬ User μν°ν°λ₯Ό μ°Έμ‘°νλλ‘ μ€μ ν μ μμ΅λλ€.
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "team") // Teamμ΄ μ°κ΄κ΄μμ μ£ΌμΈμ΄ μλμ λͺ
μ
private List<User> users = new ArrayList<>();
// getter, setter
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne // λ€λμΌ κ΄κ³μμ Userκ° μ°κ΄κ΄κ³μ μ£ΌμΈ
@JoinColumn(name = "team_id") // μΈλ ν€ μ»¬λΌ μ§μ
private Team team;
// getter, setter
}
π μ½λ μ€λͺ
- Team μν°ν°λ
@OneToMany(mappedBy = "team")
μ μ¬μ©νμ¬ Userμμ κ΄κ³μμ μ£ΌμΈμ΄ μλμ λͺ
μν©λλ€.
- mappedBy μμ±μ κ° βteamβμ User μν°ν°μ team νλλ₯Ό κ°λ¦¬ν΅λλ€.
- User μν°ν°λ
@ManyToOne
κ³Ό @JoinColumn(name = "team_id")
μ μ¬μ©νμ¬ μλ ν€ team_id 컬λΌμ μμ±νλ©°, κ΄κ³μ μ£ΌμΈμ΄ λ©λλ€.
2οΈβ£ λ¨λ°©ν₯κ³Ό μλ°©ν₯ @OneToMany
1οΈβ£ λ¨λ°©ν₯ @OneToMany
-
@OneToMany
λ₯Ό μ¬μ©νμ¬ λ¨λ°©ν₯μΌλ‘ κ΄κ³λ₯Ό μ€μ ν μλ μμ΅λλ€.
- νμ§λ§ λ°μ΄ν°λ² μ΄μ€μ μΆκ°μ μΈ μ‘°μΈ ν
μ΄λΈμ΄ μμ±λλ―λ‘, λ³΄ν΅ μ±λ₯μμ μ΄μ λ‘ λ§μ΄ μ¬μ©νμ§ μμ΅λλ€.
2οΈβ£ μλ°©ν₯ @OneToMany
-
@OneToMany
μ @ManyToOne
μ ν¨κ» μ¬μ©νμ¬ μλ°©ν₯μΌλ‘ μ€μ ν μ μμ΅λλ€.
- μ΄ κ²½μ°
@ManyToOne
μͺ½μ΄ μΈλ ν€λ₯Ό κ°μ§λ―λ‘ μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ λ©λλ€.
3οΈβ£ @OneToMany
μ¬μ© μ μ£Όμμ¬ν.
1οΈβ£ μ§μ° λ‘λ©(Lazy Loading)
-
@OneToMany
μ κΈ°λ³Έ λ‘λ© μ λ΅μ μ§μ° λ‘λ©μ
λλ€.
- μ¦, μν°ν°λ₯Ό μ‘°νν λλ μ¦μ λ‘λ©νμ§ μκ³ , μ€μ λ‘ μ κ·Όν λ λ°μ΄ν°λ₯Ό λ‘λνμ¬ μ±λ₯μ μ΅μ νν©λλ€.
2οΈβ£ Cascade μ΅μ
μ¬μ©.
- CascadeType.ALL μ΄λ CascadeType.REMOVE λ±μ μ΅μ
μ μ¬μ©νλ©΄, λΆλͺ¨ μν°ν°λ₯Ό μ μ₯νκ±°λ μμ ν λ μμ μν°ν°λ ν¨κ» μ μ₯/μμ λ©λλ€.
- μ£Όμν΄μ μ¬μ©ν΄μΌ νλ©°, λΆνμνκ² μμ μν°ν°κ° μμ λμ§ μλλ‘ ν©λλ€.
3οΈβ£ N+1 λ¬Έμ .
-
@OneToMany
λ λ€μμ μμ μν°ν°λ₯Ό κ°μ Έμ¬ λ N+1 λ¬Έμ κ° λ°μν μ μμΌλ―λ‘, νμν κ²½μ° νμΉ μ‘°μΈ(fetch join)μ μ¬μ©ν΄ ν΄κ²°ν΄μΌ ν©λλ€.
π μμ μν©.
-
ν(Team)κ³Ό νμ(User) : ν νμ μ¬λ¬ λͺ
μ νμμ΄ μμλ μ μμ.
-
μ£Όλ¬Έ(Order)κ³Ό μν(Item) : ν μ£Όλ¬Έμ μ¬λ¬ μνμ΄ ν¬ν¨λ μ μμ.
4οΈβ£ μμ½.
-
@OneToMany
λ 1:N κ΄κ³λ₯Ό νννλ©°, λ³΄ν΅ mappedBy μμ±μ μ¬μ©νμ¬ μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ μλμ λͺ
μν©λλ€.
- μ΄ μ΄λ
Έν
μ΄μ
μ ν΅ν΄ λΆλͺ¨-μμ κ΄κ³λ₯Ό μ€μ νμ¬ νΈλ¦¬νκ² λ€μμ μν°ν°λ₯Ό κ΄λ¦¬ν μ μμ§λ§, μ±λ₯ λ° λ°μ΄ν° μΌκ΄μ±μ μ μ§νκΈ° μν΄ λ‘λ© μ λ΅κ³Ό Cascade μ΅μ
μ μ£Όμν΄μ μ€μ ν΄μΌ ν©λλ€.