티스토리 뷰
영속성 컨텍스트란?
- Entity를 영구 저장하는 환경
- 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 같은 역할
- EntityManager를 통해 영속성 컨텍스트에 접근하고 관리할 수 있음
- EntityManager를 통해 Entity를 저장하거나 조회하면, EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리함
→ persist 메서드를 통해 영속성 컨텍스트에 저장 - EntityManager는 여러 Thread가 동시에 접근하면 동시성 문제가 발생할 수 있음
- EntityManager를 통해 Entity를 저장하거나 조회하면, EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리함
영속성 컨텍스트의 장점
- 동일성(identity) 보장
- 마치 자바 컬랙션에서 조회하듯이, JPA가 영속 Entity의 동일성을 보장해줌
- Entity를 조회해올 때 1차 캐시부터 뒤져서 해당되는 Key값을 가진 Entity가 있으면 조회해옴
- 1차 캐시에 없다면, 그때 DB에 조회 쿼리르 날려서 조회 후 1차 캐시에 저장
→ Key; @Id (DB pk로 매핑한 필드)
→ Value; @Entity (JPA가 관리하는 Entity 객체)
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- persist 메서드를 통해 Entity를 1차 캐시에 넣음
- 해당 Entity를 분석하여 SQL을 생성
- 생성한 SQL을 쓰기 지연 SQL 저장소에 쌓아둠
- 트랜잭션 커밋 시 쓰기 지연 SQL 저장소에 있던 쿼리들이 flush되면서 DB에 반영
- 따라서, SQL 최적화 여지가 생기는 이점을 가짐
- 변경감지 (Dirty Checking)
- save 메서드만으로 내부 변경점을 알아서 update해주는 기능
- 영속성 컨텍스트 flush 메서드가 호출되면, JPA는 1차 캐시에 저장된 Entity와 스냅샷을 비교
→ 스냅샷; 최초로 1차 캐시에 들어온 상태를 저장해둔 것
→ flush 메서드는 영속성 컨텍스트를 비우지 않음, 단지 변경 내용을 DB에 동기화하는것 - 다른 부분이 있다면 JPA는 UPDATE 쿼리를 쓰기 지연 SQL 저장소에 저장
- 변경 감지 관련 유의점 참고
- 지연 로딩 (Lazy Loading)
Entity의 생명주기
- 비영속 (New)
- 객체 생성 후 영속성 컨텍스트에 저장되지 않은 상태
→ 단순히 자바 객체를 생성하고 초기화만 해준 상태 - JPA가 관리하지 않음
- 객체 생성 후 영속성 컨텍스트에 저장되지 않은 상태
- 영속 (Managed)
- persist 메서드를 통해 영속성 컨텍스트 안에서 관리되고 있는 Entity 객체
- 준영속 (Detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 (Removed)
'Spring' 카테고리의 다른 글
Spring Boot의 다중 요청 처리 (+서블릿 컨테이너) (0) | 2022.05.23 |
---|---|
JUnit 4와 5 비교 (0) | 2022.05.16 |
Redisson 분산락 (0) | 2022.04.27 |
컴포넌트 스캔과 수동 Bean 등록 (0) | 2022.04.24 |
OSIV (0) | 2022.04.24 |