과정을 즐기자

영속성 관리 본문

Spring Data

영속성 관리

320Hwany 2022. 11. 27. 16:58

영속성 관리

JPA가 제공하는 기능은 크게 엔티티와 테이블을 매핑하는 설계하는 정적인 부분(객체와 관계형 데이터베이스를 매핑)과
매핑한 엔티티를 실제 사용하는 동적인 부분으로 나눌 수 있다.(영속성 컨텍스트)
이제부터 매핑한 엔티티를 실제 사용하는 동적인 부분에 대해 알아보자.

엔티티 매니저 팩토리와 엔티티 매니저

데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFatory를 하나만 생성한다.

EntityMangerFactory emf = Persistence.createEntityManagerFactory("jpabook");

여기서 필요할 때마다 엔티티 매니저를 생성한다.

EntityManager em = emf.createEntityManager();

엔티티 매니저 팩토리는 공장을 만드는 과정으로 비용이 아주 많이 든다.
따라서 한 개만 만들어 애플리케이션 전체에서 공유하여 사용한다. 엔티티 매니저는 생성 비용이 거의 들지 않는다.
또한 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 되지만 엔티티 매니저는 동시성 문제가 발생하므로 스레드 간의 공유를 하면 안된다.

영속성 컨텍스트

영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻이다. 이것은 눈에 보이지 않는 논리적인 개념이다.
영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근하며 관리할 수 있다. 엔티티 매니저와 영속성 컨텍스트는 1:1, N:1 일 수 있다.

엔티티의 생명주기

엔티티에는 4가지 상태가 존재한다.

  1. 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태
  2. 영속 : 영속성 컨텍스트에 저장된 상태 (영속성 컨텍스트에 의해 관리되는 상태)
  3. 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
  4. 삭제 : 삭제된 상태

영속성 컨텍스트의 이점

  1. 1차 캐시
    영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이를 1차 캐시라고 한다.
    한번 조회를 했다면 1차 캐시에 보관을 하여 데이터 베이스에서 조회하지 않아도 된다.

  2. 동일성 보장
    영속성 컨텍스트에 의해 관리되는 엔티티는 반복 호출하면 1차 캐시에 있는 같은 엔티티 인스턴스를 반환한다.
    따라서 둘은 같은 인스턴스이기 때문에 동일성을 보장할 수 있다.

  3. 트랜잭션을 지원하는 쓰기 지연
    엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고
    내부 쿼리 저장소(쓰기 지연 SQL 저장소)에 SQL을 모아둔다. 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터 베이스에 보낸다.

  4. 변경 감지
    엔티티를 수정할 때는 단순히 엔티티를 조회해서 데이터만 변경하면 된다.

  5. 지연 로딩

플러시(flush)

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.
플러시의 실행과정은 다음과 같다.

  1. 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교하여 수정된 엔티티를 찾는다(변경감지 동작)
  2. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
  3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제 쿼리)

영속성 컨텍스트를 플러시하는 방법은 3가지이다.

  1. em.flush()를 직접 호출한다.
  2. 트랜잭션 커밋 시 플러시가 자동 호출된다.
  3. JPQL 쿼리 실행시 플러시가 자동 호출된다.

'Spring Data' 카테고리의 다른 글

고급 매핑  (0) 2022.12.04
다양한 연관관계 매핑  (0) 2022.12.02
연관관계 매핑  (0) 2022.11.29
엔티티 매핑  (0) 2022.11.29
JPA를 사용하는 이유  (0) 2022.11.27