2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

Persistence Cascade와 Cascade Lifecycle

2024. 12. 12. 00:13ㆍ자바
Persistence Cascade (영속성 전이)란 무엇인가?

 

  • 영속성 전이는 JPA (Java Persistence API)에서 부모 엔티티의 작업 (저장, 삭제, 병합 등)이 자식 엔티티에도 자동으로 적용되도록 설정하는 기능이다.
  • 부모와 자식 간의 연관 관계를 유지하고, 이를 통해 작업의 일관성과 코드의 간결성을 제공한다.

Lifecycle ( 생명 주기 )
  • JPA에서 엔티티는 특정 생명주기 상태를 따른다. 영속성 전이는 이러한 생명주기 상태의 전환을 연관된 엔티티로 확장한다.

 

엔티티 생명주기 상태

  1. Transient (비영속 상태)
    • 객체가 메모리에만 존재하며, 영속성 컨텍스트에 등록되지 않은 상태
    • 데이터베이스와 전혀 연관되지 않음.
  2. Persistent (영속 상태)
    • 객체가 영속성 컨텍스트에 저장된 상태.
    • JPA가 객체의 변경 사항을 자동으로 감지하고 데이터베이스에 반영함
  3. Detached (준영속 상태)
    • 영속성 컨텍스트에서 분리된 상태
    • JPA가 더 이상 객체를 관리하지 않으며, 데이터베이스와 동기화되지 않음.
  4. Removed (삭제 상태)
    • 삭제 예약 상태로, 데이터베이스에서도 삭제될 예정.

영속성 전이가 필요한 이유
  • 복잡한 연관 관계의 간소화
    • 부모와 자식 간 연관 관계를 관리할 때, 부모와 자식을 따로 처리하는 작업은 번거롭고 실수 가능성이 높다.
    • 영속성 전이를 설정하면 부모 - 자식 관계가 자연스럽게 관리된다.
  • 데이터 일관성 유지
    • 부모와 자식이 항상 같은 상태 (저장, 삭제 등)를 유지해야 하는 경우 유용하다.
  • 코드의 간결화
    • 부모와 자식 간 생명주기를 수동으로 처리하지 않아도 되므로 코드가 간결해진다.

CascadeType 종류
  • PERSIST : 부모 엔티티가 영속성 컨텍스트에 저장될 때 자식 엔티티도 자동으로 저장
@OneToMany(cascade = CascadeType.PERSIST)
private List<OrderItem> orderItems;
  • MERGE : 부모 엔티티가 병합될 때 자식 엔티티도 병합.
@OneToOne(cascade = CascadeType.MERGE)
private Address address;
  • REMOVE : 부모 엔티티가 삭제될 때 자식 엔티티도 삭제.
@OneToMany(cascade = CascadeType.REMOVE)
private List<Child> children;
  • REFRESH : 부모 엔티티를 새로고침할 때 자식 엔티티도 새로고침
@ManyToOne(cascade = CascadeType.REFRESH)
private Parent parent;
  • DETACH : 부모 엔티티가 영속성 컨텍스트에서 분리되면 자식도 분리
@OneToOne(cascade = CascadeType.DETACH)
private Profile profile;
  • ALL : 위의 모든 작업을 전이
@OneToMany(cascade = CascadeType.ALL)
private List<Comment> comments;

Orphan Object란?
  • Orphan Object는 고아 객체라고 부르며 부모 엔티티와의 연관 관계가 끊어진 자식 엔티티를 말한다.
  • JPA에서는 부모 - 자식 관계에서 자식 엔티티가 더 이상 부모와 연관되지 않으며 이를 자동으로 삭제할 수 있는 기능을 제공

Orphan Object와 Persistence Cascade의 관계
  • 고아 객체 삭제 기능은 orphanRemoval = true 를 설정하여 사용할 수 있다.
  • 이 설정은 영속성 전이와 함께 사용되며, 특히 CascadeType.REMOVE와 유사한 동작을 한다.
    • orphanRemoval = true : 부모 = 자식 관계가 끊어진 자식 엔티티를 자동으로 삭제
    • CascadeType.REMOVE : 부모가 삭제될 때만 자식을 삭제

주요 차이점

  • orphanRemoval = true : 부모가 삭제되지 않아도, 연관 관계가 끊어지면 자식을 삭제
  • CascadeType.REMOVE : 부모가 삭제될 때만 자식을 삭제

영속성 전이 설정 시 주의점
  • CascadeType.REMOVE는 신중하게 사용하라.
    • 부모가 삭제될 때 자식도 삭제되므로, 데이터 손실을 초래할 수 있다.
  • 필요한 CascadeType만 사용하라
    • 모든 관계에서 CascadeType.ALL을 적용하는 것은 비효율적이다.
    • 비즈니스 로직에 맞는 적절한 전이 설정이 필요하다.
  • orphanRemoval와의 조합
    • CascadeType.REMOVE와 함께 설정할 때, 고아 객체가 의도하지 않게 삭제되지 않도록 주의해야 한다.

'자바' 카테고리의 다른 글

OOP? 객체지향 프로그래밍!  (2) 2024.12.14
Persistence Context  (1) 2024.12.12
트랜잭션 격리 수준 / 전파 레벨  (0) 2024.12.03
자바 백엔드 면접질문 정리.  (0) 2024.08.28
Optional / Java 도서관 관리 프로그램  (0) 2024.08.23