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

지연 로딩/즉시 로딩과 관계 없음

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만든다.

예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장.

CASCADE 종류

  • ALL : 영속과 삭제 모두 적용 => 라이프사이클 맞을 때

  • PERSIST : 영속. 저장할 때만 맞추고 나머지는 따로 관리

  • REMOVE : 삭제.

cascase 옵션은 언제 쓰는가? 단일 엔티티에 완전 종속적일 때 , 라이프사이클이 동일할 때 =>소유자가 하나일 때! 오직 하나의 객체만이 자신에게 속한 객체들에 사용할 때 cascade 옵션이 유용하다! 단, 소유자(A) 뿐만 아니라 다른 객체들도 소유자(A)에 속한 객체들을 사용하고 있을 때는 쓰면 안 된다. 소유자(A) 때문에 속한 객체 데이터들이 수정되면 참조하고 있던 다른 객체들은 이상한 값을 참조하기 때문이다!

고아 객체 :

  • 참조가 제거된 자식 엔티티는 다른 곳에서 참조하지 않는 고아 객체로

    보고 삭제하는 기능

  • 참고: 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고아 객체 제거 기능을 활성화 하면, ⭐️부모를 제거할 때 자식도 함께 제거된다. 이것은 ⭐️CascadeType.REMOVE처럼 동작한다.

Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0);


영속성 전이 + 고아 객체, 생명주기

  • CascadeType.ALL + orphanRemovel=true

  • 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있음 ex) JPA가 parent 관리하고 있다.(영속성 컨텍스트에 의해) 자식 엔티티의 생명주기는 부모가 관리한다.

  • 도메인 줃도 설계(DDD)의 Aggregate Root 개념 구현 시에 유용하다! Repository는 Aggregate Root만 컨택하고, 나머지는 Repository로 만들지 않는다(혹은 만들지 않는 것이 더 유용하다.)

  • parent = Aggregate 루트

  • child 엔티티는 루트(parent)가 관리.

Last updated