[JPA] CascadeType.Remove와 orphanRemoval=true 비교

조성우·2024년 4월 25일

JPA - 공부

목록 보기
11/16
post-thumbnail

CascadeType.Remove: 부모 엔티티를 삭제하면 자식 엔티티까지 삭제
orphanRemoval=true: 부모 엔티티와 연관관계가 끊어진 자식 엔티티(고아 객체)를 자동으로 삭제


아래에 부모 엔티티에서 자식 엔티티와의 연관관계를 제거하는 예시를 살펴보자
(User 1 - * Review * - 1 Restaurant 관계를 가정)

// Review (자식) - Restaurant (부모)
public void removeReviews(Long userId, Long restaurantId) {
    Review review = reviewRepository.findByUserIdAndRestaurantId(userId, restaurantId).orElseThrow();
    Restaurant restaurant = restaurantRepository.findById(restaurantId).orElseThrow();
    restaurant.removeReview(review);
}

restaurant.removeReview(review)를 실행하면 연관관계가 끊어지게 되는데, CascadeType.REMOVE 옵션은 논리적으로 참조를 변경시켜서 무결성 오류를 안 나게 할 뿐, 데이터는 남게 됨

review는 부모 객체인 restaurant과의 연관관계가 끊어지고 고아 객체가 되는데, 해당 고아 객체를 자동으로 삭제해 주는 옵션이 바로 orphanRemoval=true


정리

부모 엔티티를 삭제한 경우 자식 엔티티도 삭제되는 것은 CascadeType.REMOVEorphanRemoval=true 동일하게 작동함

하지만 부모 엔티티에서 자식 엔티티를 제거하면 차이가 발생

CascadeType.REMOVE만 사용했을 경우에는 부모 객체가 삭제되어도 자식 객체가 그대로 남아있는 반면, orphanRemoval=true 옵션은 부모 엔티티와 자식 엔티티의 연관관계가 끊어졌을 경우, 자식 엔티티를 모두 제거해줌

부모 엔티티와 자식 엔티티 사이의 연관관계 변경된 경우, 두 옵션 모두
자식 엔티티가 DB에 삭제되지 않고 남아있으며, 외래키 값만 변경됨

0개의 댓글