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의 전이 옵션을 활용하지 않아도 괜찮다고 생각한다. 왜냐하면 코드의 길이가 조금은 늘어나지만 해당 취약점을 보완할 수 있다면 괜찮은 방법이라고 생각한다. 오히려 코드로써 삭제 처리를 하는 것이 가독성이 더 좋을 수도 있을 것이다.
'Spring > JPA' 카테고리의 다른 글
따로 따로 조회했을 때 연관관계가 있는 객체를 자동으로 로드해주나? (0) | 2023.03.21 |
---|---|
Repository 작명 이슈 (mapping.PropertyReferenceException) (0) | 2023.02.15 |
EntityManger.persist()를 하고 ID값을 반환하는 과정 (0) | 2021.07.02 |
JPA (0) | 2021.05.10 |
6. 다양한 연관 관계 매핑_7.고급매핑_8. 프록시와 연관관계 (0) | 2021.01.27 |
댓글