moon
sun

JPA :: Persistence Context

태그
Java
Spring
3 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되면 삭제된다.