JPA에서는 CascadeType은 연관관계된 객체간의 변화에 따라서 별도의 쿼리나 작업 없이도, 엔티티를 생성, 삭제, 변화등을 할 수 있는 기능이다.
CascadeType의 옵션은 6가지 이다.
- CascadeType.ALL : 아래의 5가지를 모두 적용
- CascadeType.PERSIST : 부모 엔티티에서 자식객체를 저장하면 자식 엔티티도 자동으로 DB에 저장된다.
- CascadeType.REMOVE: 부모 엔티티를 삭제하면 DB에서 부모 엔티티 뿐만아니라 자식 엔티티도 삭제된다.
- CascadeType.MERGE: 부모 엔티티와 자식 엔티티를 합친다.
- CascadeType.DETACH: 부모 엔티티와 자식 엔티티를 분리한다.
- CascadeType.REFRESH: 부모 엔티티를 새로고침한 경우, 자식 엔티티도 새로고침을 한다.
위 옵션 중 자주쓰이는 것은 3가지 이다.
ALL, PERSIST, REMOVE
All은 모든 옵션을 포함하는 것이니 상세 설명은 패스하고
PERSIST와 REMOVE 두가지를 다뤄 보겠다.. !
Persist
사실 PERSIST는 이해가 잘 되지 않았다.
왜냐하면, 별도로 Entity를 생성하고 연관관계 매핑까지 지어주었는데, 왜 해당 옵션이 필요할까? 라는 생각이 들었다.
하지만, 이 생각은 해당 예시를 보고 이해를 하게 되었다.
예를들어 주문과 상품이라는 다대다 연관관계 매핑을 지어야 한다고 가정해보자.
Java의 객체간에는 다대다 매핑이 가능하지만, DB에서는 다대다 연관관계 매핑이 불가능 하다.
그렇기 때문에 중간에 두 주문과 상품을 이어줄 새로운 Entity가 필요하다.
그렇다면 연관관계는 Order -> OrderItem <- Item이라는 엔티티를 설계 했다고 가정해보자.
만약, 주문이 들어오면 OrderItem이라는 Order정보와 Item정보를 가진 객체가 생성되어야 한다.
이과정에서, PERISTS 옵션을 쓰지 않으면 OrderItem 객체를 생성하고 Service와 Repository를 이용해서 DB에 저장하는 쿼리를 보내는 로직을 만든다는 것은 매우 비효율 적이다.
그래서, 이와 같은 상황에서는 연관된 Entity가 생기는 경우에 자동으로 연관되어진 객체를 생성하는 편리함이 있다.
Remove
이것은 매우 이해하기 쉽다.
가령 예를 들어서, 게시글과 댓글의 관계를 생각해보자.
만약 게시글이 삭제된다면, 해당 게시글에 적힌 댓글은 어떻게 될까?
당연히 해당 게시글에 대한 댓글은 삭제되어야 한다.
게시글이 삭제된 시점부터는 해당 댓글이 의미가 없어지기 때문이다.
따라서, 별도의 연관관계된 엔티티를 삭제하는 로직을 만들 필요없이 간단하게 REMOVE를 이용하면 편리하다.