HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
[JPA] - cacscade 속성 remove VS orphanRemoval 비교

[JPA] - cacscade 속성 remove VS orphanRemoval 비교

progress
Done
Tags
Spring
Build UpWhat REFER

Build Up


  • JPA는 자바 표준 ORM 라이브러리로 객체와 테이블간 매핑을 손쉽게 핸들링 할 수 있게 해준다.
  • JPA를 사용하면 쉽게 데이터들을 애플리케이션 코드로 쉽게 다를 수 있지만 내부적으로 영속성 컨텍스트라는 콤포논트를 기반으로 동작하기 때문에 해당 점을 망각해서는 안된다

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의 전이 옵션을 활용하지 않으면 코드의 길이가 조금은 늘어나지만 해당 취약점을 보완할 수 있다면 괜찮은 방법이라고 생각한다.오히려 코드로써 삭제 처리를 하는 것이 가독성이 더 좋을 수도 있을 것이다.
 
 

 REFER


JPA CascadeType.REMOVE vs orphanRemoval = true
JPA를 공부하다 보면 바로 이해하기 쉽지 않은 개념들을 몇 개 마주친다. 필자는 연관관계 매핑, 영속성 전이, 고아 객체 등이 특히 어려웠다. 이때 와 가 유독 헷갈렸는데, 직접 학습 테스트를 작성하며 이해했다. 이번 글에서는 영속성 전이(REMOVE)와 고아 객체를 학습 테스트를 통해 비교하여 살펴본다. 최종적으로 독자들이 둘의 차이를 이해하는 것을 목표로 한다.
https://tecoble.techcourse.co.kr/post/2021-08-15-jpa-cascadetype-remove-vs-orphanremoval-true/
JPA CascadeType.REMOVE vs orphanRemoval = true