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 |