본문 바로가기
Back-end/JPA 개념

17. 고아 객체(Orphan)

by devraphy 2022. 4. 13.

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

댓글