[JPA] EntityManager와 영속성

General Dong·2024년 8월 20일
post-thumbnail

EntityManager

  • 말 그대로 Entity를 관리하는 역할.
  • ID(Primary Key)로 Entity를 조회하고, 생성 및 수정, 삭제한다.
  • 내부적으로 DB Connection을 얻어 DB에 접근한다.
  • Thread 간의 공유를 하면 안 된다.

영속성 컨텍스트 (Persistence Context)

  • Entity를 영구적으로 저장하는 환경이다.
  • 애플리케이션과 DB 사이에 존재하는 논리적인 개념이다.
  • EntityManager에 의해 관리된다.

영속성 컨텍스트의 특징

1차 캐시

  • 영속성 컨텍스트는 내부 캐시를 가지고 이를 1차 캐시라고 한다.
  • 영속 상태의 Entity는 모두 1차 캐시에 저장된다. (Key: ID, Value: Entity Instance로 저장됨)

동일성 보장

  • 반복 조회를 하여도 1차 캐시에서 해당 Entity의 동일한 인스턴스를 보장한다.

쓰기 지연

  • 쿼리를 생성할 때마다 DB에 보내는 것이 아닌, Commit 전까지 내부 쿼리 저장소에 모아두어 Transaction이 Commit할 때 한 번에 보낸다.
  • Transaction 단위로 쿼리를 요청하여 DB 성능에 이점을 가져온다.

변경 감지

  • 영속성 컨텍스트는 별다른 코드 추가 없이 변경을 감지하여 자동으로 Insert, Update 쿼리를 만든다.

Find (조회)

// Entity의 ID(PK) 값으로 Entity를 조회함
Users foundUser = entityManager.find(Users.class, entity.getId());

조회 순서

  1. 1차 캐시에서 Entity 조회
    1-1. 1차 캐시에 없으면 DB에서 조회
    1-2. 조회한 데이터를 Entity를 생성하여 1차 캐시에 저장
  2. 조회한 Entity 반환

Flush

  • 영속성 컨텍스트의 변경된 데이터을 DB에 반영한다.
  • 영속성 컨텍스트의 내부 쿼리 저장소에 저장된 쿼리를 DB에 보낸다.
// 직접 호출
entityManager.flush();

// Transaction이 Commit 시 자동으로 flush 호출
transactional.commit();

// Commit과 마찬가지로 JPQL 쿼리 실행 시 자동으로 flush 호출
entityManager.createQuery("select u from Users u where u.age = 20");

Entity LifeCycle Stages

JPA Entity의 상태는 4가지로 분류할 수 있다.
EntityManager로 구현된 코드와 함께 4가지의 상태를 살펴보자.
(우리나라 명칭보단 영어 명칭이 직관적이여서 이해하기 쉬움)

1. New / Transient (비영속)

  • Entity는 생성했지만, 아직 영속성 컨텍스트에 저장되지 않은 상태이다.
Users entity = new Users();

2. Managed / Persistent (영속)

  • 영속성 컨텍스트에 저장되어 관리되고 있는 상태이다.
// New -> Persistent
entityManager.persist(entity);

// Detached -> Persistent
entityManager.merge(entity);

3. Detached (준영속)

  • 영속성 컨텍스트와 저장된 Entity가 분리된 상태이다.
  • 더이상 영속성 컨텍스트에 의해 관리되지 않는다.
  • 쉽게 생각하면 ID 값이 존재하는 Entity로 볼 수 있다. (단, 기본키 자동 생성 전략을 사용할 때)
// Entity를 영속성 컨텍스트에서 분리하여 준영속 상태로 만듦
entityManager.detach(entity);

// 영속성 컨텍스트를 비워 저장된 Entity를 준영속 상태로 만듦
entityManager.clear();

// 영속성 컨텍스트를 종료시켜 저장된 Entity를 준영속 상태로 만듦
// Transaction이 끝나고 동작
entityManager.close();

4. Removed (삭제)

  • 저장된 Entity를 영속성 컨텍스트와 DB에서 제거한 상태이다.
entityManager.remove(entity);

참고

JPA Entity 상태 설명
영속성 컨텍스트의 설명 및 그림
Entity Lifecycle 그림
EntityManager의 메소드 설명

profile
개발에 대한 기록과 복습을 위한 블로그 | Back-end Developer

0개의 댓글