자바 ORM 표준 JPA 프로그래밍(인프런)

Ch03. 영속성 관리(내부 동작 방식) - 플러시

webmaster 2021. 12. 9. 10:11
728x90

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

플러시 발생

  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

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

em.flush() - 직접 호출

em.flush() 직접 호출

  • flush()를 하게 된다고 해도, 1차 캐시가 사라지는 것이 아닌 쓰기 지연 SQL 저장소에 존재하는 쿼리와, 더티 체크가 일어나는 것일 뿐이다.
  • 트랜잭션 커밋 - 플러시 자동 호출 
  • JPQL 쿼리 실행 - 플러시 자동 호출

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

  • 중간에 JPQL을 실행하면 자동으로 Flush()가 호출된다.

플러시 모드 옵션

em.setFlushMode(FlushModeType.COMMIT)
  • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
  • FlushModeType.COMMIT : 커밋할 때만 플러시
  • 기본값이 AUTO인 이유는 JPQL같은 경우 쿼리를 DB에 바로 적용하기에 DB와 영속성 컨택스트가 데이터 동기화가 안되어 있을 수 있다 -> 따라서 JPQL을 사용한 뒤에는 반드시 flush()를 적용해야 한다.

정리(Flush)

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