이전 내용과 더불어 영속성 콘텍스트의 기능에 대해 알아보자.
- 1차 캐시
영속성 콘텍스트는 내부적으로 캐시 저장소를 가지고 있다.
- 우리가 저장하는 Entity 객체들이 1차 캐시 (캐시 저장소)에 저장된다고 생각하면 된다.
- 캐시 저장소는 Map 자료구조 형태로 되어있고, key에는 @Id로 매핑한 기본 키 value에는 해당 Entity 클래스의 객체를 저장한다. key에 저장한 식별자 값을 사용하여 Entity 객체를 구분하고 관리한다.
- 만약 캐시 저장소에 조회하는 id가 존재하지 않는다면 저장 후에 조회를 한다.
- 삭제할 Entity를 조회한 후, 캐시 저장소에 없다면 DB에 조회해서 저장한 뒤 Entity를 DELETED 상태로 만든 후 트랜잭션 commit 후 삭제된다.
User user = new User(); // 저장할 Entity 객체를 생성
user.setId(1L); // 식별자 값을 넣어줌
em.persist(user); // EntityManager에 저장
1차 캐시 기능으로 데이터베이스 조회 횟수를 줄여주게 된다. =>
데이터베이스에서 데이터 조회를 시도했을 때 해당 값이 있으면 조회를 중복하지 않는다.
- 쓰기 지연 저장소
영속성 콘텍스트에 Entity를 모아서 한 번에 DB에 반영한다.
- 쓰기 지연 저장소에 insert, delete, update가 자동으로 담기게 되고, commit을 하기 전에 모든 상태가 저장된다.
- flush 메서드는 영속성 콘텍스트의 변경 내용을 DB에 반영하는 역할을 한다. 즉, actionQueue의 sql들을 데이터베이스에 요청을 해준다.
- insert, delete, update 등 데이터를 변경하는 SQL을 DB에 요청 및 반영하기 위해선 트랜잭션 환경이 필요하다
- 변경 감지
영속성 콘텍스트에 저장된 Entity가 변경될 때마다 Update가 쓰기 지연 저장소에 저장된다면
하나의 SQL로 처리할 수 있는 상황을 여러 번 요청하기 때문에 비효율적이다.
- 트랜잭션이 commit 되고 flush 메서드가 실행이 되면 Entity의 현재상태와 저장된 최초 상태를 비교한다.
- 변경 내용이 있다면 Update를 생성하여 쓰기 지연 저장소에 저장하고 모든 쓰기 지연 저장소의 SQL을 DB에 요청한다.
- DB에 트랜잭션이 commit 되면서 반영된다.
- JPA는 영속성 콘텍스트에 Entity를 저장할 때 loadedState라는 곳에 최초 상태를 저장한다.
- entityinstance에 저장된 현재 상태와 비교하여 값이 다르면 변경이 되었다고 감지하여 Update를 쓰기 지연 저장소에 저장한다.
- 쓰기 지연 저장소에 담겨있는 모든 SQL을 DB에 보낸다.
위에 모든 기능은 트랜잭션 환경에서 실행한다.
'🔥스파르타 TIL (Spring)' 카테고리의 다른 글
Bean 이란? (0) | 2025.02.09 |
---|---|
JPA 란? (2) - Spring Data JPA (0) | 2025.02.08 |
JPA 란? (1) (0) | 2025.02.08 |
Entity란 무엇일까? (3) - Entity의 상태 (0) | 2025.02.07 |
Entity란 무엇일까? (1) (0) | 2025.02.03 |