본문 바로가기

PROGRAMMING/JPA

[JPA] Entity Manager & Entity Life Cycle

JPA의 목적

Java의 컬렉션 다루듯이 엔티티를 다루고 싶다.

이를 위해 존재하는 개념이 영속성 컨텍스트

영속성 컨텍스트(=Entity Manager)

영속성 컨텍스트는 애플리케이션과 DB사이 엔티티를 관리하고 저장하는  논리적 영역이다.

애플리케이션과 DB사이 한 단계가 더 있다고 생각하면 쉽다. 

크게 1차 캐시와 쓰기 지연 SQL 저장소로 구성되어있다. 

엔티티 생명주기(=Entity  Life Cycle)

영속성 컨텍스트에서 엔티티를 관리하는데 각 상태에 따라 생명주기가 형성된다.

 

Entity Life Cycle

비영속 (New / Transient) : 영속성 컨텍스트와 관계가 없는 새로 생성된 상태

영속 (Managed) : 영속성 컨텍스트에서 관리되는 상태

준영속 (Detached) : 영속성 컨텍스트에서 관리되다 분리된 상태

삭제 (Removed) : 삭제된 상태 

영속성 컨텍스트의 이점

1. 1차 캐시

같은 트렌젝션 안에서 조회를 할 때 DB로 다이렉트 접근&조회가 아니라

1차 캐시에서 조회 -> 없으면 DB 조회하는 과정을 거친다는 것이다.

 

2. 동일성 보장

같은 엔티티를 ==으로 비교 가능하게 해 준다.

이는 1차 캐시에서 엔티티를 관리하기 때문에 가능한 부분이다.

1차 캐시는 Map 구조로 엔티티의 ID & 엔티티 이렇게 구성되어있는데, 1차 캐시에서 엔티티를 조회할 경우 마치 같은 레퍼런스를 가진 자바 객체를 비교하는 것과 같이 == 비교가 가능해진다.

 

3. 쓰기 지연

쓰기 지연 SQL 저장소를 활용하면, 버퍼링을 모아서 한 번에 Data를 DB에 쓸 수 있다.

(배치 활용 가능)

4.Dirty Checking (= 변경 감지)

영속 엔티티의 데이터를 수정한 후 update 명령을 따로 실행하지 않아도 알아서 반영이 된다.

변경 감지의 원리는 데이터를 변경한 후 flush가 발생하면

데이터 변경 전 1차 캐시의 스냅샷과 현재와 비교를 해서 update 쿼리를 쓰기 지연 SQL저장소에 생성하고 DB에 반영하게 된다.

'PROGRAMMING > JPA' 카테고리의 다른 글

[JPQL] 페이징 처리  (0) 2021.12.03
[JPQL] JPQL과 기본문법  (0) 2021.12.01
[JPA] 고아 객체 (Orphan Entity)와 orphanRemoval  (0) 2021.09.12
[JPA] 지연 로딩과 즉시 로딩  (0) 2021.09.11
[JPA] Persist 시점 에러  (0) 2021.09.06