Spring Framework/JPA

[JPA] orphanRemoval, CasecaseType.REMOVE

덴마크초코우유 2024. 10. 2. 22:45
반응형

orphanRemoval과 casecade는 @OneToMany에서 삭제 동작을 제어하는 두 가지 옵션이다. orphanRemoval=true, CascadeType.REMOVE 두 옵션 모두 부모-자식 관계에서 자식 엔티티를 삭제하는 설정이지만 차이가 있다.

casecade

casecade는 부모 엔티티의 상태 변화가 자식 엔티티에 전파되도록 설정하는 옵션으로 부모 엔티티가 생성/수정/삭제 될 때 자식 엔티티에도 부모 엔티티를 따라 데이터베이스에 생성/수정/삭제되록 설정한다. 이 옵션에 지정할 수 있는 다양한 CascadeType이 있다.

  • PERSIST: 비영속 상태의 부모 엔티티를 영속상태로 변경할 때 자식 엔티티도 영속 상태로 변경
  • MERGE: 준영속 상태의 부모 엔티티를 영속상태로 변경할 때 자식 엔티티도 준영속 상태로 변경
  • REMOVE: 영속 상태의 부모 엔티티를 삭제 상태로 변경할 때 자식 엔티티까지 삭제 상태로 변경
  • REFRESH: 부모 엔티티를 데이터베이스에서 다시 조회할 때 자식 엔티티도 다시 갱신
  • DETACH: 영속 상태의 부모 엔티티를 준영속 상태로 변경할 때 자식 엔티티도 준영속 상태로 변경
  • ALL: 위 모든 동작 적용

CascadeType.REMOVE를 지정하면 부모 엔티티가 삭제될 때 연관된 자식 엔티티도 함께 삭제된다.

orphanRemoval

orphanRemoval은 고아 객체를 어떻게 처리할지 설정하는 옵션이다. 고아 객체란 부모 엔티티 객체와 연관 관계가 끊어진 자식 엔티티 객체를 말한다. 이 옵션을 true로 설정하면 연관 관계가 끊어진 자식 객체를 데이터베이스에 동기화할 때 삭제한다.

차이점

부모-자식 연관 관계에서 삭제가 수행되기 때문에 혼동이 왔었다. 부모-자식 관점에서 보니 차이점을 명확히 알 수 있었다.

  • cascade는 부모 엔티티의 변경을 자식에게 전파하는 옵션이다. CascadeType.REMOVE을 설정하면 부모 엔티티가 삭제될 때 자식 엔티티도 삭제된다.
  • orphanRemoval은 자식 부모와 자식 간의 관계가 끊어질 때 자식 엔티티를 삭제한다.
반응형