Spring Framwork
JPA 영속성 컨텍스트
by orioncsy
2023. 3. 31.
JPA 영속성 컨텍스트
영속성 컨텍스트
개념
- 엔티티를 영구적으로 저장하는 환경
- 애플리케이션과 데이터베이스 사이에 객체를 보관하는 가상의 DB 역할을 제공
- 엔티티 매니저를 통해 저장 및 조회
엔티티 생명 주기
- 비영속
- 객체는 생성되었지만 영속성 컨텍스트와 관련 없는 경우
- 영속
- 준영속
- 영속성 컨텍스트에 저장되었다 더 이상 관리되지 않는 상태
- detach()를 통해 준영속으로 만들 수 있고, clear()나 close()를 통해 컨텐츠를 비우거나 종료해도 준영속으로 속한다.
- 삭제
- 영속성 컨텍스트와 데이터베이스에서 삭제
- remove()를 통해 구현
영속성 컨텍스트 특징
1차 캐시
- 영속성 컨텍스트 내에 엔티티를 저장하는 공간
- 키는 식별자, value는 인스턴스
- 객체를 추가할 때 1차 캐시에 저장이 되고 조회할 때도 1차 캐시를 먼저 조회하며, 1차 캐시에 존재하지 않는 경우 DB에서 조회하고 1차 캐시에 저장
동일성 보장
- 영속성 컨텍스트 내에 있는 엔티티는 값이 같을 뿐만 아니라 주소값도 같은 동일성을 보장한다.
트랜잭션을 지원하는 쓰기 지연
- sql문을 사용했을 때 바로 db에 적용하는 것이 아니라 쓰기 지연 저장소에 sql문을 저장하고 commit될 때 한 번에 적용된다.
변경 감지
- 엔티티를 수정하였을 때 엔티티를 지우는 것이 아니라 변경 내용을 DB에 동기화시킨다.
- flush를 통해 작동
- 트랜잭션을 커밋하면 엔티티 매니저 내부에서 flush 작동
- 기존 엔티티를 상태인 스냅샷과 엔티티를 비교하여 변경된 엔티티를 찾는다.
- 변경 사항이 있다면 수정 sql 문을 작성해서 쓰기 지연 저장소에 저장
- 쓰기 지연 저장소에 있는 sql문을 실행하고 커밋된다.
지연 로딩
- 트랜잭션이 실행될 때 연관 관계가 매핑되어 있는 부분은 필요할 때 query문을 날려서 처리하도록 작동
Reference
https://velog.io/@neptunes032/JPA-영속성-컨텍스트란