🔥스파르타 TIL (Spring)

Entity란 무엇일까? (2) - 영속성 콘텍스트의 기능

승승장규 2025. 2. 4. 16:06

이전 내용과 더불어 영속성 콘텍스트의 기능에 대해 알아보자.

 

  • 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에 저장

 

value에는 id(식별자)값을 포함한 저장한 데이터가 들어간다.

 

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