반응형
영속성 전이 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 |