Cascade의 사전적 정의는 "계단 폭포", "폭포처럼 흐르다."
계단식의 연쇄 반응을 말하기도 한다.
JPA Cascade
Cascade는 엔티티 간의 연결을 통해 엔티티의 상태를 자동으로 전파하는 기능이다. 부모 엔티티가 변경되면 변경 내용이 자식 엔티티에도 적용된다.
Cascade Type
PERSIST
CascadeTyep.PERSIST를 사용하면, persist 작업이 부모 엔티티에서 자식 엔티티로 전파된다.
MERGE
merge 작업은 준영속 상태의 엔티티를 영속성 컨텍스트에 다시 병합하는 작업이다. 즉, 영속 상태로 변경하는 작업이다.
CascadeTyep.MERGE를 사용하면, merge 작업이 부모 엔티티에서 자식 엔티티로 전파된다.
REMOVE
CascadeTyep.REMOVE를 사용하면, remove 작업이 부모 엔티티에서 자식 엔티티로 전파된다.
REFREST
refresh 작업은 DB에서 엔티티의 상태를 다시 로드하는 작업이다. 쉽게 말하면, DB에서 읽어온 값으로 엔티티의 상태를 덮어쓰는 것이다. (동기화)
CascadeTyep.REFRESH를 사용하면, 부모 엔티티가 refresh 될 때, 자식 엔티티도 refresh 작업이 일어난다.
DETACH
CascadeTyep.DETACH를 사용하면, 부모 자식과 마찬가지로 자식 엔티티도 영속성 컨텍스트에서 제거된다.
ALL
CascadeTyep.ALL를 사용하면, 위에서 살펴본 PERSIST, MERGE, REMOVE, DETACH 모든 작업이 적용된다.
결론
Cascade를 사용하여 부모 엔티티에서 하위 엔티티로의 연쇄 작업에 대해서 코드를 간소화할 수 있다.
하지만 Cascade를 제대로 사용하지 못하면 의도하지 않은 결과를 초래할 수도 있기 때문에 주의해서 사용해야 한다. 예를 들어 delete 작업에 대해 자식 엔티티에서 부모 엔티티로 전파한다면 고아 객체가 생길 수 있다. 이 밖에도 개발자가 예상하지 못하는 결과가 발생하는 경우들이 있다.
따라서 JPA Cascade를 사용할 때는 Cascade에 대한 이해가 충분하고 부모 - 자식 구조가 명확할 때 사용해야 한다고 생각한다.
+ 데브코스에서 진행하는 최종 프로젝트에 게시판 기능이 있는데 이때 게시글-댓글-대댓글 구현에서 Cascade를 사용할 예정이다. 지금은 간단하게 Cascade 개념에 대해서만 알아보았지만, 그때는 직접 Cascade를 사용하면서 Cascade가 어떤 것인지 제대로 이해해보면 좋을 것 같다!
Reference
- https://www.baeldung.com/jpa-cascade-types
- https://www.geeksforgeeks.org/hibernate-different-cascade-types/
- https://tecoble.techcourse.co.kr/post/2023-08-14-JPA-Cascade/