이 글은 김영한님의 "자바 ORM 표준 JPA 프로그래밍" 3장 영속성 관리 부분을 읽고 정리한 포스트입니다!!
영속성 컨텍스트란❓
엔티티를 영구 저장하는 환경이다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
엔티티의 상태
비영속: 영속성 컨텍스트와 전혀 관계가 없는 상태
영속: 영속성 컨텍스트에 저장된 상태
준영속: 영속성 컨텍스트에 저장되었다가 분리된 상태
삭제: 삭제된 상태.
여기서 영속 상태라는 것은 "영속성 컨텍스트"에 의해 "관리"되는 엔티티라는 것이다.
영속성 컨텍스트 특징
1. 영속성 컨텍스트는 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)을 가져야 한다.
- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하기 때문에, 반드시 식별자 값이 존재해야한다!!!
2. 영속성 컨텍스트에 엔티티는 언제 데이터 베이스에 저장될까?
- 트랜잭션이 커밋하는 순간 flush를 통해서 데이터 베이스에 저장된다.
- flush는 직접 호출하거나, 트랜잭션 커밋 시 호출하거나 JPQL 쿼리 실행시 자동 호출 된다.
3. 영속성 컨텍스트가 엔티티를 관리하면 어떤 장점이 있을까?
- 1차 캐시
- 동일성 보장(실제 인스턴스가 같다. 참조 값 비교시 true)
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지
- 지연 로딩
장점들 알아보기🧐
1. 1차 캐시
영속성 컨텍스트는 내부에 캐시를 가지고 있다. 영속 상태의 엔티티는 모두 이곳에 저장된다.
Id와 Entity로 이뤄진 맵으로 존재한다. 동일한 transaction내에서 값을 조회했을 때, 먼저 1차 캐시에 값이 있는 지 찾아본다.
만약, 있다면 해당 값을 가져오고 만약 없다면 값을 데이터 베이스에 가서 가져오고 1차 캐시에 저장한다.
2. 쓰기 지연 제공
영속성 컨텍스트에 관리되고 있는 값들이 등록, 수정, 삭제 등이 읽어나면, 바로 데이터베이스에 반영하는 것이 아니고, 쓰기 지연 SQL 저장소에 쿼리를 저장을 한다. 그리고 transaction이 끝나고 commit이 되어야 할 때, 쓰기 지연 SQL 저장소에 있는 쿼리를 데이터 베이스에 보내고 반영한다.
3. 변경 감지
JPA는 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해 둔다. 플러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다. 그래서, 따로 update를 시켜주지 않아도, 변경 감지를 통해 값이 변한 엔티티는 update query가 나간다. 이때, update는 바뀐 부분만 나가는 것이 아니라 모든 필드에 대해서 나간다.
Reference
- 자바 ORM 표준 JPA 프로그래밍 - 김영한님 지음
'✍🏻study > 📒 jpa' 카테고리의 다른 글
JPA N+1 문제 (0) | 2022.03.29 |
---|---|
연관 관계 편의 메소드❓ (0) | 2022.03.24 |