[TIL] JPA 플러시(Flush)

sinryuji·2025년 2월 10일
post-thumbnail

플러시(Flush)란?

  • 영속성 컨텍스트의 변경 사항을 DB와 동기화 함.
  • 쓰기 지연 저장소(Action Queue)에 쌓인 쿼리들이 DB에게 전송 됨.
  • 바로 변경 사항이 DB에 반영되는 것은 아님. 쿼리가 전송되면 DB의 트랜잭션 로그에 기록되었다가 JPA Transaction이 commit 되면 그 때 DB에도 변경 사항이 반영 됨.

플러시 호출 3가지 케이스

  • EntityManager의 flush()로 직접 호출.
  • JPA Transaction commit 호출 시 자동 호출.
  • JPQL 쿼리 수행 시 자동 호출.

테스트

@Test
@DisplayName("flush() 메서드 확인")
void test7() {
    EntityTransaction et = em.getTransaction();

    et.begin();

    try {
        Memo memo = new Memo();
        memo.setId(4L);
        memo.setUsername("Flush");
        memo.setContents("Flush() 메서드 호출");
        em.persist(memo);

        System.out.println("flush() 전");
        em.flush(); // flush() 직접 호출
        System.out.println("flush() 후\n");
        

        System.out.println("트랜잭션 commit 전");
        et.commit();
        System.out.println("트랜잭션 commit 후");

    } catch (Exception ex) {
        ex.printStackTrace();
        et.rollback();
    } finally {
        em.close();
    }

    emf.close();
}

위 코드를 보면 Memo Entity를 영속화 한 후 commit() 호출 전에 flush()를 호출하는 것을 볼 수 있다. 위 코드를 실행하면?

commit() 호출 전에 Hiberante가 쿼리를 전송하는 것을 확인 할 수 있다. 추가로 디버깅을 통해 ActionQueue가 비워지는 것도 확인해보자.

flush() 호출 전에는 ActionQueue에 Insert 쿼리가 하나 존재하지만,

flush()를 호출하면 ActionQueue가 비워진다. DB에게 전송된 것이다.

profile
응애 개발자입니다.

0개의 댓글