플러시(flush)

2839 단어 JPAJPA

flush는 영속성 컨텍스트의 변경 내용을 DB와 동기화한다.

flush의 과정


  1. 변경감지 동작해서, 스냅샷으로부터 영속성 컨텍스트의 모든 엔티티를 비교한다.
  2. 변경사항에 대한 Update 쿼리를 SQL 저장소에 저장한다.
  3. 쓰기 지연 SQL 저장소의 쿼리를 DB에 반영한다.

flush 종류


em.flush()를 직접 호출

엔티티 매니저에서 직접 em.flush()를 호출해서 영속성 컨텍스트를 flush한다.

em이 얻은 트랜젝션 commit 될 때, 자동 호출

트랜젝션이 종료될 때, 변경 사항을 SQL로 전달해야 한다.
따라서, flush를 통해서 내부의 SQL 저장소의 쿼리들을 DB에 반영한다.

JPQL 쿼리 실행 전, 자동 호출

// A,B,C를 영속성 컨텍스트에 영속시킨다.
em.persist(A);
em.persist(B);
em.persist(C);
// 아직 DB에 반영되지않았다.

// 중간에 JPQL 실행
query = em.createQuery("select M from Member m", Member.class);
List<Member> members = query.getResultList();

// 결과에 A,B,C가 포함된다.

JPQL은 SQL로 변환되어 DB에서 조회된다.
하지만, A,B,C는 아직 DB에 반영이 되지 않은 상태다.
따라서 JPQL 실행 전, flush를 통해서 영속성 컨텍스트와 DB를 동기화 시킨 후 조회한다.

flush() 옵션


FlushModeType.Auto : 커밋이나 쿼리를 실행할 때 (기본)
FlushModeType.Commit : 커밋을 실행할 때

좋은 웹페이지 즐겨찾기