JAVA/JPA

[JPA] 영속성 컨텍스트 (Persistence Context) - (3)

4Legs 2021. 3. 31. 18:10

플러시 (Flush)

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 기능을 한다.

트랜잭션이 커밋될 때, 플러시가 동작해 쓰기 지연 SQL 저장소에 쌓아뒀던 쿼리들을 데이터베이스에 전송한다.

즉, 영속성 컨텍스트와 데이터베이스를 동기화하는 작업이다.

※ 플러시가 발생해도 1차 캐시 안의 내용은 삭제되지 않는다.

 

직접 호출 (em.flush())

//영속 상태인 member 엔티티
Member member = new Member(200L, "A");
em.persist(member);

//플러시를 직접 호출하면 쿼리가 플러시 호출 시점에 전송됨
em.flush();
transaction.commit();

 

JPQL 쿼리 실행 시 호출

JPQL 쿼리를 실행하는 다음 코드를 보자.

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

//JPQL 실행 전 반드시 flush()로 DB를 동기화한다. (자동)
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();

만약 JPQL로 SELECT 쿼리를 전송했을 때, 영속성 컨텍스트에는 존재하지만 아직 동기화(flush)를 하지 않아 데이터베이스에는 해당 엔티티가 존재하지 않을 경우 문제가 발생할 수 있다.

따라서, 반드시 JPQL 쿼리 실행 전 flush()를 호출해 데이터베이스를 동기화한 후 JPQL 쿼리를 실행한다. 따라서 자동으로 flush()가 호출된다.

 

플러시 모드 옵션

  • em.setFlushMode(FlushModeType.AUTO);

커밋이나 쿼리를 실행할 때 플러시를 수행한다. (기본값)

  • em.setFlushMode(FlushModeType.COMMIT);

커밋 할 때만 플러시를 수행한다.

 

 

 

 

Reference

자바 ORM 표준 JPA 프로그래밍