[JPA] 연관관계 관리

gyeol·2024년 7월 22일

JPA

목록 보기
8/13
post-thumbnail

김영한 님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'를 듣고 적은 글 입니다.

영속성 전이 CASCADE

CASCADE는 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. @ManyToOne, @OneToMany 등 연관관계를 설정하는 부분에 옵션으로 정의되어 있다.
예를 들어 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하려할 때 CASCADE를 사용할 수 있다.

주의

  • 영속성 전이는 연관관계를 매핑하는 것과 아무관련 없음
  • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함만 제공

CASCADE 종류

CascadeType.All

모든 Cascade를 적용한다.

CascadeType.PERSIST

엔티티를 영속화할 때, 연관된 하위 엔티티도 함께 유지한다.

CascadeType.MERGE

엔티티 상태를 병합할 때, 연관된 하위 엔티티도 모두 병합한다.

CascadeType.REMOVE

엔티티를 제거할 때, 연관된 하위 엔티티도 모두 제거한다.

CascadeType.DETACH

영속성 컨텍스트에서 엔티티를 제거한다.
부모 엔티티에서 detach를 수행하면 연관된 하위 엔티티도 detach 상태가 되어 변경사항이 반영되지 않는다.

CascadeType.REFRESH

상위 엔티티를 새로고침할 때, 연관된 하위 엔티티도 모두 새로고침한다.

고아 객체 제거

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다. orphanRemoval = true를 사용하면 된다.

주의 사항

  • 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능
  • 참조하는 곳이 하나일 때만 사용해야 함
  • 특정 엔티티가 개인 소유할 때 사용
  • @OneToOne, @OneToMany만 사용가능

CascadeType.REMOVE와 orphanRemoval=true

부모를 제거하면 자식은 고아가 된다. 따라서 고아 객체 제거 기능인 orphanRemoval=true를 사용하면 부모를 제거할 때 자식도 함께 제거된다. 이 로직은 CascadeType.REMOVE처럼 동작한다.

CascadeType.REMOVE는 부모 엔티티가 삭제되면 자식 엔티티도 삭제된다. 즉, 부모가 자식의 삭제 생명 주기를 관리한다. 이때 부모 엔티티가 자식 엔티티와의 관계를 제거해도 자식 엔티티는 삭제되지 않고 그대로 남아있다. orphanRemoval=true는 부모 엔티티가 자식 엔티티와의 관계를 제거하면 자식 엔티티는 고아로 취급되어 그대로 사라진다.
부모 엔티티를 삭제할 때는 동일하게 동작하지만 부모 엔티티에서 자식 엔티티와의 관계를 제거할 때 차이점을 가진다.

CascadeType.ALL + orphanRemoval=true

두 옵션을 모두 활성화하면 부모 엔티티를 통해 자식의 생명주기를 관리할 수 있다. 이는 도메인 주도 설계(DDD)의 Aggregate Root 개념 구현시에 유용하다

profile
공부 기록 공간 '◡'

0개의 댓글