3.5 플러시

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

플러시 실행

  1. 변경 감지 동작. 모든 엔티티를 스냅샷과 비교.
  2. 수정된 엔티티는 수정쿼리를 만들어 쓰기 지연 SQL 저장소 등록.
  3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송.
    • 등록, 수정, 삭제 쿼리

영속성 컨텍스트를 플러시하는 방법 3가지

  1. em.flush() 직접 호출.
  2. 트랜잭션 커밋시 플러시가 자동 호출.
  3. JPQL (Java Persistence Query Langauge) 쿼리 실행시 플러시가 자동 호출.

직접 호출

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

트랜잭션 커밋 시 플러시 자동 호출

  • 트랜잭션 커밋하기 전에 꼭 플러시 호출해서 변경 내용을 데이터베이스에 반영해야 함.
  • JPA는 트랜잭션 커밋할 때 플러시를 자동 호출.

JPQL 쿼리 실행 시 플러시 자동 호출

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

// 중간에 조회
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
  • memberA, memberB, memberC는 데이터베이스에 없음.
  • 이런 문제를 해결하기 위해 JPQL 실행 시에 플러시 자동 호출.
  • memberA, memberB, memberC는 쿼리 결과에 포함.

플러시 모드 옵션

  • 별도로 설정하지 않으면 AUTO 동작.
  • 대부분 AUTO 기본 설정을 그대로 사용.
모드 설명
FlushModeType.AUTO 커밋이나 쿼리를 실행할 때 플러시(기본값)
FlushModeType.COMMIT 커밋할 때만 플러시

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화.
영속성 컨텍스트에 보관된 엔티티를 지우는 것이 아님.

results matching ""

    No results matching ""