본문으로 건너뛰기

CascadeType 종류

CascadeType 이란?

CascadeType부모 엔티티에 수행한 영속성 작업을 연관된 자식 엔티티에도 전파할지를 결정하는 옵션입니다.

즉, 부모를 저장·수정·삭제할 때
자식에게도 같은 작업을 자동으로 적용할 것인지를 의미합니다.


CascadeType 종류 한눈에 보기

public enum CascadeType {
ALL,
PERSIST,
MERGE,
REMOVE,
REFRESH,
DETACH
}

CascadeType.PERSIST

의미

부모 저장 → 자식도 함께 저장

@OneToOne(cascade = CascadeType.PERSIST)
  • entityManager.persist(parent) 호출 시
  • 연관된 자식 엔티티도 자동으로 persist

사용 시점

  • 생성 시 부모와 자식이 항상 함께 생성되는 관계
  • 자식이 부모 없이는 의미 없는 경우

주의사항

  • 이미 DB에 존재하는 자식을 persist하려 하면 예외 발생 가능

CascadeType.MERGE

의미

부모 병합 → 자식도 함께 병합

@OneToOne(cascade = CascadeType.MERGE)
  • entityManager.merge(parent) 호출 시
  • 자식 엔티티의 변경 사항도 함께 반영

사용 시점

  • Detached Entity를 다시 영속화할 때
  • DTO → Entity 변환 후 merge 패턴

CascadeType.REMOVE

의미

부모 삭제 → 자식도 함께 삭제

@OneToOne(cascade = CascadeType.REMOVE)
  • entityManager.remove(parent) 호출 시
  • 연관된 자식 엔티티도 삭제

사용 시점

  • 자식의 생명주기가 부모에 완전히 종속된 관계
    • User → UserProfile
    • Order → OrderDetail

주의사항

  • 다대일 / 다대다 관계에 사용 시 연쇄 삭제 위험
  • 실무에서는 매우 신중하게 사용

CascadeType.REFRESH

의미

부모 새로고침 → 자식도 DB 상태로 되돌림

@OneToOne(cascade = CascadeType.REFRESH)
  • entityManager.refresh(parent) 호출 시
  • 자식 엔티티도 DB 기준으로 초기화

사용 빈도

  • 매우 낮음 (실무에서 거의 사용하지 않음)

CascadeType.DETACH

의미

부모 영속성 컨텍스트 분리 → 자식도 분리

@OneToOne(cascade = CascadeType.DETACH)
  • entityManager.detach(parent) 호출 시
  • 자식도 영속성 컨텍스트에서 제거

사용 빈도

  • 매우 낮음

CascadeType.ALL

의미

모든 CascadeType 적용

@OneToOne(cascade = CascadeType.ALL)

= PERSIST + MERGE + REMOVE + REFRESH + DETACH

주의사항

  • REMOVE까지 포함되어 있음
  • 무분별하게 사용 시 연쇄 삭제 사고 발생 가능

실무에서 자주 사용하는 조합

1:1 완전 종속 관계

@OneToOne(
cascade = CascadeType.ALL,
orphanRemoval = true
)
  • 생성 / 수정 / 삭제를 부모 기준으로 관리
  • 강한 소유 관계 표현

저장·수정만 전파하고 싶을 때

@OneToOne(
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
)
  • 삭제는 명시적으로 처리
  • 실무에서 가장 안전한 선택

CascadeTypeorphanRemoval 차이

구분CascadeType.REMOVEorphanRemoval
삭제 트리거부모 삭제부모와의 관계 해제
예시remove(parent)parent.setChild(null)
용도생명주기 종속고아 객체 정리
Loading comments...