김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢

플러시

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

플러시 시 일어나는 일

  1. 변경 감지가 동작하여 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교하여 수정된 엔티티를 찾고 수정 쿼리를 쓰기 지연 SQL 저장소에 저장
  2. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)

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

  1. flush() 직접 호출

    • 엔티티 매니저의 flush() 메소드를 직접 호출하는 것, 테스트나 다른 프레임워크와 JPA를 함께 사용할 때는 제외하곤 거의 사용하지 않음
  2. 트랜잭션 커밋 시 자동 호출

  3. JPQL 쿼리 실행 시 자동 호출

    • JPQL, Criteria 호출 시 에도 플러시가 실행 됨. Why? 다른 객체의 커밋 전 JPQL 실행 되면 커밋 전의 내용들이 반영되어 동작하지 않기 때문

      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 = qeury.getResultList(); //flush()를 내부적으로 안했다면 위의 memberA, memberB, memberC 가 조회되지 않음
      

플러시 모드 옵션

  • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시(기본값)
  • FlushModeType.COMMIT : 커밋할 때만 플러시
1
em.setFlushMode(FlushModeType.COMMIT); //EntityManager에 플러시 모드 직접 설정

플러시라는 이름으로 영속성 컨테이너의 엔티티를 지운다는 오해X → 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 것이다.

JPA 카테고리 내 다른 글 보러가기

댓글남기기