[Spring Boot] JPA 영속성 전이(Cascade): CascadeType.PERSIST의 동작 원리와 내부 메커니즘

윤하빈·2026년 4월 29일

개발 공부

목록 보기
11/13

1. 영속성 전이(Cascade)의 정의

영속성 전이는 특정 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화되도록 강제하는 설정임. 이는 데이터베이스의 참조 무결성과는 별개의 개념으로, JPA의 영속성 컨텍스트(Persistence Context) 관리 관점에서 이해해야 함.

  • 동작 환경: 부모 엔티티와 자식 엔티티가 @OneToMany 또는 @OneToOne 등으로 연관 관계를 맺고 있을 때 사용함.

2. CascadeType.PERSIST가 필요한 이유

일반적으로 JPA는 단일 엔티티의 영속 상태만을 추적함. 연관 관계가 맺어져 있더라도 자식 엔티티를 별도로 저장하지 않으면 데이터베이스에 반영되지 않거나, 외래 키(FK) 제약 조건 위반이 발생할 수 있음.

  • 과거 방식: 연관된 모든 객체를 각각의 Repository를 통해 명시적으로 save() 호출해야 했음.
  • JPA 방식: 부모의 영속 상태 변화를 자식에게 전이시켜 코드 중복을 줄이고 데이터 무결성을 확보함.

3. 내부 동작 프로세스 분석

다음과 같은 코드 실행 시 JPA 내부에서는 연쇄적인 영속화 작업이 발생함.

@Entity
public class Question {
    @OneToMany(mappedBy = "question", cascade = CascadeType.PERSIST)
    private List<Answer> answerList = new ArrayList<>();
}

데이터 처리 흐름

  1. Entity Mapping: question.getAnswerList().add(answer)를 통해 자바 객체 간의 연관 관계를 설정함.
  2. Parent Persistence: questionRepository.save(question)를 호출하여 부모 엔티티를 영속성 컨텍스트에 등록함.
  3. Cascade Inspection: JPA가 부모 엔티티의 설정을 검사하던 중 cascade = PERSIST 옵션을 식별함.
  4. Child Propagation: 연관된 answerList 내의 비영속(Transient) 상태인 엔티티들을 자동으로 찾아 persist()를 수행함.
  5. SQL Execution: 트랜잭션 커밋 시점에 부모의 INSERT 쿼리와 자식들의 INSERT 쿼리가 순차적으로 실행됨.

4. 주요 주의 사항

  • 영속성 전이는 연관 관계 매핑과 별개: cascade 설정을 한다고 해서 연관 관계의 주인이 바뀌는 것은 아님. 데이터베이스의 외래 키 제어는 여전히 연관 관계의 주인이 담당함.
  • 남용 주의: 자식 엔티티가 부모 외에 다른 엔티티와도 연관 관계를 맺고 있는 경우, 영속성 전이로 인해 원치 않는 데이터 변경이 발생할 수 있음. 단일 소유 구조(예: DDD의 Aggregate Root)에서 사용하는 것이 권장됨.

핵심 요약

  • CascadeType.PERSIST: 부모가 영속화될 때 연관된 자식들도 함께 영속성 컨텍스트에 포함시키는 옵션임.
  • 코드 간결화: 자식용 Repository를 일일이 호출할 필요 없이 부모의 저장만으로 데이터 정합성을 유지할 수 있음.
  • 동작 시점: EntityManager.persist() 호출 시점에 전이가 발생하며, 최종적으로 데이터베이스에 쿼리가 전송됨.

0개의 댓글