JPA의 목적
Java의 컬렉션 다루듯이 엔티티를 다루고 싶다.
이를 위해 존재하는 개념이 영속성 컨텍스트
영속성 컨텍스트(=Entity Manager)
영속성 컨텍스트는 애플리케이션과 DB사이 엔티티를 관리하고 저장하는 논리적 영역이다.
애플리케이션과 DB사이 한 단계가 더 있다고 생각하면 쉽다.
크게 1차 캐시와 쓰기 지연 SQL 저장소로 구성되어있다.

엔티티 생명주기(=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 |