[JPA] 영속성 컨텍스트 3

이영재·2025년 1월 23일
0

Spring

목록 보기
13/15

이번엔 플러시와 준영속 상태에 대해서 알아보자

flush

commit은 많이 들어봤는데 flush는 뭘까?
flush는 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 행위이다.
실제로 flush가 일어나는 경우는 다음과 같다.

  • 저장된 객체 변경시
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송 (등록,수정,삭제 쿼리)

커밋과 비슷한 역할을 하는 거 같지만, 트랜잭션은 여전히 유지되며, SQL이 실행되더라도 커밋되지 않은 상태로 남는다. 또한 트랜잭션 내에서 영구 저장 아니다.

commit 시에 자동으로 flush가 일어나기 때문에 비슷한 동작 같지만 실제로는 다르다.

flush 모드 옵션

  • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시
  • FlushModeType.COMMIT : 커밋할 때만 플러시

flush 주의 사항

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

준영속 상태

다시 영속 상태에 대해서 복기해보면

entityManager을 통해서 JPA로 관리할 수 있는 상태(1차 캐시에 올라가 있는 상태) 라고 할 수 있다.

그럼 준영속 상태란?

  • 영속 -> 준영속
  • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
  • 영속성 컨텍스트가 제공하는 기능을 사용 못함

준영속 상태로 관리하는 방법

  • em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
  • em.clear() : 영속성 컨텍스트를 완전히 초기화
  • em.close() : 영속성 컨텍스트를 종료

0개의 댓글

관련 채용 정보