본문 바로가기
JPA

(JPA) 엔티티매니져 플러시(EntityManager flush)란?

by Developer RyanKim 2020. 4. 20.



엔티티매니져 플러시(EntityManager flush)

: 플러시(flush())는 영속성 컨텍스트의 변경 내용을 DB에 반영한다.

이렇게 꼭 외워두자.

구체적으로는 아래와 같이 동작한다.

1. 변경 감지 동작
: 영속성 컨텍스트에 의해 관리되는 엔티티를 스냅샷과 비교하여 수정이 일어난 엔티티에 대한
update 쿼리문을 쓰기 지연 SQL 저장소에 저장한다.

2. 쿼리 실행
: 쓰지 지연 SQL 저장소의 쿼리를 DB에 전송하여 실행한다.


flush() 가 실행되는 경우는 3가지가 있다

1. entitiyManager.flush() 직접 호출

: 테스트 등의 경우를 제외하고 거의 사용하지 않음

2. 트랜잭션 커밋 시점에 자동으로 호출
: DB 변경 내용을 SQL로 전달하지 않고 (flush()를 실행하지 않고) 트랜잭션만 커밋하면 어떤 데이터도 DB에 반영되지 않는다. 따라서 자동으로 플러시를 호출되도록 되어있다.

3. JPQL 쿼리 실행시, 실행 전에 자동으로 호출

: JPQL은 영속성 컨텍스트를 조회하지 않고 SQL로 변환되어 직접 DB에 전달되어 실행된다.
따라서 이전에 영속성 컨텍스트에 저장되었고, 아직 DB에 반영되지 않은 데이터는 조회할 수 없다.
이런 문제를 예방하기 위해 실행전에 플러시를 자동으로 호출하도록 되어있다. 

댓글