본문 바로가기

카테고리 없음

[JPA] 준영속 상태란

영속 상태란?

Entity가 영속성 컨텍스트에 저장되어, 관리되는 상태를 말한다.
영속 상태가 될 수 있는 방법은 em.persist()가 있고, 이것 외에도 em.find와 같이 디비에서 데이터를 가져와서 1차 캐시에 저장하였을 때도 영속 상태가 된다.

+ https://ttungbab.tistory.com/195


준영속 상태란?

간단히 말하자면, 영속상태에서 분리된 상태를 말한다.
이렇게 되면, 영속성 컨텍스트가 제공하는 기능을 사용하지 못하게 된다.(더티 체킹, update기능 등)

+ 더티 체킹이란?
디비에서 데이터를 조회하면 1차 캐시에 저장되고, 최초의 상태를 스냅샷한다. 이후 flush()시점에 스냅샷과 1차 캐시의 Entity 값을 비교하게 되는데, 변경 사항이 있으면 update쿼리문을 쿼리 저장소에 저장한다.


준영속 상태로 만드는 방법

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


간단한 예시만 보고 마무리 하겠다.

이 코드를 보았을 때, 앞의 부분을 잘 이해했다면 어떤 현상이 일어날지 생각할 수 있어야 한다.
find()를 통해 entity를 디비에서 조회하였고(이 과정에서 1차 캐시에 저장되고, 스냅샷도 저장될 것이다.)
entity의 값을 변경하였고, 밑에 커밋이 있으니 flush시점에 update쿼리문이 생성되고 DB의 수정을 날릴 것이다.
하지만 그 중간에 detach()때문에 영속성 컨텍스트와 member를 분리하여 준영속 상태가 되며
변경 사항이 일어나지 않게 된다.

영속 컨텍스트의 1차 캐시 안에는 아무것도 없게 되기 때문이다.