본문 바로가기
Java & Kotlin/Spring Data

[JPA]영속성 전이 CASCADE

by heekng 2022. 4. 21.
반응형

영속성 전이 CASCADE

JPA를 사용하면서 CASCADE 옵션은 repository의 save, delete 메서드를 한번이라도 덜 쓰게 해주기에 최대한 활용할 수 있게 노력하는 편이다.
매번 책으로 확인하기보다 한번 제대로 정리하려 한다.

CASCADE란?

  • 영속성 전이(CASCADE): 특정 엔티티를 영속상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때에 사용하는 기능
  • CascadeType으로 ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH가 존재한다.
    • ALL: 모두 적용
    • PERSIST: 영속
    • MERGE: 병합
    • REMOVE: 삭제
    • REFRESH: REFRESH
    • DETACH: DETACH
  • 주로 @OneToXXX연관관계에 사용한다.
  • @OneToXXX(Cascade = CascadeType.ALL)과 같은 형태로 사용한다.
  • cascade = {CascadeType.PERSIST, CascadeType.REMOVE} 와 같은 형태로도 사용 가능하다.

영속성 전이: 저장

  • cascade = CascadeType.PERSIST
  • 부모를 영속화 할 떄 자식도 함께 영속화한다.
  • 예시
    • 만약 ChildParent 엔티티가 존재하고, Parent 엔티티는 @OneToMany 연관관계로 Child를 가지고 있다고 하자.
    • 이때 Parentpersist하는 경우에 Parent 엔티티 속 Childschild가 존재한다면 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