Framework/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 프로그래밍