[Spring, JPA] JPA Persistence ContextWeb_Backend/Spring2023. 5. 28. 14:05
Table of Contents
JPA Persistence Context과 제공하는 기능
영속성이란?
📌 사전 : 영원히 계속되는 성질이나 능력 dev : 애플리케이션의 상태와 상관없도록 물리적인 저장소를 이용해 데이터를 저장하는 행위.
Persistence Context란?
📌 영속성 컨텍스트(Persistence Context)는 영속화되어있는 entity identity에 대해 unique 한 entity 인스턴스가 존재하는 entity 인스턴스의 집합.
즉, entity의 영속화에 관여하며, entity들이 DB로 바로 가지 않고 entity를 저장하는 환경으로서의 역할을 함.
- 아래와 같은 방법으로 영속성 컨텍스트에 접근 가능
EntityManager.persist(entity);
- 영속성 컨텍스트 특징
- 식별자 값(id)이 있어야 한다
- flush(플러시) : 영속성 콘텍스트의 변경내용을 데이터베이스에 반영하는 것
- 커밋이 될 때 자동으로 발생하지만 실제로는 플러시 다음에 실제 커밋이 일어난다
- JPA는 트랜잭션 커밋 시(entityManager.flush()로 직접 호출하거나 JPQL 쿼리 실행으로 자동 호출하는 방법도 있음) 영속성 콘텍스트에 새로 저장된 엔티티를 DB에 반영
- 플러시로 인해 영속성 컨텍스트가 비워지는 것은 아님
- 영속성 컨텍스트의 변경 사항들과 DB의 상태를 맞추는 작업으로 영속성 컨텍스트의 변경 내용을 DB에 동기화
- 1차 캐시는 그대로 유지되지만, dirty checking(변경 감지)이 일어나고 쓰기 지연 저장소(등록, 수정, 삭제 쿼리 저장소)가 비워짐.
영속성 컨텍스트의 이점
- 1차 캐시 : 식별자를 통해 검색할 시 DB에서 값을 조회하는 과정(Sql 쿼리를 db에 날리는 작업)을 생략. (식별자가 아닌 방법으로 조회 시 DB로 쿼리 발송)
- id가 1인 User 엔티티를 1차 캐시에서 찾는다.
- (1차 캐시에 해당 엔티티가 없으면) DB에 접근해 값을 조회한다.
- 다음 조회 요청에서 재사용 할 수 있도록 1차 캐시에 엔티티 값을 저장한다.
- 애플리케이션에 엔티티 값을 반환한다.
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 영속성 컨텍스트에 변경이 발생했을 때, (영속성 콘텍스트에 엔티티가 들어왔을 때) 바로 데이터 베이스에 쿼리를 보내지 않고 SQL 쿼리를 쓰기 지연 저장소(버퍼)에 모아 놨다가, 영속성 컨텍스트가 flush 하는 시접에 모아둔 SQL 쿼리를 데이터베이스로 보내는 기능
- Dirty Checking 변경 감지
- 엔티티를 조회하면 해당 엔티티를 조회 상태 그대로 1차 캐시에 스냅숏
- flush 될 때 이 스냅숏과 엔티티 객체를 비교
- 변경이 되었으면 update 쿼리를 쓰기 지연 저장소에 생성
- Lazy Loading 지연 로딩
- 1:N 관계
- 로딩시점 : 프락시로 생성
- 실제 사용되는 시점 : 초기화(쿼리 발생)
영속성 콘텍스트와 find
영속성 컨텍스트와 update
영속성 콘텍스트(PersistContext) Type
- Transaction-scope persistence context
- transaction에 바이딩 됨
- transaction이 완료되는 즉시 영속성 콘텍스트에 있는 entity들은 영구 스토리지 즉 DB로 flush 됩니다
- Extended-scope persistence context
- 영속성 콘텍스트가 multiple transaction에 걸쳐서 존재
- transaction 없이 entity를 영속성컨택스트에 유지시킬 수는 있지만 transaction 없이 DB에 Flush 할 수는 없음
참고자료
OracleDoc에서 설명하는 영속성 콘텍스트(PersistenceContext)
'Web_Backend > Spring' 카테고리의 다른 글
Spring boot Gradle 프로젝트는 Build시에 Test를 실행할 까?(Feat.. jacoco CI 적용일지) (0) | 2023.12.26 |
---|---|
[Servlet] Dispatcher Servlet (0) | 2023.05.28 |
[Spring] Spring AOP(Aspect Oriented Programming) (2) | 2023.05.28 |
[JSTL] JSTL(JSP Standard Tag Library)란? (1) | 2022.03.23 |
spring Mysql connector 연결하기 (0) | 2022.03.08 |
@Yanako :: Yana's coding story
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!