본문 바로가기
  • Let's study
BackEnd/Spring

[Spring] JPA CascadeType과 Flush

by 코딩고수이고파 2026. 8. 5.

CascadeType.REMOVE

부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제한다.

@OneToMany(
    mappedBy = "question",
    cascade = CascadeType.REMOVE
)
private List<Answer> answers = new ArrayList<>();
questionRepository.delete(question);
 

실행 순서

  1. Answer 삭제
  2. Question 삭제

외래키 제약조건 때문에 부모보다 자식을 먼저 삭제한다.

CascadeType.PERSIST

부모 엔티티를 저장할 때 새로 생성된 자식 엔티티도 함께 저장한다.

@OneToMany(mappedBy = "question",
           cascade = CascadeType.PERSIST)
private List<Answer> answers = new ArrayList<>();
Question question = questionRepository.findById(1).get();

question.addAnswer("새로운 답변");

// question이 관리 상태라면 트랜잭션 종료 시 Answer도 함께 INSERT

 

  • 부모 저장
  • 새 자식 자동 INSERT

가 이루어진다.

더티체킹과 차이

기능 자동 수행
Dirty Checking UPDATE
CascadeType.PERSIST INSERT
CascadeType.REMOVE DELETE

flush()

questionRepository.flush();
 

영속성 컨텍스트 내용을 즉시 DB에 반영한다.

테스트에서는 트랜잭션 종료 전에 SQL 로그를 보기 위해 자주 사용한다.

flush를 안 쓰면?

테스트가 Rollback되므로 INSERT SQL이 출력되지 않을 수도 있다.

댓글