JPA는 왜 Java "Persistence" API인가? 바로 Persistence Context를 사용하기 때문.

 

 

맨 처음 웹 애플리케이션이 실행되면 EntityManagerFactory라는 녀석이 생성되고 그 후 사용자의 요청이 들어올 때마다 각각의 EntityManager를 만들어서 요청을 수행한다.

 

Persistence Context (영속성 컨텍스트)는 이 EntityManager안에 들어있는 녀석인데 이것이 자바 코드와 DB 사이에서 중간자 역할을 한다.

 

굳이 의미를 풀자면 "엔티티를 영구적으로 저장하는 환경" 정도가 된다.

 

객체를 엔티티로서 디비에 저장하거나 디비의 엔티티를 객체로 가져오는 명령을 내릴 때 해당 엔티티틑 영속성 컨텍스트 안에 존재하고 있다가 트랜잭션 커밋이 이뤄질 때 쿼리를 DB에 전달하여 동작을 완전히 수행한다.

 

이러한 영속성 컨텍스트 안에서 엔티티는 네 가지 생명주기를 갖는다.

 

1. 비영속 (new / transient)

-> 영속성 컨텍스트와 전혀 관계가 없는 상황. 새로 생성한 객체를 em.persist() 하기 전 이 객체는 '비영속' 상태에 해당된다.

2. 영속성 (managed)

-> 영속성 컨텍스트 안에서 관리되고 있는 상태. em.persist()를 하고난 이후의 객체가 '영속성' 상태에 해당된다.

3. 준영속 (detached)

-> 영속성 컨텍스트 안에 존재하다가 분리된 상태. em.persist(member)로 영속성 컨텍스트 안에 들어갔다가 em.detach(member)로 다시 분리하면 이때의 상태가 '준영속' 상태에 해당된다.

4. 삭제 (removed)

-> 객체를 완전히 삭제한 상태. 영속성 컨텍스트 안에 존재하는 객체에 대해 em.remove(member)하여 객체를 삭제하면 이 때의 상태가 '삭제' 상태이다.

 

비영속 상태와 준영속 상태는 같은 것이 아닌가 싶었는데 그에 대한 해답을 아래 링크에서 찾을 수 있었다.

www.inflearn.com/questions/45195      

 

 

 

영속성 컨텍스트 안에는 1차 캐시가 존재하여 캐싱을 지원한다.

그렇긴 한데 이게 실제 상황에서 그렇게 큰 시간절약을 이루어주지는 않는다고 한다.

'김영한님 스프링 강의 정리 > JPA' 카테고리의 다른 글

연관관계 매핑과 관계의 주인  (0) 2021.02.21
기본 키 매핑 전략 - IDENTITY, SEQUENCE  (0) 2021.02.21
Flush에 대해  (0) 2021.02.19
JPQL이란?  (0) 2021.02.19
ORM과 JPA란?  (0) 2021.02.19

+ Recent posts