반응형
영속성 전이 CASCADE
JPA를 사용하면서 CASCADE 옵션은 repository의 save, delete 메서드를 한번이라도 덜 쓰게 해주기에 최대한 활용할 수 있게 노력하는 편이다.
매번 책으로 확인하기보다 한번 제대로 정리하려 한다.
CASCADE란?
- 영속성 전이(CASCADE): 특정 엔티티를 영속상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때에 사용하는 기능
- CascadeType으로
ALL,PERSIST,MERGE,REMOVE,REFRESH,DETACH가 존재한다.ALL: 모두 적용PERSIST: 영속MERGE: 병합REMOVE: 삭제REFRESH: REFRESHDETACH: DETACH
- 주로
@OneToXXX연관관계에 사용한다. @OneToXXX(Cascade = CascadeType.ALL)과 같은 형태로 사용한다.cascade = {CascadeType.PERSIST, CascadeType.REMOVE}와 같은 형태로도 사용 가능하다.
영속성 전이: 저장
cascade = CascadeType.PERSIST- 부모를 영속화 할 떄 자식도 함께 영속화한다.
- 예시
- 만약
Child와Parent엔티티가 존재하고,Parent엔티티는@OneToMany연관관계로Child를 가지고 있다고 하자. - 이때
Parent를persist하는 경우에Parent엔티티 속Childs에child가 존재한다면parent엔티티뿐만 아니라child엔티티 두개 모두persist된다.
- 만약
- 영속성 전이는 연관관계를 매핑하는 것과는 아무 관련이 없다. 엔티티를 영속화할 때 연관된 엔티티도 같이 영속화는 편리함을 제공한다.
실제로 개발을 하면서 PERSIST를 사용하려 할 때 하나의 의문이 들었다.
당연하지만 parent와 child는 모두 영속성 컨텍스트에 존재하지 않는 상태이다.
연관관계의 주인인 child는 어떻게 parent를 알 수 있을까?
바로 영속성 컨텍스트에 등록되어 영속상태가 될 때에 parent객체와 child 객체 안의 parent객체는 동일한 엔티티이다.
따라서 의문을 가질 이유 없이 child.setParent(parent) 이후 parent.getChilds.add(child)를 해주면 persist가 적용된다.
영속성 전이: 삭제
cascade = CascadeType.REMOVE- 부모 엔티티를 삭제할 때 자식 엔티티도 함께 삭제된다.
- 기존의 remove 메서드를 이용한다면 부모와 자식 총 n번의 삭제를 호출해야한다. 또한 자식을 모두 삭제한 이후에 부모를 삭제해야 한다. 하지만 cascade를 이용하면 한번의 호출으로 모두 삭제할 수 있다.
- 만약 CascadeType.REMOVE를 설정하지 않고 부모를 삭제한다면, 자식 테이블에 걸려 있는 외래 키 제약조건으로 인해 데이터베이스에서 외래키 무결성 예외가 발생한다.
CascadeType.REMOVE의 가장 핵심은 자식 엔티티를 삭제하지 않고 부모만 삭제하더라도 한번에 삭제되는점이라 생각한다.
깔끔한 코드를 작성 할 수 있다.
반응형
'Java & Kotlin > Spring Data' 카테고리의 다른 글
| [QueryDSL] 프로젝션 (0) | 2022.05.14 |
|---|---|
| [QueryDSL] QueryDSL 기본문법 (0) | 2022.05.11 |
| [QueryDSL] QueryDSL 시작하기 (0) | 2022.05.10 |
| [JPA] UniqueConstraint와 Embedded field (0) | 2022.05.07 |
| [MyBatis] 동적쿼리(동적 태그) (0) | 2021.05.13 |
| [JSP] MyBatis (0) | 2021.03.15 |