본문 바로가기
Spring

JPA 영속성 컨텍스트

by BottleCoffin 2022. 8. 12.

jpa에서 중요한 2가지(객체와테이블 매핑/영속성컨텍스트)

영속성 컨텍스트는 엔티티를 영구 저장하는 환경
영속성 컨텍스트를 통해서 엔티티를 영속화
엔티티 매니저를 생성하면 그 안에 1대1로 연결된 영속성 컨텍스트가 생성되고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다.
엔티티 매니저를 생성하고 persist함수를 통해 영속성 컨텍스트에 저장하고 flush로 데이터베이스와 동기화, commit을 통해 영구적으로 데이터베이스에 저장합니다.

 

@flush는 영속성 컨텍스트를 비우는 것이 아니라 쿼리가 디비에 전달되고 커밋을 하면 반영된다.

아직 트랜잭션 commit이 안되 상태이기 때문에, 에러가 발생할 경우 롤백 가능.

 



영속성 컨텍스트의 특징

1. 1차 캐시를 통해 캐싱
조회 시에 1차캐시를 우선적으로 확인하고 1차캐시에 데이터가 없다면 DB에서 조회해서 1차캐시에 저장

 

2. 동일성 보장
영속성 컨텍스트는 싱글톤으로 관리하기 때문에 동일성이 보장된다.
= 1차 캐시로 반복 가능한 읽기(REPEATABLE READ)등급의 트랜잭션 격리 수준을 테이터베이스가 아닌 애플리케이션 차원에서 제공

3. 트랜잭션을 지원하는 쓰기지연
객체를 persist하면 1차캐시에 저장이 되고 동시에 쓰기 지연 SQL 저장소에 쌓아두게 되고,
flush를 통해서 데이터베이스에 쿼리를 날리기 때문에 쓰기 지연을 통한 버퍼링이 가능

 

4. 변경감지
트랜잭션 커밋할 때 엔티티와 스냅샷을 비교한다.
1차 캐시 안에 id랑 엔티티 그리고 값을 읽어온 최초 시점의(영속성 컨텍스트에 드러왔을 때의 상태) 상태를 저장한 스냅샷이 있는데 flush를 호출하면 엔티티와 스냅샷을 비교해서 다를 경우에 update 쿼리를 쓰기지연 저장소에 추가하고 데이터베이스에 반영하는 더티체킹이 가능

=> update를 통해 객체의 상태를 변경 후 persist() 함수를 호출할 필요가 없다.


5. 지연로딩
연관관계 맵핑되어 있는 엔티티를 조회 하면 프록시 객체를 반환하고 필요시에 실질적으로 데이터를 조회해서 가져온다.
 getReference 함수를 호출하면 프록시를 위한 객체를 생성하고 이 객체는 target이라는 필드를 갖는데 실제 객체의 참조를 저장하고 있다.



'Spring' 카테고리의 다른 글

빈 생명주기 콜백  (0) 2022.09.01
의존관계 자동 주입  (0) 2022.08.31
Spring Transaction  (0) 2022.07.23
애플리케이션 구조  (0) 2022.07.23
spring DB  (0) 2022.07.23

댓글