Spring/🌵 JPA

🌵 플러시(flush)

늦은산책 2023. 9. 19. 00:19
해당 수업은 김영한님의 JPA 수업을 통해 작성되었으며 약간의 저의 생각이나 추가적으로 제가 궁금했던 내용을 더 적었다는 사실을 밝힙니다.

 

💡 플러시(flush)

영속성 컨텍스트의 변경 내용을 DB에 반영하는 작업이다. 

 

플러시 발생한다면

  • Dirty Checking 변경 감지를 한다
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록한다
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.

 

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

  • em.flush() - 직접 작성을 통해 호출한다

만약 이렇게 작성하게 된다면 System.out.println이 반영되기 이전에 현재 쓰기 지연 SQL 저장소에 있는 내용들이 DB에 반영이 된다.

하지만 쓰기 지연 SQL 저장소에 있는 쿼리문이 사라지진않는다.

 

  • 트랜잭션 커밋 - commit 을 하면 자동으로 flush가 호출된다
  • JPQL 쿼리 실행 - 이또한 flush가 자동으로 호출된다.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();

이러한 경우를 보면 쿼리가 실행되면 flush가 바로 실행된다. 그래서 위에 persist또한 flush로 인해 DB에 접근된다.

 

 

결론

  • 영속성 컨텍스트를 비우지 않는다.
  • 영속성 컨텍스트의 변경 내용을 데이터 베이스에 동기화한다
  • 트랜잭션이라는 작업 단위가 중요하다 ☞ 커밋 직전에만 동기화 하면 된다.