CascadeType에 대해

213kky·2024년 9월 20일

프로젝트를 진행하면서 연쇄적으로 데이터를 제거하고 싶어 방법을 찾아 보았다.

대표적으로

cascade = CascadeType.REMOVE,
orphanRemoval = true

두가지가 가장 많이 검색되었다.

간단히 정리하면

CascadeType.REMOVE

부모 엔티티가 삭제되면 자식 엔티티도 삭제된다.
부모가 자식의 삭제 생명 주기를 관리한다.

부모 엔티티와 자식 엔티티 사이의 연관관계를 제거해도 자식 엔티티는 삭제되지 않고 그대로 DB에 남아있다.

orphanRemoval = true

부모 엔티티가 삭제되면 자식 엔티티도 삭제된다.
부모가 자식의 삭제 생명 주기를 관리한다.

여기까지는 같은 기능을 하는 것으로 보인다.

부모 엔티티와 자식 엔티티 사이의 연관관계를 제거하면, 자식 엔티티는 고아 객체로취급되어 DB에서 삭제된다는 부분에서 CascadeType.REMOVE 과 차이가 있다.

정리

CascadeType.REMOVEorphanRemoval = true 옵션은 부모 엔티티가 삭제될 때는 같은 동작을 하지만 부모 엔티티와 자식 엔티티의 관계가 끊어질 때는 다른 동작을 한다.

따라서 부모 엔티티가 자식 엔티티와의 관계를 끊을 때 자식 엔티티가 삭제되길 원한다면 orphanRemoval = true 옵션을 추가하면 된다.


다음 글은 지금 프로젝트에 적용되어있는 CascadeType.REMOVE를 사용하면서 발생하는 쿼리의 수가 불필요하게 많아 이것을 해결 할 방법을 찾아 볼 것 같다.

profile
since 2022

0개의 댓글