flush

gotcha!!·2023년 9월 8일
0

JPA

목록 보기
5/16

flush

영속성 컨텍스트의 변경 내용을 데이터베이스에 반영

flush 발생

  • 변경 감지가 발생했을 때
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송

영속성 컨텍스트를 flush하는 방법

  • em.flush() // 직접 호출
  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출

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

em.persist(member1);
em.persist(member2);
em.persist(member3);
// 영속 상태이고, 아직 쿼리문이 날아가지 않았다.

query = em.createQuery("select m from Member m", Member.class);
List<Member> member = query.getResultList();
// 하지만 JPQL로 member리스트를 조회했고, 위에 영속성 컨텍스트에 잇는 엔티티들이 실제로 쿼리문이 날아가지 않았기에 조회를 못하지만 JPQL 실행 시점에 자동으로 flush를 통해 영속성 컨텍스트 내에 엔티티들이 DB저장되게 되어 JPQL 쿼리 실행 시 데이터를 볼 수 있게 된다.

flush 모드 옵션

em.setFlushMode(FlushModeType.COMMIT);
  • FlushModeType.AUTO
    기본값으로 커밋이나 쿼리 실행 시 플러시

  • FlushModeType.COMMIT
    커밋할 때만 플러시

근데 이건 건들 필요 없고 그냥 기본 값으로 쓰자..

flsu에 대해 더 자세히

플러시는!!!

  • 영속성 컨텍스트를 실제로 비우지 않는다.
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다.(더티체킹)
  • 트랜잭션이라는 작업 단위로 작동한다
  • 커밋 직전에만 동기화하면 된다.
profile
ha lee :)

0개의 댓글