π λ€μ΄κ°λ©°
λΆλͺ¨μμ κ΄κ³κ° λμ΄μ§ μμ μν°ν°λ₯Ό κ³ μ κ°μ²΄(orphan)λΌ νλ€. JPAλ μ΄ κ³ μ κ°μ²΄λ₯Ό μλμΌλ‘ DBμμ μμ νλ κΈ°λ₯μ μ 곡νλ€.
κ³ μ κ°μ²΄: λΆλͺ¨ μν°ν°μ κ΄κ³κ° λμ΄μ§ μμ μν°ν°.
1. orphanRemoval
1
2
| @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
|
orphanRemoval = trueλ₯Ό μ£Όλ©΄, 컬λ μ
μμ μμμ μ κ±°νλ©΄ DBμμλ DELETEλλ€.
1
2
| Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChildList().remove(0); // 컬λ μ
μμ μ κ±°
|
1
2
| -- μλμΌλ‘ delete!
delete from Child where id=?
|
2. β οΈ μ£Όμμ¬ν
β οΈ μ°Έμ‘°κ° λμ΄μ§ κ²μ μμ DBμμ μ§μλ²λ¦¬λ―λ‘ λ§€μ° μ‘°μ¬ν΄μΌ νλ€.
| κ·μΉ | μ€λͺ
|
|---|
| λ¨μΌ μ°Έμ‘°μΌ λλ§ | μμμ μ°Έμ‘°νλ κ³³μ΄ νλμΌ λ μ¬μ© |
| λΆλͺ¨ μ κ±° = μμ μ κ±° | λΆλͺ¨λ₯Ό μ§μ°λ©΄ μμλ μμ (CascadeType.REMOVEμ κ°μ ν¨κ³Ό) |
| μ μ© λμ | @OneToOne, @OneToManyμμλ§ κ°λ₯ |
1
| findParent.getChildList().clear(); // μ 체 μ κ±° β λͺ¨λ μμ delete
|
3. Cascade.ALL + orphanRemoval = μλͺ
μ£ΌκΈ° μμ
π‘ CascadeType.ALL + orphanRemoval = trueλ₯Ό ν¨κ» μ°λ©΄, μμ κ°μ²΄μ μλͺ
μ£ΌκΈ°λ₯Ό λΆλͺ¨κ° μμ ν κ΄λ¦¬νκ² λλ€. λΆλͺ¨λ₯Ό ν΅ν΄ μμμ μμ±Β·μμ ν μ μμ΄, λλ©μΈ μ£Όλ μ€κ³(DDD) ꡬνμ μ μ©νλ€.
1
2
3
| CascadeType.ALL ββ
βββΊ μμμ μλͺ
μ£ΌκΈ°λ₯Ό λΆλͺ¨κ° κ΄λ¦¬ (DDD)
orphanRemoval=true β
|
π μ 리
1
2
3
4
5
| κ³ μ κ°μ²΄(orphanRemoval)
ββ μ μ λΆλͺ¨μ κ΄κ³ λκΈ΄ μμ
ββ λμ 컬λ μ
μμ μ κ±° β DB DELETE
ββ μ£Όμ λ¨μΌ μ°Έμ‘°μΌ λλ§! λΆλͺ¨ μ κ±°=μμ μ κ±°
ββ μ‘°ν© Cascade.ALL + orphanRemoval β μλͺ
μ£ΌκΈ° μμ(DDD)
|
| κ°λ
| ν μ€ μ μ |
|---|
| κ³ μ κ°μ²΄ | λΆλͺ¨ μ°Έμ‘°κ° λκΈ΄ μμ |
| orphanRemoval | μ°Έμ‘° λκΈ°λ©΄ μλ μμ |
| μλͺ
μ£ΌκΈ° μμ | λΆλͺ¨κ° μμμ μμ±Β·μμ κ΄λ¦¬ |
orphanRemovalμ κ°λ ₯νμ§λ§ μννλ€. μμμ΄ μ€μ§ ν λΆλͺ¨μκ²λ§ μν λ μ¨μΌ νλ©°, Cascade.ALLκ³Ό κ²°ν©νλ©΄ λΆλͺ¨κ° μμμ μλͺ
μ£ΌκΈ°λ₯Ό μ¨μ ν μ±
μμ§λ DDD μ€νμΌ μ€κ³κ° κ°λ₯ν΄μ§λ€.
Comments powered by Disqus.