영속성 전이(CASCADE)와 고아 객체
📌 영속성 전파의 필요성
위와 같은 관계에서 연관 관계의 주인은 Child이고, Child를 단독으로 사용하는 Parent 엔티티를 부모 엔티티로 간주한다.
여기서 다음 코드를 수행하면 몇 번의 저장이 발생할까
이렇게 총 3번의 저장이 발생한다. 그런데 Parent는 여러 Child를 단독으로 사용한다. 그렇다면 Parent에서 특정 작업을 했을 때,
모든 Child에 영향을 주는 방법이 없을까? 그래서 등장한 것이 영속성 전이다.
📌 영속성 전이(CASCADE)
특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속 상태로 만들고자 할 때 사용한다. 여기서 영속 상태로 만든다는 것은 저장, 삭제, 병합 등을
수행한다는 것이고, 이러한 작업은 영속 상태일 때 가능하다. 결국 영속성 전이는 부모 엔티티가 영속화할 때, 자식 엔티티에 동일한 영향을 준다는 의미다.
부모 엔티티는 자식 엔티티를 단독으로 사용하는 엔티티를 말한다.
🔎 사용 방법
위와 같이 설정하고 Parent를 저장하면 아래처럼 두 개의 Child가 함께 저장된다.
🔎 주의 사항
- 연관 관계 매핑하는 것과 아무런 관계가 없다.
- 영속화를 전파하는 편리함을 제공할 뿐이다.
- 자신을 단독으로 사용하는 부모 엔티티가 있어야 한다.
- 다른 엔티티와 추가로 연관 관계가 있으면 사용할 수 없다.
- 두 엔티티의 Life Cycle이 거의 유사할 때 사용 가능
- CRUD 작업을 할 때가 거의 비슷하게 가는 경우
🔎 CASCADE 종료
주로 ALL과 PERSIST 사용
📌 고아 객체
부모 객체와 연관 관계가 끊어진 자식 객체를 고아 객체라 한다.
예를 들어, 단독으로 사용하는 부모 객체가 있을 때, 컬렉션에서 빠진 자식 객체는 더 이상 참조하는 곳이 없다. 이때, 해당 객체를 고아 객체로 보고 자동으로 삭제한다.
🔎 사용 방법
위와 같이 설정하면 List에서 빠진 Child는 자동 삭제된다.
🔎 주의 사항
- 부모 엔티티가 자신을 단독으로 사용할 때 사용해야 한다.
- 특정 엔티티가 개인 소유
- @OneToMany 또는 @OneToOne만 가능
- 해당 기능은 CascadeType.REMOVE처럼 동작하지만 차이점이 있다.
- CascadeType.REMOVE ➡ 연쇄 삭제
- orphanRemoval = true ➡ 연쇄 삭제 + Collection에서 빠진 요소를 자동 삭제 (2가지 상황에 대해 자동 삭제)
🔎 CascadeType.ALL + orphanRemoval = true 조합
N(다)에 해당하는 Entity는 1에 해당하는 Entity와 라이프 사이클을 완전히 함께 하게 된다. 즉, 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다.
그래서 자식 엔티티는 repository가 필요 없다.
Reference:
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard