JPA 에서 가장 중요한 기본 2가지를 말하라고 하면 ORM(Object Releational Mapping) 과 영속성 컨텍스트(Persistence Context)이다.
그중 영속성 컨텍스트가 어떻게 동작하는지에 대해서 알아 보고자 한다.
목차
1. 영속성 컨텍스트란?
2. 영속성 컨텍스트의 이점
3. 영속성 컨텍스트의 특징
1. 영속성 컨텍스트란 ?
영속성 컨텍스트는 엔티티를 영구 저장하는 환경
영속성 컨텍스트는 Web Application Server(여기서는 스프링 프레임워크라고 하겠다)에서 Spring Data Jpa 에서
데이터 베이스에 Transaction 을 반영하기 전에 , 엔티티를 관리하는 1차 캐시 역할을 한다. 엔티티 매니저를 통해서 영속성 컨텍스트 환경을 관리한다.
WAS 는 Request 의 요청을 받고, 엔터티(Entity)를 조회하거나 생성하는 작업을 하게 되는데
그 작업의 단위가 트렌젝션이다(Transaction) .
이 트렌젝션 내에서 영속성 컨텍스트가 존재하며, 영속성 컨텍스트는 논리적인 개념이다.
엔터티를 영구 저장하는 환경을 영속성 컨텍스트라고 한다.
DB 가 아닌, WAS 단에서 영속성 컨텍스트라는 환경이 존재한다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다. (영속성 컨텍스트 관리자)
2. 영속성 컨텍스트의 이점
1. 1차 캐시 이용
1차 캐시를 통해 , 이미 엔티티를 생성한 경우 DB 를 거치지 않고 이미 메모리에 캐싱된 인스턴스를 사용해서 엔티티를 조회한다.
1차 캐시에 없을 경우 데이터베이스에서 조회한다.
2. 영속 엔티티의 동일성 보장
- 1차 캐시로 반복 가능한 읽기 등급의 트랜젝션 격리 수준을 데이터베이스가 아닌 애플리 케이션 차원에서 제공한다.
- 동일한 트랜젝션 내에서 동일한 엔티티에 대한 요청이 발생하면, 같은 인스턴스를 반환한다.
3. 트랜젝션을 지원하는 쓰기 지연(Lasy Loading)
영속성 컨텍스트에는 쓰기지연 SQL 저장소가 있어, SQL 저장소에 저장되어 있다가 flush 하는 시점에 DB 와 동기화 된다.
4. 변경 감지 (Dirty Checking)
- 영속성 컨텍스트는 관리하는 객체의 상태 변화를 "스냅샷과의 비교" 를 통해서 감지한다.
- 트랜젝션이 끝나기 전에 변경된 필드가 있으면 자동으로 DB 에 반영한다 (default=Auto일때)
- 개발자가 일일이 저장해주지 않아도 영속성 컨텍스트가 관리해주기 때문에, 데이터의 일관성을 유지할 수 있다.
JPQL 쿼리 실행 시, 초기에 플러시가 자동으로 호출된다. DB 와 동기화 작업이 먼저 실행 된 이후에 JPQL 쿼리가 실행된다.