JPAλ₯Ό μ°λ€ 보면
@OneToMany, @ManyToOne κ°μ μ΄λ Έν μ΄μ μ μμ£Ό λ³΄κ² λλ€.
μ΄λ€μ κ΄κ³ν DBμ μΈλ ν€(FK) λ₯Ό κ°μ²΄ μΈκ³μμλ μ°κ΄λ κ°μ²΄λ‘ νννκΈ° μν κ²μ΄λ€.
JPAλ μ§μ SQL JOINμ μμ±νμ§ μκ³ λ,
μ΄λ Έν μ΄μ μΌλ‘ μ°κ΄ κ΄κ³λ₯Ό μ μΈνκ³ ,
μ΄λ₯Ό λ°νμΌλ‘ μλ μ‘°μΈ μΏΌλ¦¬λ₯Ό μμ±νκ±°λ κ°μ²΄ νμμ΄ κ°λ₯νλ€.κ·Έλ°λ° μμ§ν λ§νλ©΄,
μμ§ μ μ΄λ Έν μ΄μ λ€μ μΈμ , μ, μ΄λ»κ² μ¨μΌ νλμ§ μ λͺ¨λ₯΄κ² λ€.
κ·Έμ μμ μμ 보μ΄λ©΄ μ°κ³ , mappedByλ μμΌλ©΄ λ£λ μ λμλ€.
λ¨λ°©ν₯, μλ°©ν₯? κΈ°μ€λ μ λ§€νκ³ ν·κ°λ¦΄ λΏμ΄λ€.
κ·Έλμ μ΄λ²μ
μΈμ°κΈ° μν΄μκ° μλλΌ, μ΄ν΄νκ³ μ€λͺ
ν μ μλλ‘
"JPA μ°κ΄ κ΄κ³ λ§€ν"μ νμ€ν μ 리ν΄λ³΄λ € νλ€.
μ μ : ν μͺ½ μν°ν°λ§ λ€λ₯Έ μν°ν°λ₯Ό μ°Έμ‘°νλ κ΄κ³.
A -> B λ μ°Έμ‘°νμ§λ§, B λ A λ₯Ό λͺ¨λ₯Έλ€.
μ½κ² λΉμ νμλ©΄ λ€μκ³Ό κ°λ€.
μ§μ¬λ νλ€κ³ μκ°νμ. πββοΈβ€οΈ π
ββοΈ
A(λ¨μ)λ B(μ¬μ) λ₯Ό μ’μν΄μ κ³μν΄μ μ³λ€λ³΄μ§λ§,
B(μ¬μ)λ A(λ¨μ)κ° μ’μνλ μ§ μ‘°μ°¨ λͺ¨λ₯Έλ€.
@Entity
public class λ¨μ_ν΄λ μ€ {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "μ¬μ_id")
private μ¬μ_ν΄λ μ€ μ¬μ;
}
@Entity
public class μ¬μ_ν΄λ μ€ {
@Id
@GeneratedValue
private Long id;
private String name;
}
μ μ : λ μν°ν°κ° μλ‘λ₯Ό μ°Έμ‘°νλ κ΄κ³
μ½κ² λΉμ νμλ©΄ λ€μκ³Ό κ°λ€.
μλ‘ μ¬λ νλ€κ³ μκ°νμ. πββοΈβ€οΈ β€οΈπββοΈ
A(λ¨μ)μ B(μ¬μ)λ μλ‘ μ’μνλ μ¬μ΄λ€.
@Entity
public class λ¨μ_ν΄λ μ€ {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "μ¬μ_id")
private μ¬μ_ν΄λ μ€ μ¬μ;
}
@Entity
public class μ¬μ_ν΄λ μ€ {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "μ¬μ") // μλμμ μ€λͺ
μμ
private List<λ¨μ_ν΄λ μ€> λ¨μλ€ = new ArrayList<>();
}
μ κΈμμ μ°λ¦¬λ μ°κ΄κ΄κ³μ λ°©ν₯ λ¨λ°©ν₯κ³Ό μλ°©ν₯ μ λ°°μ λ€.
κ·ΈλΌ μ΄μ , μλ°©ν₯ κ΄κ³μμ κΌ λ°λΌλΆλ κ°λ
μΈ
μ°κ΄κ΄κ³μ μ£ΌμΈμ λλ체 무μμΌκΉ?
μλ°©ν₯ μ°κ΄κ΄κ³μμλ μμͺ½ μν°ν°κ° μλ‘λ₯Ό μ°Έμ‘°νλ―λ‘,
λ μ€ λκ° μΈλ ν€λ₯Ό κ΄λ¦¬ν μ§ λͺ νν μ§μ νμ§ μμΌλ©΄
λΆνμν 쿼리, μ€λ³΅ λ°μ΄ν°, μν λΆμΌμΉ λ¬Έμ κ° λ°μνλ€.κ·Έλμ JPAλ λκ° μΈλ ν€μ μ£ΌμΈμΈμ§ λ°λμ μ§μ ν΄μΌ νκ³ ,
μ΄ μν μ μ°κ΄κ΄κ³μ μ£ΌμΈ λΌκ³ λΆλ₯Έλ€.
λΉμ λ₯Ό ν΄λ³΄μ.
κ³ λ°±ν μ¬λ : μ² μ
κ³ λ°±λ°μ μ¬λ : μν¬
μ΄ λμ μΈβ
κ·Έλ¨μ μλ‘ μ²μ μ¬κ·λ λ μ μ¬λ¦¬μκ³ μ νμλ€.
μ² μλ 2025/05/19 μΌμ μ¬κ·λ€κ³ μ¬λ Έκ³ ,
μν¬λ 2025/05/22 μΌμ μ¬κ·μλ€κ³ μ¬λ Έλ€.
μμμ μ² μμ μν¬κ° μλ‘ λ€λ₯Έ λ μ μ¬κ·λ€κ³ λ§νμλ€.
κ·ΈλΌ μ΄κ±Έ 보λ μ¬λλ€μ λꡬμ λ§μ λ―Ώμ΄μΌ ν κΉ?
- λ¨Όμ κ³ λ°±ν μ² μμ λ§?
- λ§μμ μ€λΉλ₯Ό λ€ νκ³ λ°μμ€ μν¬μ λ§?
μ¬μ€ μ΄ λ¬Έμ λ λκ° λ§λλ보λ€λ,
λμ΄ κΈ°λ μΌ κ°μ§κ³ μΈμ°κ² λλ κ² λ ν° λ¬Έμ λ€. ( λ μ¬μ΄μ λ―Έλ¬ν κ· μ΄μ΄ μκΈ°κ² μ§ )
μ΄κ±Έ λ°©μ§νκΈ° μν΄μ JPAλ μ΄λ κ² μ νλ€.
1. μ°μ μνλ μ£ΌμΈ(μ² μ)κ° μ¬λ¦°λ€.
2. λΉμ£ΌμΈ(μν¬)λ κ·Έκ±Έ 곡μ λ§ νλ€.
μ² μ = μ°κ΄κ΄κ³ μ£ΌμΈ (μ€μ λ‘ μΈλ ν€λ₯Ό DBμ μ μ₯νλ€)
@ManyToOne
@JoinColumn(name = "μ¬μ_id")
private μ¬μ_ν΄λ μ€ μ¬μ;
====================================
μν¬ = μ°κ΄κ΄κ³ λΉμ£ΌμΈ (κ·Έλ₯ μ°Έμ‘°λ§ νλ€.)
@OneToMany(mappedBy = "μ¬μ") // <μ£ΌμΈ> νλλͺ
μ§μ
private List<λ¨μ_ν΄λ μ€> λ¨μλ€;
μ½κ² λΉμ ν΄λ³΄μ.
λ§μ λ¨μλ€μ΄ ν λͺ
μ μ¬μμκ² κ³ λ°±νλ μν©
πββοΈπββοΈπββοΈπββοΈβ€οΈ π
ββοΈ
@Entity
public class λ¨μ {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "μ¬μ_id") // μΈλ ν€λ λ¨μ μͺ½μ
private μ¬μ μν¬;
}
μ₯μ
- μΈλ ν€λ₯Ό κ°μ§ μͺ½μ΄ μ£ΌμΈμ΄ λλ―λ‘ κ΄λ¦¬κ° μ½λ€.
βλ μμ§ μ’μν΄μ!β μ² μ.setμ¬μ("μμ§") λ§ νλ©΄ DB μ μ μ₯λκΈ° λλ¬Έμ΄λ€.- DB μ€κ³ κ΄μ μμλ μμ°μ€λ½λ€.
μ¬μμͺ½μ μ¬λ¬ λ¨μλ λ£λ κ² λ³΄λ€λ... λ¨μ μͺ½μ ν μ¬μλ§ λ£λ κ² λ«μ§ μλ.- μ±λ₯ μ΅μ νκ° μμνλ€.
μ΄κ±΄ μ΄νμ λμ¬ fetch μ λ΅μ΄ νμνλ€.
μ½κ² λΉμ ν΄λ³΄μ.
ν λͺ
μ μ¬μλ₯Ό μ¬λ¬ λ¨μλ€μ΄ μ’μνλ 건 ννμ§λ§,
κ·Έ λ°λ! μ¬μκ° μκΈ°λ₯Ό μ’μνλ μ¬λλ€ λͺ©λ‘μ κ΄λ¦¬νλ μν©μ΄λΌκ³ μκ°ν΄λ³΄μ.
π
ββοΈ β€οΈ πββοΈπββοΈπββοΈπββοΈ
@Entity
public class λ¨μ_ν΄λ μ€ {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "μ¬μ_id") // μΈλ ν€λ μ¬μ ν λ¨μ μͺ½μ
private μ¬μ_ν΄λ μ€ μ¬μ;
}
@Entity
public class μ¬μ_ν΄λ μ€ {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "μ¬μ") // 'κ³ λ°± λ°μ μ¬λ' μ
μ₯μμ 리μ€νΈ κ΄λ¦¬
private List<λ¨μ_ν΄λ μ€> λ¨μλ€ = new ArrayList<>();
}
μ μ
@ManyToOne(fetch = FetchType.LAZY)
μ°κ΄λ μν°ν°λ₯Ό μΈμ λΆλ¬μ¬μ§ μ νλ μ λ΅
"μκ°ν λμ€μλ§μ μμ리μ μΉκ΅¬λ κ°μ΄ μμ μμ"
βμΉκ΅¬κ° νμν κ² κ°μμ 미리 λ°λ €μλλ°,
λ§μ λνν λ μΉκ΅¬ μκΈ° νλλ μ λμ¨λ€λ©΄?
β μ.. κ΄ν λ°λ €μλ€. ( λμ€μ μΉκ΅¬μκ² λ°₯ μ¬μ€μΌ ν¨ )β
"μΉκ΅¬ μκΈ°λ λμ€μ νμν λ μΉ΄ν‘μΌλ‘ λ¬Όμ΄λ³΄λ λλ"
μΉκ΅¬κ° νμνλ©΄ κ·Έλ κ°μ μ ννλ λ°©μ
μ μ
λΆλͺ¨κ° μ΄λ€ νλμ νλ©΄
κ·Έ μμλ κ°μ΄ λ°λΌκ°κ² νλ μ€μ
"μλ§κ° λ§νΈ κ°λ©΄, μμ΄λ κ°μ΄ λ°λΌκ°λ€."
μλ§κ° μ μ₯λλ©΄ - μμ΄λ κ°μ΄ μ μ₯λ¨
μλ§κ° μμ λλ©΄ - μμ΄λ κ°μ΄ μμ λ¨
μλ§κ° μμ λλ©΄ - μμ΄λ κ°μ΄ κ°±μ λ¨
μ¦, λΆλͺ¨κ° νλνλ©΄ JPAκ° μμλ μλμΌλ‘ μ²λ¦¬ν΄μ€λ€.
"μλ§κ° μμ΄λ₯Ό λ²λ¦¬λ©΄... μμ΄λ κ³ μκ° λλ©°, κ·Έλ¦¬κ³ ... "
OrphanRemoval - κ³ μλ©΄ μμ ν΄λΌ ( λ§μ΄ μ’ μμ§λ§, μ΄λ κ² μκ°νλ κ² μ’λ€. )

λΆλͺ¨μ μ°κ²°μ΄ λκΈ΄λ€λ©΄ μμμ μλμΌλ‘ μμ€ν μ΄ μμ νλ€.