Spring
[Spring] Flush 시점
Paragon53
2025. 5. 7. 16:24
#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 가능