3.5 플러시
플러시(
flush()
)는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.
플러시 실행
- 변경 감지 동작. 모든 엔티티를 스냅샷과 비교.
- 수정된 엔티티는 수정쿼리를 만들어 쓰기 지연 SQL 저장소 등록.
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송.
- 등록, 수정, 삭제 쿼리
영속성 컨텍스트를 플러시하는 방법 3가지
- em.flush() 직접 호출.
- 트랜잭션 커밋시 플러시가 자동 호출.
- JPQL (Java Persistence Query Langauge) 쿼리 실행시 플러시가 자동 호출.
직접 호출
- 테스트나 다른 프레임워크와 JPA를 함께 사용할 때를 제외하고 거의 사용하지 않음.
트랜잭션 커밋 시 플러시 자동 호출
- 트랜잭션 커밋하기 전에 꼭 플러시 호출해서 변경 내용을 데이터베이스에 반영해야 함.
- JPA는 트랜잭션 커밋할 때 플러시를 자동 호출.
JPQL 쿼리 실행 시 플러시 자동 호출
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 중간에 조회
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
- memberA, memberB, memberC는 데이터베이스에 없음.
- 이런 문제를 해결하기 위해 JPQL 실행 시에 플러시 자동 호출.
- memberA, memberB, memberC는 쿼리 결과에 포함.
플러시 모드 옵션
- 별도로 설정하지 않으면 AUTO 동작.
- 대부분 AUTO 기본 설정을 그대로 사용.
모드 | 설명 |
---|---|
FlushModeType.AUTO | 커밋이나 쿼리를 실행할 때 플러시(기본값) |
FlushModeType.COMMIT | 커밋할 때만 플러시 |
플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화.
영속성 컨텍스트에 보관된 엔티티를 지우는 것이 아님.