- [JPA] 10. 영속성 컨텍스트2024년 09월 30일
- Song hyun
- 작성자
- 2024.09.30.:16
728x90반응형[JPA] 10. 영속성 컨텍스트
1. 영속성 컨텍스트란?
-영속성 컨텍스트(Persistence Context)는 엔티티 객체들을 관리하고, DB와의 상태를 동기화하는 일종의 저장소이다.
=> 쉽게 말해, 애플리케이션이 실행되는 동안 DB에서 가져온 엔티티 객체들을 임시로 보관래두는 메모리 공간이다!
=> 이 공간에 있는 객체들은 영속 상태로 관리되고, 이 상태에 있는 동안 엔티티 객체의 변화는 자동으로 DB에 반영된다.
2. 엔티티 매니저와 영속성 컨텍스트의 관계
- 엔티티 매니저: 엔티티 매니저는 JPA에서 제공하는 주요 인터페이스로, 영속성 컨텍스트를 통해 엔티티의 생명 주기를 관리한다. 엔티티 매니저는 엔티티 CRUD를 수행하며, 이는 영속성 컨텍스트 내에서 이뤄진다.
- 영속성 컨텍스트: 엔티티 매니저가 관리하는 엔티티 객체들을 저장하고 관리하는 공가니앋. 이 컨텍스트는 DB와 동기화되며, 엔티티 객체의 상태를 추적한다.
- 엔티티: 영속성 컨텍스트에 의해 관리되는 자바 객체이다. 엔티티가 영속성 컨텍스트에 포함될 때, 이를 영속 상태라고 한다.
3. 엔티티의 4가지 상태
- 비영속 상태: 엔티티가 영속성 컨텍스트와 전혀 연관되지 않은, 단순히 자바 객체로만 존재하며 DB와 연결되지 않은 상태!
- 영속 상태: 엔티티가 영속성 컨텍스트에 의해 관리되는 상태이다. 이 때는 엔티티가 DB의 레코드와 매핑되어 있으며, 엔티티의 상태 변화가 자동으로 DB에 반영된다.
- 준영속 상태: 엔티티가 한 번 영속 상태였지만, 더이상 영속성 컨텍스트에 의해 관리되지 않는 상태이다. 엔티티 매니저는 준영속 상태의 엔티티를 더이상 추적하지 않고, 변경 상태도 반영되지 않는다. (entityManager.clear(), detach(), close())
- 삭제 상태: 엔티티가 영속성 컨텍스트에 의해 관리되지만, 삭제가 예약된 상태이다. 트랜잭션이 커밋되면 해당 엔티티는 DB에서 삭제 된다.
4. 영속성 컨텍스트의 기본적인 특징
(1) 1차 캐시(First-Level Cache)
- 영속성 컨텍스트는 내부에 1차 캐시를 지니고 있다.
- 이때 캐시의 키는 엔티티의 @Id 어노테이션이 달린 기본 키 역할을 하는 식별자이며, 값은 엔티티이다.
*1차 캐시의 동작 순서
- 엔티티를 조회하면 1차 캐시에서 데이터를 조회하고, 값이 있다면 반환한다.
- 만약 값이 없다면 DB에서 조회해 1차 캐시에 저장한 다음 반환한다.
- 이를 통해 데이터를 조회할 때 DB를 거치지 않아도 되기 때문에, 빠르게 조회할 수 있다!
(2) 쓰기 지연(Write Delay)
- 쓰기 지연은 영속성 컨텍스트가 데이터베이스에 직접적으로 즉시 쿼리를 보내지 않고, 트랜잭션이 커밋될 때 까지 쿼리들을 모아 처리하는 기법이다.
- 이를 통해 성능을 최적화하고, 트랜잭션 내에서 데이터의 일관성을 유지하는 데 중요한 역할을 한다.
(3) 변경 감지(Dirty Checking)
- 트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해, 변경된 값이 있다면 변경 사항을 감지한다. 변경된 값은 DB에 자동 반영한다.
- 이를 통해 쓰기 지연과 마찬가지로, 적당한 묶음으로 쿼리를 요청할 수 있고, 시스템의 부담을 줄인다.
*트랜잭션 커밋 시..
- JPA는 변경 감지를 통해 1차 캐시의 엔티티와 DB의 엔티티를 비교한다.
- 변경 사항이 있다면 해당 엔티티에 UPDATE 쿼리를 생성하고, 트랜잭션 커밋 시에 DB에 반영한다.
- => 쓰기 지연과 결합해 효율적으로 쿼리를 처리할 수 있다!
(4) 지연 로딩 (Lazy Loading)
- 지연 로딩은 쿼리로 요청한 데이터를 애플리케이션에서 바로 로딩하는 것이 아니라, 필요할 때 쿼리를 날려 데이터를 조회하는 것을 의미한다.
- 객체 초기화 시점: JPA에서 엔티티를 조회할 때, 연관된 다른 엔티티/컬렉션에 대해 실제 데이터를 즉시 로드하지 않고, 해당 객체에 대한 프록시 객체(가짜 객체)를 대신 반환한다.
- 필요할 때 데이터 조회: 연관된 객체나 컬렉션의 데이터가 실제로 접근되는 시점에서 DB에서 쿼리가 실행되며, 필요한 데이터를 가져온다.
- 성능 최적화: 지연 로딩을 통해 초기화 시점에서 불필요한 DB 접근을 방지하고, 메모리 사용량을 줄일 수 있다.
(5) 즉시 로딩(Eager Loading)
- 지연 로딩의 반대 개념은 즉시 로딩이라는 개념이 있다.
- 엔티티를 조회할 때, 연관된 모든 데이터도 함께 즉시 로드되는 방식이다.
- => 즉, 엔티티가 처음 조회되는 시점에 그와 관련된 모든 연관 엔티티들도 한꺼번에 DB에서 조회된다.
728x90반응형'JPA' 카테고리의 다른 글
[JPA] 11. 단방향, 양방향 매핑에 대한 이해 (0) 2024.09.30 [JPA] *Springboot Starter Project - 프로젝트 설정하기 (1) 2024.09.30 [JPA] 9. 엔티티 매니저와 영속성 컨텍스트 (0) 2024.09.30 [JPA] 8. JPA와 하이버네이트란? (0) 2024.09.30 [JPA] 7. 스프링 부트 DB 접근 기술 ORM (0) 2024.09.30 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)