Post

[JPA] 고아객체

πŸ“Œ λ“€μ–΄κ°€λ©°

λΆ€λͺ¨μ™€μ˜ 관계가 λŠμ–΄μ§„ μžμ‹ μ—”ν‹°ν‹°λ₯Ό κ³ μ•„ 객체(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 μŠ€νƒ€μΌ 섀계가 κ°€λŠ₯ν•΄μ§„λ‹€.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.