Spring/JPA

cacscade.REMOVE VS orphanRemoval = true

whyWhale 2023. 2. 26.

What

영속성 컨텍스트는 cacade와 orphanRemoval이라는 옵션을 추가적으로 제공해준다.

  • cascade는 말 그대로 DB의 cascade 전략과 유사하다.
  • orphanRemoval은 고아 객체의 전이에 대한 전략으로서 T/F 두가지의 값을 가지고있다.
    • T로 설정하면 고아 객체는 Delete쿼리가 나가도록 도와준다.

 

cascade.REMOVE와 orphanRemoval=true의 차이

CascadeType.REMOVE

부모 엔티티가 삭제되면 자식 엔티티도 삭제된다. 즉, 부모가 자식의 삭제 생명 주기를 관리한다. 만약 CascadeType.PERSIST도 함께 사용하면, 부모가 자식의 전체 생명 주기를 관리하게 된다.

Q. 부모가 아닌 자식만 떨어뜨린다면 ? 과연 어떻게 될까.

⇒ 아무일도 일어나지 않는다. 즉, REMOVE는 부모가 삭제될 떄 연쇄적으로 자식까지 삭제하는 것일 뿐이다.

orphanRemoval=true

orphanRemoval = true 또한 부모 엔티티가 삭제되면 자식 엔티티도 삭제된다. 따라서 CascadeType.PERSIST 를 함께 사용하면, 이때도 부모가 자식의 전체 생명 주기를 관리하게 된다.

CascadeType.REMOVE와 마찬가지로 부모가 지워지면 그와 관련된 자식들도 영향을 받는 것이 공통점이다.

하지만 다른점이 있는데, Q. 부모가 아닌 자식만 떨어뜨린다면 ? 해당 결과로는 연쇄적으로 삭제된다.

즉 부모가 없어진 자식은 자동으로 Delete쿼리를 지원하도록 하는 옵션이다.

비교 결과

  • (cascade.REMOVE와 orphanRemoval=true) 부모 엔티티를 삭제하면 자식 엔티티도 삭제한다. [공통]
  • 부모 엔티티에서 자식 엔티티 제거 [차이]
  • CascadeType.REMOVE는 자식 엔티티가 그대로 남아있는 반면, orphanRemoval = true는 자식 엔티티를 제거

주의할 점

  • 둘다 부모 엔티티에 삭제를 가하면 연쇄적으로 자식들이 무더기로 사라질 수 있다.
  • JPA의 전이 옵션을 활용하지 않아도 괜찮다고 생각한다. 왜냐하면 코드의 길이가 조금은 늘어나지만 해당 취약점을 보완할 수 있다면 괜찮은 방법이라고 생각한다. 오히려 코드로써 삭제 처리를 하는 것이 가독성이 더 좋을 수도 있을 것이다.

댓글