노트

영속성 전이 (cascade)

Cascade (Cascading Entity State Transitions)

백엔드#jpa · 연결된 개념 4개

쉽게 말하면

영속성 전이는 여행 가방을 부치면 안에 든 물건도 함께 실리고, 가방을 버리면 물건도 같이 버려지는 것처럼, 부모에게 한 저장·삭제를 자식에게도 자동으로 해 주는 옵션이에요.

비유가 깨지는 곳 가방 속 물건이 남의 것이면 큰일이죠. 여러 부모가 공유하는 회원·상품에 REMOVE를 걸면 남이 쓰는 데이터까지 지워져요. 생명주기가 부모에 완전히 묶인 자식에만 걸어요.

영속성 전이(cascade, transitive persistence)는 부모 엔티티에 한 영속성 작업(저장·병합·삭제 등)을 연관된 자식 엔티티에도 자동으로 적용하는 JPA 옵션이다. 기본값은 아무것도 전이하지 않는 것이다.

@Entity
public class Order {
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<OrderLine> lines = new ArrayList<>();
 
    public void addLine(OrderLine line) { lines.add(line); line.setOrder(this); }
}
 
orderRepository.save(order);   // 주문과 함께 주문 항목들도 저장

타입

  • PERSIST: 부모를 저장하면 자식도 저장
  • MERGE: 부모를 병합하면 자식도 병합
  • REMOVE: 부모를 삭제하면 자식도 삭제
  • REFRESH: 부모를 DB에서 다시 읽으면 자식도
  • DETACH: 부모를 영속성 컨텍스트에서 떼어 내면 자식도
  • ALL: 위 전부

orphanRemoval = true(고아 객체 제거, orphan removal)는 부모 컬렉션에서 빠진 자식을 삭제한다. REMOVE는 부모가 삭제될 때만 동작한다는 점이 다르다.

언제 쓰나

  • 자식의 생명주기가 부모에 완전히 묶여 있을 때만 쓴다. 주문과 주문 항목, 게시글과 첨부처럼 부모 없이 존재할 이유가 없는 관계
  • 여러 부모가 공유하는 엔티티(회원·상품 등)에 REMOVE를 걸면, 한쪽을 지울 때 남이 쓰는 데이터까지 사라진다
  • 전이는 부모 → 자식 방향으로만 의미가 있다. 자식에서 부모로 전이하는 설정은 피한다
  • DB의 ON DELETE CASCADE와는 별개다. JPA cascade는 영속성 컨텍스트에 로드된 엔티티를 하나씩 처리한다(영속성 컨텍스트)

"한 덩어리로 함께 저장·삭제되는 범위"는 DDD의 애그리거트와 같은 개념이라, 애그리거트 루트에서 내부 엔티티로만 cascade를 거는 것이 자연스럽다. 관계 매핑 자체는 JPA 연관관계 매핑을 본다.

책: 6장. 메모리에서 데이터베이스로 — JPA

출처: Hibernate ORM User Guide: Cascading entity state transitions

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • Spring Data 리포지터리와 쿼리 메서드

    Spring Data는 인터페이스만 선언하면 구현체를 런타임에 만들어 주는 영속성 추상화(persistence abstraction)다. JpaRepository<엔티티, ID타입>을 상속하면 저장·조회·삭제·페이징이 바로 생기고, 메서드 이름 규칙만으로 쿼리를 만들 수도 있다.

  • 더티 체킹

    영속 상태 엔티티의 필드를 바꾸기만 하면, flush(영속성 컨텍스트의 변경을 DB에 반영) 시점에 처음 스냅샷(snapshot)과 비교해 바뀐 엔티티의 UPDATE를 만들어 보내는 기능. save()를 다시 부를 필요가 없다.

  • ACID

    ACID는 DB 트랜잭션이 보장해야 할 네 가지 성질이다. 트랜잭션은 "계좌 이체의 출금 + 입금"처럼 함께 성공하거나 함께 실패해야 하는 논리적 작업 단위다.

  • "use cache"와 Cache Components

    'use cache'는 Next.js 16의 Cache Components 모델에서 async 함수나 컴포넌트의 반환값을 캐시하라고 명시하는 지시어(Directive)다. 아무것도 표시하지 않으면 매 요청 실행되고, 캐시하고 싶은 곳에만 직접 붙인다(옵트인, Opt-in).

보기 옵션