0. 개요
- 이번 포스팅에서는 고아 객체란 무엇인지 알아보자.
1. 고아 객체(Orphan)
a) 개념
- 고아 객체는 부모 객체와 연관 관계가 끊어진 자식 객체를 의미한다.
b) orphanRemoval 옵션
- JPA는 자식 객체가 고아 객체의 상태가 되면 해당 객체를 자동으로 삭제하는 기능을 가진다.
- 이는 다음 사진처럼 옵션으로 설정이 가능하다.
- 위의 코드는 childList에서 삭제된 객체를 연관 관계가 끊긴 것으로 판단하여 객체 자체를 삭제한다.
- 옵션을 설정한 후, 다음과 같은 코드를 실행해보자.
- 위의 코드를 실행하면 다음과 같아 DELETE 쿼리가 자동으로 발생하는 것을 확인할 수 있다.
- 다음 사진과 같이, 연관 관계가 끊긴 자식 객체가 DB에서 삭제된 것을 확인할 수 있다.
c) orphanRemoval 적용 조건
- orphanRemoval 기능은 자식 객체가 단일 참조되는 경우에만 사용하는 것을 권장한다.
- 즉, 하위 객체가 단일 상위 객체(= 단일 부모)에 의해 관리되는 경우만 해당된다.
- 즉, 자식 객체가 참조되는 곳이 하나일 때만 사용한다.
- 즉, Cascade 옵션을 사용할 수 있다면 orphanRemoval 옵션도 사용할 수 있다.
- 즉, orphanRemoval은 CascadeType.REMOVE와 동일하게 동작한다고 볼 수 있다.
2. Cascade + orphanRemoval
- 다음과 같이 Cascade와 orphanRemoval 옵션을 모두 적용한다면 어떤 의미가 있을까?
- 스스로 생명주기를 관리할 수 있는 객체는 em.persist() 또는 em.remove()를 사용하여 영속성 상태를 관리할 수 있다.
- Cascade와 orphanRemoval을 사용하는 방식은 부모 객체(= 상위 객체)를 통해서만 영속성 상태가 관리된다.
- 즉, 부모 객체를 통해서 자식 객체의 생명주기를 관리하는 방식을 사용하는 것이다.
- 이처럼 부모 객체를 통한 자식 객체의 영속성 상태를 관리하는 방식은 DDD(Domain Driven Development)에서
Aggregate Root 개념을 구현할 때 유용하게 사용된다.
'Back-end > JPA 개념' 카테고리의 다른 글
19. 값 타입(2) - 문제점과 불변 객체 (0) | 2022.04.15 |
---|---|
18. 값 타입(1) - 개념 (0) | 2022.04.14 |
16. 영속성 전이(Cascade) (0) | 2022.04.12 |
15. 지연 로딩 & 즉시 로딩(N + 1 문제) (0) | 2022.04.11 |
14. 프록시(Proxy) (0) | 2022.04.08 |
댓글