[JPA] 플러시란? 영속성 컨텍스트 플러시(flush)

go_go_·2023년 2월 26일
0

JPA

목록 보기
3/4
post-thumbnail

📢 플러시(flush)

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

  • 영속성 컨텍스트 내용과 DB를 맞추는 과정
  • commit 시 자동으로 일어남
  • 플러시 한다고 commit 되는 것 아님

👀 플러시하면 일어나는 일

  • 엔티티 변경 감지
    • 수정된 엔티티 있으면 UPDATE 쿼리 쓰기 지연 SQL 저장소에 쌓아둠
  • 쓰기 지연 SQL 쿼리 -> DB에 전송
    • 쌓아둔 등록, 수정, 삭제 쿼리 나감
  • 영속성 컨텍스트는 비우지 않음!
    • 플러시 했다고 비워지지 않음
    • 영속성 컨텍스트 비우고 싶다면 메서드 호출: em.clear()

👀 플러시 일어나는 경우

  • 직접 호출
    • em.flush()
    • 사용자가 메서드를 통해 영속성 컨텍스트 플러시
  • 자동 호출
    • 트랜잭션 커밋 -> 플러시 호출
    • JPQL 쿼리 실행 전 플러시 호출

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

  • JPQL은 쿼리문을 DB에 직접 실행!
  • 영속성 컨텍스트에 보관한 데이터는 DB에 반영되지 않았음
  • DB에 쿼리 보내는데 실제 저장한 데이터과 값이 일치하지 않을 수 있음
  • 따라서 JPA는 JPQL 쿼리문 날라가기 전 영속성 컨텍스트 플러시!

📌 플러시 모드 옵션

em.setFlushMode(FlushModeType.COMMIT);
  • 기본값: FlushModeType.AUTO
    • 커밋이나 JPQL 쿼리 실행할 때 플러시 자동 발생
  • FlushModeType.COMMIT
    • 커밋할 때만 플러시 자동 실행
    • 영속성 컨텍스트와 관련 없는 데이터 접근할 때 사용

📝 플러시 정리

  • 플러시: 영속성 컨텍스트 변경 내용을 DB에 동기화
  • 플러시 실행 시 변경 감지, 모아둔 SQL 쿼리문 전송이 일어남
  • 플러시는 트랜잭션 커밋, JPQL 실행 전에 자동 실행
  • 플러시는 메서드 통해 명시적 호출도 가능
  • 플러시 진행 후 영속성 컨텍스트는 비우지 않음!


출처
인프런 '자바 ORM 표준 JPA 프로그래밍 - 기본편' 강의

profile
개발도 하고 싶은 클라우드 엔지니어

0개의 댓글