JPA :: Persistence Context

태그
Java
Spring
날짜
2025/01/27
2 more properties

영속성 컨텍스트란?

JPA에서 가장 중요한 개념

영속성 컨텍스트(Persistence Context)

Entity를 영구히 저장하는 환경이라는 뜻
눈에 보이지 않는 논리적 개념
Application과 DB 사이 객체를 보관하는 가상의 저장소
EntityManager를 통해 Entity를 영속성 컨텍스트에 보관, 관리

EntityManager

EntityManager를 통해 영속성 컨텍스트에 접근하고 관리.
EntityManager를 생성하면 그 안에 영속성 컨텍스트가 있음.
EntityManager는 내부적으로 Connection 사용하여 DB 접근
Entity 저장:
EntityManager.persist(entity)
Java
복사
Data를 영속성 컨텍스트에 저장
Entity를 영속화 하겠다는 의미.
DB에 저장하는 것과는 다른 개념이다.
Spring에서 Entity Manager 여러 개, 영속성 컨텍스트 1개 존재
Entity Manager: 영속성 컨텍스트 = N : 1

EntityManagerFactory

DB를 하나만 사용하는 APP은 일반적으로 하나의 EntityManagerFactory만 사용한다.
EntityManager가 필요할 때 마다 EntityManagerFactory에서 EntityManager를 생성하여 사용한다.
EntityManagerFactory를 생성하는 비용은 상당히 크다.
하지만 EntityManager를 생성하는 비용은 거의 들지 않는다.
App 전체에 한 개의 EntityManagerFactory를 만들어서 사용하도록 설계되어 있다.

Multi Thread 이슈

EntityManagerFactory는 여러 Thread가 동시에 접근해도 안전하다.
EntityManager는 여러 Thread가 접근 시 동시성 문재가 발생한다.
EntityManager는 절대 Thread간 공유를 해선 안된다.
@PersistantContext Annotation을 사용하여 Thread간 공유를 막을 수 있다.

EntityManager 생성

EntityManagerFactory
설정 파일(ex. Persistence.xml)에서 작성한 persistence-unit(DB 설정 정보)로 생성.
Entity Manager
위에서 생성한 EntityManagerFactory 에서 생성 가능
// hello는 psersistence-unit 이름 EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // 이를 통해 엔티티를 영속성 컨텍스트에 관리 가능 EntityManager em = emf.createEntityManager();
Java
복사

Entity의 생명주기

Entity는 EntityManager를 통해 영속성 컨텍스트에 보관, 관리, 제거된다.

비영속 (new)

Member member = new Member(); // 엔티티(객체) 생성
Java
복사
객체 생성.
Entity가 영속성 컨텍스트에 없는 상태.

영속 (managed)

em.persist(member)
Java
복사
Entity를 영속성 컨텍스트에 저장.
즉, 영속성 컨텍스트가 Entity를 관리

준영속 (detached)

em.detach(member)
Java
복사
Entity가 영속성 컨텍스트에 저장되었다가 분리된 상태
Entity가 영속 상태에서 준영속 상태로 간 상태
영속성 컨텍스트가 Entity를 관리하지 않음
영속성 컨텍스트가 제공하는 기능은 사용하지 못함.
준영속 상태로 만드는 방법
// 특정 Entity만 준영속 상태로 변환 em.detach(entity); // 영속성 컨텍스트 초기화 em.clear(); // 영속성 컨텍스트 종료 em.close();
Java
복사

삭제 (removed)

em.remove(member);
Java
복사
영속성 컨텍스트에 있는 Entity를 삭제
이 때 DB에서도 삭제
Transaction이 끝나거나, EntityManager가 Flush되면 삭제된다.