반응형
1. flush의 개념
flush는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 과정입니다.
여기서 중요한 점은 영속성 컨텍스트를 비우지 않는다는 것입니다.
즉, 1차 캐시(영속성 컨텍스트)는 그대로 유지되며, 단순히 SQL 저장소에 쌓여있던 쿼리들이 데이터베이스로 전송됩니다.
2. flush의 특징
- 1차 캐시(영속성 컨텍스트)는 유지됨
→ clear()처럼 캐시를 비우지 않습니다. - 쓰기 지연 SQL 저장소의 쿼리를 DB에 반영
→ em.persist()나 entity.setName() 등으로 변경된 내용을 DB에 즉시 보냅니다. - 트랜잭션을 끝내는 것이 아님
→ flush() 호출 후에도 트랜잭션은 여전히 활성 상태입니다. - 동기화 목적
→ JPQL 실행 전, 트랜잭션 커밋 직전에 DB와 영속성 컨텍스트를 맞추기 위해 사용됩니다.
3. flush가 실행되는 시점
JPA에서는 보통 flush()를 직접 호출하지 않아도 자동으로 동작합니다. 자동 실행 시점은 다음과 같습니다.
- 트랜잭션 커밋 시
→ 커밋 직전에 영속성 컨텍스트의 변경 내용을 DB에 반영합니다. - JPQL 쿼리 실행 시
→ 쿼리 실행 전에 flush를 호출하여 영속성 컨텍스트의 변경 내용이 쿼리 결과에 반영되도록 합니다. - 직접 호출 시
→ em.flush()를 코드에서 명시적으로 호출할 수 있습니다.
4. 예제 코드
Member member = new Member(200L, "member200");
em.persist(member); // INSERT SQL은 아직 DB에 전송되지 않음 (쓰기 지연)
// flush 호출
em.flush(); // SQL 저장소의 INSERT 쿼리 DB로 전송, 1차 캐시는 유지됨
System.out.println("===============================");
tx.commit(); // 이미 flush 되었으므로 INSERT 재전송 없음
💻 실행 결과
Hibernate:
/* insert for
hellojpa.Member */ insert
into
Member (name, id)
values
(?, ?)
===============================
💡 Tip: flush()는 특별한 상황에서만 직접 호출하고, 대부분의 경우 커밋 시점 자동 flush에 의존해도 무방합니다.
하지만 JPQL 실행 전에 현재까지의 변경 내용이 쿼리에 반영되어야 하는 경우 직접 호출하는 것이 좋습니다.
반응형
'Back end > Spring Project' 카테고리의 다른 글
| [Spring] JPA 양방향 연관관계와 연관관계의 주인 (0) | 2025.08.20 |
|---|---|
| [Spring] JPA 준영속 상태(Detached) (0) | 2025.08.15 |
| [Spring] JPA 기본 CRUD 동작 예제 (0) | 2025.08.13 |
| [Spring] Maven profile 이용한 환경별 (local, dev, prod) 빌드 및 설정 분리 (0) | 2025.07.23 |
| [Spring] BeanFactory와 ApplicationContext (0) | 2025.07.17 |