[JPA] 영속성 관리 - 내부 동작 방식
[JPA] 영속성 관리 - 내부 동작 방식
김영한 ‘자바 ORM 표준 JPA 프로그래밍 - 기본편’을 보고 정리한 내용입니다.
1. JPA에서 가장 중요한 2가지
1
2
1. 객체와 관계형 데이터베이스의 매핑 이해
2. 영속성 컨텍스트의 개념과 동작 방식
2. 영속성 컨텍스트
- 의미: 엔티티를 영구 저장하는 환경
- 접근 방법: 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. (
EntityManager.persist(entity)
) - 특징: 영속성 컨텍스트는 논리적인 개념이고, 눈에 보이지 않는다.
2.1 엔티티의 생명 주기
1
2
3
4
1. 비영속: 단순히 객체를 생성한 상태. 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다.
2. 영속: 영속성 컨텍스트에 의해 관리되는 상태
3. 준영속: 한번 영속되었지만, 영속성 컨텍스트에서 분리된 상태
4. 삭제: 삭제된 상태
중요한 점: 쿼리가 날라가는 시점은 트랜잭션을 커밋할 때이다.
3. 영속성 컨텍스트의 이점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지
- 지연 로딩
3.1 엔티티 조회, 1차 캐시
- 엔티티를 persist()하면 영속성 컨텍스트 내부의 1차 캐시에 저장된다.
- 조회 시 DB 접근 전 1차 캐시를 먼저 확인한다.
- 만약 1차 캐시에 없다면, DB에서 조회하고, DB에 있다면 1차 캐시에 저장하고 반환한다.
- 1차 캐시는 데이터베이스 한 트랜잭션 안에서만 관리된다.
3.2 영속 엔티티의 동일성 보장
- 같은 트랜잭션 안에서 같은 ID로 조회한 엔티티는 동일한 인스턴스(
==
)로 반환된다. - 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션에서 제공한다.
3.3 엔티티 등록 - 쓰기 지연
- JPA는 트랜잭션 커밋 전까지 SQL을 모아두었다가 한 번에 전송한다.
- INSERT 쿼리도 쓰기 지연 SQL 저장소에 보관 후, 커밋 시 실행한다.
3.4 엔티티 수정 - 변경 감지
- JPA는 스냅샷(초기 상태 복사본)을 보관한다.
- 1차 캐시에는 id, Entity, 스냅샷이 존재한다.
- 커밋 시 엔티티와 스냅샷을 비교하여 변경된 필드를 감지한다.
- JPA가 엔티티와 스냅샷 일일이 비교한다.
- 변경 사항이 있으면
UPDATE
쿼리를 쓰기 지연 SQL 저장소에 등록하고, 커밋 시 실행한다.
4. 플러시(Flush)
4.1 플러시란?
플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영하는 과정.
4.2 동작 과정
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)
4.3 영속성 컨텍스트를 플러시 하는 방법
em.flush()
- 직접 호출- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
참고: 플러시를 해도 1차 캐시는 유지된다.
5. 준영속 상태
5.1 준영속 상태란?
- 영속 상태 엔티티가 영속성 컨텍스트에서 분리되는 것
- 즉, JPA에서 관리되지 않게 된다.
- 직접 쓸일은 거의 없다고 한다.
5.2 준영속 상태로 만드는 방법
em.detach()
: 특정 엔티티만 준영속 상태로 전환em.clear()
: 영속성 컨텍스트를 완전히 초기화em.close()
: 영속성 컨텍스트를 종료
This post is licensed under CC BY 4.0 by the author.