3. 영속성 관리 - (3.2 플러시)

HotFried·2023년 9월 25일
0

영속성 컨텍스트의 변경 내용을 DB에 반영

변경 감지 -> 수정된 Entity를 쓰기 지연 SQL 저장소에 등록 -> 쿼리를 DB에 전송
(commit()시점에 자동으로 flush()가 발생한다)

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

  • em.flush() : 직접 호출
  • 트랜잭션 커밋 tx.commit() : 플러시 자동 호출
  • JPQL 쿼리 실행 : 플러시 자동 호출
public class JpaMain {

    public static void main(String[] args) {
        
        ...

        Member member = new Member(1L, "ABC");
        entityManager.persist(member);

        entityManager.flush();
        System.out.println("---------------");

        tx.commit();
    }
}
Hibernate: 
    /* insert hellojpa.Member
        */ insert 
        into
            Member
            (name, id) 
        values
            (?, ?)
---------------

flush()를 직접 호출하게 되면, 즉시 Query가 DB에 반영된다.
-> 이후 commit()시점에 해당 쿼리가 나가지 않는 것을 확인할 수 있다.

  • flush()를 해도 1차 캐시는 유지된다.
    1차 캐시와는 상관없이 쓰기 지연 SQL 저장소에 쌓인 쿼리, 변경된 내용이 DB에 반영되는 것이다.

JPQL 쿼리 실행 시 플러시가 자동으로 호출되는 이유

memberA, memberB, memberC를 영속상태로 만들었다.
DB에서 세 객체를 조회하고 싶어 "select m from Member m" JPQL을 실행했다.

JPQL 실행 시 flush()가 호출되지 않아 세 객체가 DB에 저장되지 않았다면,
DB에서 세 객체를 불러올 수 없을 것이다.

따라서 JPQL 실행 시 자동으로 flush()가 호출 되는 것을 알 수 있다.


플러시 모드 옵션

FlushModeType.AUTO

  • 기본값
  • 커밋 or JPQL 작성 시 실행된다.

FlushModeType.COMMIT

  • 커밋할 때만 실행된다.
  • JPQL을 작성해도 바로 flush()가 호출되지 않는다.
  • 중간에 실행하는 JPQL 쿼리가 앞과는 전혀 다른 데이터를 써서 굳이 당장 플러시할 필요가 없을 때 사용하면 된다.

-> 그냥 FlushModeType.AUTO를 이용하자.


참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글