JPA

영속성 전이(CASCADE)와 고아 객체

dev-rootable 2023. 8. 17. 17:46

📌 영속성 전파의 필요성

 

Parent와 Child는 일대다 관계

 

위와 같은 관계에서 연관 관계의 주인은 Child이고, Child를 단독으로 사용하는 Parent 엔티티를 부모 엔티티로 간주한다.

 

여기서 다음 코드를 수행하면 몇 번의 저장이 발생할까

 

두 개의 Child와 한 개의 Parent 저장

 

총 3번의 저장

 

이렇게 총 3번의 저장이 발생한다. 그런데 Parent는 여러 Child를 단독으로 사용한다. 그렇다면 Parent에서 특정 작업을 했을 때,
모든 Child에 영향을 주는 방법이 없을까? 그래서 등장한 것이 영속성 전이다.

 

📌 영속성 전이(CASCADE)

 

 

특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속 상태로 만들고자 할 때 사용한다. 여기서 영속 상태로 만든다는 것은 저장, 삭제, 병합 등을
수행한다는 것이고, 이러한 작업은 영속 상태일 때 가능하다.
결국 영속성 전이는 부모 엔티티가 영속화할 때, 자식 엔티티에 동일한 영향을 준다는 의미다.

 

부모 엔티티는 자식 엔티티를 단독으로 사용하는 엔티티를 말한다.

 

🔎 사용 방법

 

Parent 객체

 

위와 같이 설정하고 Parent를 저장하면 아래처럼 두 개의 Child가 함께 저장된다.

 

 

DB 저장 결과

 

🔎 주의 사항

 

  • 연관 관계 매핑하는 것과 아무런 관계가 없다.
  • 영속화를 전파하는 편리함을 제공할 뿐이다.
  • 자신을 단독으로 사용하는 부모 엔티티가 있어야 한다.
    • 다른 엔티티와 추가로 연관 관계가 있으면 사용할 수 없다.
  • 두 엔티티의 Life Cycle이 거의 유사할 때 사용 가능
    • CRUD 작업을 할 때가 거의 비슷하게 가는 경우

 

🔎 CASCADE 종료

 

주로 ALL과 PERSIST 사용

 

CASCADE 종류

 

📌 고아 객체

 

부모 객체와 연관 관계가 끊어진 자식 객체를 고아 객체라 한다.

 

예를 들어, 단독으로 사용하는 부모 객체가 있을 때, 컬렉션에서 빠진 자식 객체는 더 이상 참조하는 곳이 없다. 이때, 해당 객체를 고아 객체로 보고 자동으로 삭제한다.

 

🔎 사용 방법

 

orphanRemoval을 true로 설정

 

위와 같이 설정하면 List에서 빠진 Child는 자동 삭제된다.

 

 

설정 전(좌), 설정 후(우)

 

🔎 주의 사항

 

  • 부모 엔티티가 자신을 단독으로 사용할 때 사용해야 한다.
    • 특정 엔티티가 개인 소유
    • @OneToMany 또는 @OneToOne만 가능
  • 해당 기능은 CascadeType.REMOVE처럼 동작하지만 차이점이 있다.
    • CascadeType.REMOVE ➡ 연쇄 삭제
    • orphanRemoval = true ➡ 연쇄 삭제 + Collection에서 빠진 요소를 자동 삭제 (2가지 상황에 대해 자동 삭제)

 

🔎 CascadeType.ALL + orphanRemoval = true 조합

 

N(다)에 해당하는 Entity는 1에 해당하는 Entity와 라이프 사이클을 완전히 함께 하게 된다. 즉, 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다.
그래서 자식 엔티티는 repository가 필요 없다.

 

Reference:

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자

www.inflearn.com