⭐️ 준영속 상태
영속 상태가 되는 경우
em.persist
를 하면 영속 상태가 된다.
em.find
- em.find를 해서 DB에서 엔티티를 가져오려고 한다고 하자.
그런데 얘가 영속성 컨텍스트에 없다면 즉, 만약 1차 캐시에 없다면 DB에서 가져와서 1차 캐시에 올린다. 1차 캐시에 올라간 상태가 바로 영속 상태다. JPA가 관리하는 상태가 된 것이다.
em.persist해서 1차 캐시에 집어 넣을 때도 영속 상태가 되지만 em.find나 뭔가 JPA를 통해서 조회를 했을 때도 영속 상태를 만들어 준다. 여기까지 알아보고
그렇다면 준영속 상태란 뭘까?
영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 것이다. 한마디로 다 빼버리는 것이다. 이렇게 되면 영속성 컨텍스트가 제공하는
- 1차 캐시
- 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 변경 감지(Dirty Checking)
- 지연 로딩(Lazy Loading)
위의 기능을 사용하지 못하게 된다.
📌 준영속 상태로 만드는 방법
영속성 컨텍스트에서 관리하다가 관리하기 싫다면
-
em.detach(entity)
- 말 그대로 떼어낸다는 것이다. 영속성 컨텍스트에 있다가 em.detach를 한 순간 더이상 JPA가 관리하지 않게 된다. 이처럼 영속 상태였다가 영속성 컨텍스트에서 빠지는 상태가 '준영속 상태'다.
-
em.clear()
- 엔티티 매니저 안에 있는 영속성 컨텍스트를 통째로 지워버리는 것이다.
-
em.close()
- 영속성 컨텍스트를 종료시키는 것이다. 그렇다면 영속성 컨텍스트에 있던 엔티티는 더이상 관리가 안된다. 데이터를 변경해서 변경이 안된다.
위의 3가지 방법으로 영속 상태에서 준영속 상태로 만들 수 있다.
출처
자바 ORM 표준 JPA 프로그래밍 강의
무슨 준영속 상태인가요? 박준영? 김준영? 최준영? 정준영? 푸하하하하