Home 플러시
Post
Cancel

플러시

플러시 (Flush)

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 말하고 아래의 경우에 발생된다.

  • Transaction Commit 발생
  • EntityManager의 flush 메서드 호출
  • JPQL 쿼리 실행

동작 과정

플러시가 발생되면 변경감지를 통해 영속성 컨텍스트 내에 관리되는 엔티티들을 스냅샷과 비교하여 수정 쿼리를 생성한다. 이후 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제)

  1. 변경감지 (Dirty Checking)
  2. 수정 쿼리를 쓰기 지연 SQL 저장소에 등록
  3. 쓰기 지연 SQL 저장소의 쿼리 데이터베이스에 전송

Flush와 Transaction Commit

데이터베이스는 Transaction Commit이 발생되지 않으면 변경내용을 반영하지 않는다. 또한 변경 내용을 SQL로 전달하지 않고 Transaction Commit만 발생되는 경우도 마찬가지로 어떠한 내용도 반영되지 않는다.

이로인해 JPA는 Transaction Commit 발생 시점에 플러시를 자동 호출하여 SQL를 전달 후 commit을 통해 변경을 반영한다.

주의할 점은 플러시는 영속성 컨텍스트에 보관 된 엔티티를 지우는 것이 아니라 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업이다.

JPQL 쿼리 실행 시 플러시가 자동으로 호출되는 이유

JPQL이나 Criteria 같은 객체지향 쿼리를 호출할 때도 JPA는 자동으로 플러시를 발생 시킨다.

1
2
3
4
5
6
7
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

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

코드를 보면 memberA, memberB, memberC는 영속성 컨텍스트에는 존재하지만 데이터베이스에는 반영되지 않은 상태이다. 이때 JPQL을 실행하게 되면 결과적으로 조회 데이터가 없는 상태가 된다.

JPQL을 통해 조회 시 원하는 결과가 나오기 위해서는 플러시를 통해 영속성컨텍스트의 내용이 데이터베이스에 반영이 되어야 한다. 이로 인해 JPA는 JPQL을 실행할 때 플러시를 자동 호출한다.

플러시 모드 옵션

  • FlushModeType.AUTO: 커밋이나 쿼리를 실행할 때 플러시 (default)
  • FlushModeType.COMMIT: 커밋할 때만 플러시

참고

This post is licensed under CC BY 4.0 by the author.

영속성 컨텍스트의 특징

준영속 상태

Comments powered by Disqus.