JPA

[JPA] 쓰기 지연 저장소

개발 공주 2023. 7. 9. 19:07
728x90

  • JPA는 트랜잭션 : DB에서 하나의 트랜잭션에 여러 개의 SQL을 포함하고 있다가 마지막에 영구적으로 변경을 반영하는 것 처럼 JPA에서도 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소에 전부 가지고 있다가 마지막에 SQL을 한번에 DB에 요청해 변경을 반영합니다.
    • JPA는 이를 구현하기 위해 쓰기 지연 저장소를 만들어 SQL을 모아두고 있다가 트랜잭션 commit 후 한번에 DB에 반영합니다.

flush()

  • 트랜잭션 commit 후 쓰기 지연 저장소의 SQL들이 한번에 요청됨
  • 사실 트랜잭션 commit 후 추가적인 동작이 있는데 바로 em.flush(); 메서드의 호출
  • flush 메서드는 영속성 컨텍스트의 변경 내용들을 DB에 반영하는 역할을 수행
    • 즉, 쓰기 지연 저장소의 SQL들을 DB에 요청하는 역할을 수행합니다.

fulsh 정리

영속성 컨텍스트를 비우지 않음

영속성 컨텍스트의 변경내용을 데이터베이스에 반영(동기화)

트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨

 

fulsh 발생

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

 

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

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

 

플러시 모드 옵션

  • FlushModeType.AUTO 커밋이나 쿼리를 실행할 때 플러시 (기본값)
  • FlushModeType.COMMIT 커밋할 때만 플러시

'JPA' 카테고리의 다른 글

[JPA] Entity의 상태  (0) 2023.07.09
[JPA] 변경감지 (Dirty Checking)  (1) 2023.07.09
[JPA] 1차 캐시  (0) 2023.07.09
[JPA] 트랜잭션  (0) 2023.07.09
[JPA] 영속성 컨텍스트  (0) 2023.07.09