📢 플러시(flush)
영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
- 영속성 컨텍스트 내용과 DB를 맞추는 과정
- commit 시 자동으로 일어남
- 플러시 한다고 commit 되는 것 아님
👀 플러시하면 일어나는 일
- 엔티티 변경 감지
- 수정된 엔티티 있으면 UPDATE 쿼리 쓰기 지연 SQL 저장소에 쌓아둠
- 영속성 컨텍스트는 비우지 않음!
- 플러시 했다고 비워지지 않음
- 영속성 컨텍스트 비우고 싶다면 메서드 호출:
em.clear()
👀 플러시 일어나는 경우
- 직접 호출
em.flush()
- 사용자가 메서드를 통해 영속성 컨텍스트 플러시
- 자동 호출
- 트랜잭션 커밋 -> 플러시 호출
- JPQL 쿼리 실행 전 플러시 호출
JPQL 쿼리 실행 시 플러시 자동 호출 되는 이유??
- JPQL은 쿼리문을 DB에 직접 실행!
- 영속성 컨텍스트에 보관한 데이터는 DB에 반영되지 않았음
- DB에 쿼리 보내는데 실제 저장한 데이터과 값이 일치하지 않을 수 있음
- 따라서 JPA는 JPQL 쿼리문 날라가기 전 영속성 컨텍스트 플러시!
📌 플러시 모드 옵션
em.setFlushMode(FlushModeType.COMMIT);
- 기본값:
FlushModeType.AUTO
- 커밋이나 JPQL 쿼리 실행할 때 플러시 자동 발생
FlushModeType.COMMIT
- 커밋할 때만 플러시 자동 실행
- 영속성 컨텍스트와 관련 없는 데이터 접근할 때 사용
📝 플러시 정리
- 플러시: 영속성 컨텍스트 변경 내용을 DB에 동기화
- 플러시 실행 시 변경 감지, 모아둔 SQL 쿼리문 전송이 일어남
- 플러시는 트랜잭션 커밋, JPQL 실행 전에 자동 실행
- 플러시는 메서드 통해 명시적 호출도 가능
- 플러시 진행 후 영속성 컨텍스트는 비우지 않음!
출처
인프런 '자바 ORM 표준 JPA 프로그래밍 - 기본편' 강의