flush

flush는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 메소드입니다.

flush를 실행하게 되면 변경 감지가 동작하여 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교하여 수정된 엔티티를 찾고 찾았다면 수정쿼리를 만들어 쓰기 지연 SQL 저장소에 등록합니다. 그후 저장된 쿼리를 데이터베이스에 전송합니다.

영속성 컨텍스트를 flush하는 방법은

  1. entitymanager의 flush 메소드를 직접 호출( entitymanager.flush())
  2. 트랜잭션 커밋시 flush가 자동 호출
  3. JPQL 쿼리 실행시 flush가 자동 호출
  • 직접 호출

    엔티티 매니저의 flush() 메소드를 직접 호출해서 영속성 컨텍스트를 강제로 flush 합니다.

    테스트나 다른 프레임워크와 JPA를 함께 사용할때를 제외하고 거의 사용하지 않습니다.

  • 트랜잭션 커밋시 flush 자동호출

    트랜잭션을 커밋할때 flush가 자동으로 호출되어 영속성 컨텍스트의 변경내용을 데이터베이스에 반영되게 됩니다.

  • JPQL 쿼리 실행시 flush가 자동 호출

    entity manager을 통해 영속상태가 된 엔티티 즉 데이터베이스에는 반영되지 않은 엔티티를 JPQL 쿼리을 사용하여 조회할려고 할때 문제가 생기기 때문에 JPQL 쿼리를 실행할때 flush가 자동 호출되어 엔티티를 반영시켜 JPQL 쿼리 결과에 포함되게 합니다.

    • 식별자(@Id)을 기준으로 조회하는 find()메소드를 호출할 경우에는 flush가 실행되지 않습니다.

Flush mode 옵션

Entity manager에 flush mode를 직접 지정하려면 javax.persistence.FlushModeType을 사용하면 됩니다.

  • FlushModeType.AUTO: commit 이나 query를 실행할때 flush(기본값)
  • FlushModeType.COMMIT : commit 할때만 flush

Flush Mode를 별도로 지정하지 않으면 AUTO(기본값)으로만 동작하여 Commit 이나 Query를 실행할때 flush가 발생합니다.