Programming/JPA 프로그래밍
03. 영속성 관리
JKROH
2023. 8. 18. 16:33
반응형
영속성 컨텍스트
- 영속성 컨텍스트란?
- 엔티티를 영구 저장하는 환경이라고 이해할 수 있다.
- 엔티티 매니저를 통해 엔티티를 저장 / 조회하는 경우 엔티티 매니저는 엔티티를 영속성 컨텍스트에 보관하고 관리한다.
- 엔티티에는 네 가지 생명주기(라이프 사이클)가 존재한다. 해당 내용은 링크에서 자세히 설명하고 있다.
- 영속성 컨텍스트의 특징
- id값으로 영속 객체를 구분하기 때문에 id값이 반드시 필요하다. id값이 없다면 예외가 발생한다.
- 영속성 컨텍스트에 저장된 영속 객체는 트랜잭션이 커밋되는 순간 DB에 저장된다.
- 영속성 컨텍스트 내부에는 1차 캐시라고 불리는 캐시가 존재한다. 영속 객체는 모두 이 캐시에 저장된다. 조회 쿼리를 실행할 때 만일 조회하고자 하는 객체가 1차 캐시 내에 존재한다면, DB에서 별도로 새롭게 정보를 가져오는 것이 아니라 1차 캐시에 저장된 데이터를 사용한다. 따라서 성능적인 측면에서 이점이 있다.
- 이렇게 같은 객체를 사용하기 때문에, 하나의 id값으로 조회하는 객체는 동일성이 보장된다.
- ex) User a = em.find(User.class, 1); User b = em.find(User.class, 1); 일 때 a == b => true이다.
- 영속성 컨텍스트는 트랜잭션의 쓰기 지연을 지원한다. DB에 수정이 가해지는 INSERT 쿼리나 UPDATE 쿼리, 그리고 DELETE 쿼리의 경우, 영속성 컨텍스트 내부의 쓰기 지연 SQL 저장소에 저장되어있다가 트랜잭션이 커밋될 때 한번에 실행되어 DB와 영속성 컨텍스트를 동기화한다. 이를 플러시라고 한다(커밋이 실행되면 플러시가 먼저 실행된다). 이를 통한 성능 개선도 이루어낼 수 있으나 이는 15장에서 다루도록 한다.
- 영속성 컨텍스트는 변경 감지를 통해, 별도의 EntityManager#update()와 같은 메서드를 사용하지 않아도(존재하지도 않는다) 수정 쿼리를 실행시킬 수 있다.
- JPA는 엔티티를 영속성 컨텍스트에 보관할 때, 최초의 상태를 복사해서 저장한다. 이를 스냅샷이라고 부른다.
- 플러시 시점에 스냅샷과 영속 객체를 비교하여 다른 점이 있으면 UPDATE쿼리를 쓰기 지연 SQL 저장소에 저한다.
- 트랜잭션을 커밋한다.
- 준영속 상태의 객체는 영속성 컨텍스트가 더 이상 관리하지 못한다. 당연히 영속성 컨텍스트가 제공하는 1차 캐시, 쓰기 지연, 변경 감지 등의 기능을 이용할 수 없다.
- 영속 객체를 detach() 하거나(em.detach(object)), 영속성 컨텍스트를 clear()하여 초기화 하거나(em.clear()), 영속성 컨텍스트를 종료하면(em.close()) 영속 객체는 준영속(분리됨) 상태가 된다.
반응형