반응형
1. CasCade란?
- 엔티티의 상태 변화를 전파시키는 옵션이다. 간단히 이야기하면 특정 엔티티를 변화시킬때 그에 따라 연관된 엔티티도 같이 상태가 변한다는 의미이다.
2. CasCade Type?
- 총 6가지의 Type을 가지며 각각에 대한 설명은 다음과 같습니다.
- CascadeType.All : 상위 엔티티에서 하위 엔티티로 모든 작업을 전파
- CascadeType.PERSIST : 엔티티를 영속화할 때, 연관된 엔티티도 영속화
- CascadeType.MERGE : 엔티티 상태를 병합 시 연관된 엔티티도 모두 병합
- CascadeType.REMOVE : 엔티티를 제거 시 연관된 엔티티도 모두 제거
- CascadeType.DETACH : 엔티티를 준영속화 할때, 연관된 엔티티도 모두 준영속화
- CascadeType.REFRESH : 상위 엔티티를 새로고침 할 때, 연관된 엔티티도 모두 새로고침
3. CascadeType.All
- 상위 엔티티와 하위 엔티티의 영속상태를 동일하게 가져간다.
- 상위 엔티티에 영속성을 부여하는데 준영속 상태로 변화하든 하위엔티티도 동일하게 가져간다.
아래의 예시에서 보면 상위 엔티티인 Order.persist()를 통해 상위에만 영속성을 부여하였지만 하위엔티티인 order_item까지 영속성이 부여되어 데이터가 생성되었다.
동일하게 Order.remove()를 통해 상위에만 삭제를 하였지만 하위엔티티까지 삭제되어 데이터 삭제가 되었다.
3. CascadeType.PERSIST
- 상위 엔티티를 영속화할때 하위 엔티티까지 영속상태로 바꾸게 된다. 이 설정값의 경우 PERSIST를 제외하고 다른 상태는 전파되지 않는다.
- 아래 예시에서 보다시피 PERSIST는 전파되었으나 REMOVE의 경우 전판되지 않는 것을 확인할 수 있다.
4. CascadeType.REMOVE
- 상위 엔티티를 제거할때 하위 엔티티까지 제거하게 된다. 이 설정값은 위 PERSIST와 마찮가지로 REMOVE를 제외하고 다른 상태는 전파하지 않게 된다.
- 아래 예시에서 보다시피 REMOVE 상태는 전파되었으나 PERSIST 상태는 전파되지 않는 것을 확인할 수 있다.
5. 그외 Type(REFRESH, MERGE, DETACH)
- 위의 PERSIST와 REMOVE TYPE 예시에서 보다시피 ALL을 제외하고는 다른 상태들은 명시된 상태에 대해서만 전파되고 다른 상태들은 전파되지 않는 것을 확인할 수 있다.
6.orphanRemoval
- orphanRemoval 옵션이란 고아 객체를 제거하는 옵션이다.
- 고아객체란 무엇일까? 부모(상위) 엔티티와 연관관계가 끊어진 자식 엔티티를 일컸는 말로써 부모와 끊어진 자식 엔티티를 자동으로 삭제처리한다.
- 위의 예시에서 보다시피 CascadeType.PERSIST를 설정 후 상위 엔티티에 대해 remove 처리 시 하위 엔티티가 삭제되지 않으므로 오류가 발생한다. 이때 orphanremval 옵션을 주게되면 정상적으로 삭제되는 것을 확인할 수 있다.
반응형
'Backend > Spring' 카테고리의 다른 글
Spring JPA Bulk Update 처리 (0) | 2022.03.07 |
---|---|
Spring JPA mappedBy? 연관관계의 주인? (0) | 2022.03.04 |
Spring OSIV? (0) | 2022.03.02 |
[JPA] N+1 문제 (0) | 2022.02.28 |
JPA 즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)? (0) | 2022.02.24 |