JPA를 사용하다 보면 복잡한 엔터티 관계를 관리해야 할 때가 많다.
이 때 두 가지 중요한 옵션, CascadeType.REMOVE
와 orphanRemoval=true
를 사용하여 엔터티 간 관계를 더 효율적으로 관리할 수 있다.
이 두 옵션은 비슷해 보일 수 있지만, 서로 다른 시나리오에서 사용되며 서로 다른 기능을 제공한다.
orphanRemoval=true
옵션은 부모 엔터티에서 자식 엔터티의 참조를 제거했을 때, 그리고 부모 엔터티 자체를 삭제했을 때 자식 엔터티를 자동으로 삭제하는 역할을 한다. 즉, "고아 객체 자동 제거" 기능을 구현하는 데 사용된다.
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> children = new ArrayList<>();
이 설정은 다음 두 상황에서 작동한다.
1. 부모 엔터티에서 자식 엔터티의 참조를 제거할 때.
반면 CascadeType.REMOVE
옵션은 부모 엔터티가 삭제될 때 연관된 자식 엔터티들도 함께 삭제하는 역할을 한다.
자식 엔터티의 참조를 단순히 제거하는 것만으로는 자식 엔터티가 삭제되지 않는다.
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private List<Child> children = new ArrayList<>();
이 설정은 부모 엔터티가 삭제되는 상황에서만 작동하며, 참조 제거만으로는 자식 엔터티 삭제를 트리거하지 않는다.
두 옵션을 비교해보면, orphanRemoval=true
옵션이 CascadeType.REMOVE
의 기능을 포함하며 추가적으로 부모 엔터티에서 자식 엔터티 참조를 제거했을 때도 자식 엔터티를 삭제하는 기능을 제공함을 알 수 있다.
따라서, 두 옵션은 서로 보완적이며 특정 상황에 따라 함께 사용되거나 별도로 사용될 수 있다.
예를 들어, orphanRemoval=true
옵션을 사용하면 부모 엔터티 삭제 시 자식 엔터티의 삭제를 자동으로 처리할 수 있으며, 참조를 제거할 때도 자동으로 자식 엔터티를 삭제할 수 있다.
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Child> children = new ArrayList<>();
이렇게 설정하면, 부모 엔터티에서 자식 엔터티 참조를 제거하거나 부모 엔터티 자체를 삭제할 때 모두 자식 엔터티가 삭제되는 것을 보장할 수 있다.