[JPA] Entity Manager와 Persistence Context를 통한 Entity 관리

p1atin0uss·2022년 6월 23일
0

JPA

목록 보기
1/3
post-thumbnail

💡 개요

JPA에서 Entity는 DB에서의 테이블과 대응되는 자바 객체라고 볼 수 있는데, 이러한 Entity가 JPA에서 어떻게 관리되는지 살펴보고자 한다.




📘 사전지식

Entity Manager Factory

  • Entity Manager Factory는 Entity Manager를 관리 및 생성하는 역할을 하며, 일반적으로 DB 한 개당 하나의 Entity Manager Factory를 가진다.
  • Entity Manager Factory의 생성 비용은 매우 커서 애플리케이션 전체에서 공유되도록 설계되어 있다. 따라서 여러 Thread에서 동시에 접근해도 안전하다.

Entity Manager

  • Entity Manager는 Entity Manager Factory에 의해 생성되고, 이에 대한 생성 비용은 적다.
  • Entity Manager는 DB에 접근하는데 사용된다. 따라서 Entity를 DB에 등록, 수정, 삭제, 조회할 수 있다.
  • 여러 Thread가 동시에 접근하면 동시성 문제가 발생하기에 여러 Thread에서 공유하여 사용할 수 없다.

Persistence Context (영속성 컨텍스트)

  • Entity를 저장하는 환경으로, Entity Manager로 Entity를 조회 또는 저장하게 되면 Entity Manager는 Persistence Context에 Entity를 보관하고 관리한다.

Entity의 생명주기

Entity에는 4가지의 상태가 존재한다.

  • 영속 (managed) : Persistence Context에 저장된 상태 (Persistence Context에 의해 관리됨)
  • 준영속 (detached) : Persistence Context에 저장되었다가 분리된 상태
  • 비영속 (new/transient) : Persistence Context와 관계 없는 상태
  • 삭제 (removed) : 삭제된 상태



📌 Persistence Context의 특징

앞에서 소개한 사전지식들을 바탕으로, Entity Manager와 Persistence Context를 통해 영속 상태의 Entity가 어떻게 관리되는지 차근차근 살펴보자.

1) 식별자 값을 통한 Entity 구분

  • Persistence Context에서 영속 상태의 Entity는 식별자(@Id를 맵핑한 식별자) 값으로 구분된다.

2) 1차 캐시

개념

  • Persistence Context는 내부에 (@id를 맵핑한 식별자, 엔티티 인스턴스)의 Map 형태로 1차 캐시를 가지고 있다.
  • 하나의 트랜잭션이 발생 시, Entity Manger와 Entity Manager가 관리하는 1차 캐시가 생성되고, 트랜잭션이 끝나는 시점에 1차 캐시는 소멸된다.
  • 1차 캐시를 사용하여 성능상의 이점과 동일성(1차 캐시 내의 같은 인스턴스)을 보장한다.

사용 예시

  1. DB의 내부의 데이터 조회 요청 등을 받게되면,
  2. 1차 캐시에 해당 데이터가 있는지 확인 후, 존재한다면 해당 값을 Return한다.
  3. 만약 존재하지 않을 경우, DB에 접근하여 값을 탐색하고 1차 캐시에 저장한다.
  4. 1차 캐시에 저장된 값을 Return한다.

3) 쓰기 지연

개념

  • Entity Manager는 트랜잭션을 커밋하기 전까지 내부 쿼리 저장소에 쿼리문을 저장하고, 트랜잭션을 커밋할 때 모아둔 쿼리문을 DB에 전달하는데 이를 쓰기 지연이라고 한다.

사용 예시

  • 트랜잭션의 커밋요청을 받으면, Entity Manager는 Persistence Context를 flush하는 과정을 거치고, flush는 등록, 수정, 삭제된 Entity가 있을 경우 이를 DB에 반영한다. (쓰기 지연 SQL 저장소에 모인 쿼리문들을 DB에 전달한다)


4) 변경 감지

개념

  • Entity의 변경사항을 DB에 자동으로 반영하는 기능을 뜻한다.
  • 변경 감지로 인해 실행된 UPDATE 쿼리문은 특정 필드만 수정이 이루어졌더라도 Entity의 모든 필드를 업데이트하는 쿼리문이 작성된다.

사용 예시

  1. JPA는 Entity를 Persistence Context에 보관할 때, 최초 상태를 복사(스냅샷)해서 저장한다.
  2. 이후, 사용자에 의해 Entity 수정이 이루어지고 트랜잭션 커밋 요청을 받았을 때 Entity Manager는 flush()를 호출한다.
  3. 현재의 Entity와 스냅샷 당시의 Entity를 비교하여 변경된 Entity를 찾는다.
  4. 수정된 Entity가 있을 경우, 그에 맞는 수정 쿼리문을 생성하여 쓰기 지연 SQL 저장소에 전달한다.
  5. 쓰기 지연 SQL 저장소에 존재하는 쿼리문을 DB에 전달한다.
  6. DB 트랜잭션을 커밋한다.

5) 지연 로딩

개념

  • Entity가 연관 관계를 가진 경우, JPA는 기본으로 연관 관계를 맺고 있는 Entity도 검색하여 가져온다. 하지만, 연관 관계를 맺고 있는 Entity를 사용하지 않는다면 성능적으로 비효율적인데 이때 프록시를 이용한 지연 로딩으로 문제를 해결하고, 실제로 해당 Entity를 사용하는 시점에 초기화 하는 방식을 뜻한다.



🏴 Reference

자바 ORM 표준 JPA 프로그래밍

profile
지식의 깊이는 곧 이해의 넓이 📚

0개의 댓글