Spring

[Spring] Flush 시점

Paragon53 2025. 5. 7. 16:24

minecraft-font

#Flush

💡 Spring 정리: Flush 시점

📘 개념 정리

em.persist() 했다고 바로 DB에 insert 쿼리가 실행되지 않는다. JPA는 변경 내용을 모아뒀다가 특정 시점에 한꺼번에 f
lush(반영) 한다.

 

항목 설명
정의 영속성 컨텍스트의 변경 내용을 DB에 반영 (SQL 실행)
시점 트랜잭션 커밋 전, JPQL 실행 전, flush() 명시 호출 시
대상 새로 등록(persist), 수정, 삭제된 엔티티
주의 flush는 커밋이 아님! → rollback 가능

 

Flush가 일어나는 3가지 시점

상황 예시
✅ 1. 트랜잭션 커밋 시점 tx.commit() 호출 시 자동 flush
✅ 2. JPQL 쿼리 실행 직전 em.createQuery(...).getResultList()
✅ 3. 수동 호출 em.flush() 명시적으로 호출

🔄 동작 흐름

 

em.persist(member);     // INSERT SQL 아직 안 나감
em.flush();             // 여기서 INSERT 실행
em.clear();             // 1차 캐시 초기화

Member m = em.find(Member.class, member.getId()); // DB에서 다시 조회

⚠️ 실수 및 주의사항

주의 할 점

  • flush는 DB에 반영은 하지만 트랜잭션을 종료하지 않는다
    → rollback 시에는 SQL 무효화됨
  •  JPQL은 flush를 자동으로 트리거함
    → 예: em.createQuery(...) 전에 flush 발생! 


실수 포인트

 

  • persist()만 하고 조회하면 insert 안 된 것처럼 보일 수 있음
    → flush가 아직 안 됐기 때문

  • 수정하고 flush() 안 한 채 em.clear() → 변경사항 날아감

  • flush 시점에 예외가 나면 → 트랜잭션도 더 이상 쓸 수 없음

 

 

✨요약

- flush는 "DB에 쿼리를 보내는 시점"을 결정한다.
- persist/save 하고 바로 SQL이 날아가지 않음 (버퍼에 있음)
- 커밋 전이나 JPQL 실행 전, 또는 직접 flush() 해야 쿼리 전송
- flush는 commit이 아님! rollback 가능