JPA 영속성 컨텍스트

JooHeon·2021년 11월 14일
0
post-custom-banner

🖊 엔티티를 영구 저장하는 환경

영속성 컨텍스트는 논리적인 개념이며 EntityManager에 있는 공간이다.
영속성 컨텍스트에 저장된 Entity는 커밋 시점에 SQL로 처리된다.

영속성 컨텍스트 안에 1차 캐시가 있는데, 사실상 영속성 컨텍스트를 1차 캐시라고 불러도 될 것 같다.

🖊 Entity의 생명주기

총 4단계로 나뉜다.

User user = new User(); // 비영속(관계 없는 상태)
user.setId(10);
user.setName("joo");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(user) // 영속(1차 캐시에 저장 및 DB에 저장 요청인 상태)
em.detach(user) // 준영속(1차 캐시에서 삭제)
em.remove(user) // 삭제(DB에 삭제 요청인 상태)

🖊 영속성 컨텍스트를 이용한 JPA 동작 방식

1. Commit이 되기 전까지 DB에 SQL로 보내지 않는다.

  • 영속된 엔티티의 동일성을 보장해준다.
  • DB 트랜잭션의 Repeatable Read 격리 수준을 어플리케이션 차원에서 제공해준다.
  • 트랜잭션을 지원하는 쓰기 지연을 제공해 최적화에 유리하다.

2. JPA는 조회할 때 1차 캐시를 먼저 보고 없으면 DB에서 가져와 1차 캐시에 올린다.

  • 1차 캐시에 올라가는 Entity는 1차 캐시의 스냅샷 공간에 초기상태가 보존되어있는 상태다.

3. Commit 시점에 flush가 발생한다

  • 스냅샷과 비교해 달라진(변경 감지) Entity의 UPDATE 쿼리를 쓰기 지연 저장소에 저장한다.
  • 쓰기 지연 저장소의 쿼리를 DB에 전송한다.(등록, 삭제, 수정)
  • 영속성 컨텍스트를 비우는 건 아니다.
post-custom-banner

0개의 댓글