영속성 컨텍스트

tyghu77·2023년 7월 8일
0

엔티티의 생명 주기

  1. 비영속
Member member = new Member();
member.setId(3L);
member.setName("HelloC");
  1. 영속
Member member = new Member();
member.setId(3L);
member.setName("HelloC");
//영속
em.persist(member);

영속 상태가 된다고 해서 바로 DB에 쿼리가 날아가는 것이 아니라
3. 준영속
4. 삭제

영속성 컨텍스트

엔티티를 영구 저장하는 환경
영속성 컨텍스트는 내부에 1차 캐시를 들고 있다.

  1. 조회할 때 JPA는 우선 1차 캐시에 조회하는 엔티티가 있는지 찾는다. 있으면 그것을 반환하고 없다면 DB에서 가져온 후 1차캐시에 저장하고 그것을 반환한다.

  2. 같은 트랜잭션 안에서 영속 엔티티의 동일성을 보장해준다.

  3. 엔티티 등록 시 트랜잭션을 지원하는 쓰기 지연이 가능하다. 영속화 할 때 쿼리를 DB에 보내는 것이 아니라 쿼리를 쓰기 지연 SQL 저장소에 보관한 뒤, 트랜잭션을 커밋하는 순간 쿼리를 보낸다.

  4. 변경 감지는 아래에서 설명

영속성 컨텍스트의 이점

  1. 1차 캐시
  2. 동일성(identity) 보장
  3. 트랜잭션을 지원하는 쓰기 지연
  4. 변경 감지
  5. 지연 로딩

변경 감지

트랜잭션 커밋을 하면 내부적으로 flush()가 호출된다.
그 후 엔티티와 스냅샷 비교한다.
(1차 캐시 안에는 Id, Entity, 스냅샷이 있다. 스냅샷은 값을 가져온 그 시점의 상태를 스냅샷으로 보관해둔다.)
JPA가 엔티티의 값이 변경되면 트랜잭션이 커밋되는 시점에 스냅샷과 비교한다.
그 후 쓰기 지연 SQL저장소에 UPDATE쿼리를 만들어 저장해둔다. 그리고 그 쿼리를 DB에 반영 한 후 커밋을 날린다.

플러시(flush)

영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 (영속성 컨텍스트를 비우는 것이 아니다)
플러시가 일어날 때 발생하는 일

  1. 변경 감지
  2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
    트랜잭션이라는 작업 단위에 맞춰서 동작하기 때문에 트랜잭션 커밋 직전에만 동기화 하면 된다.

영속성 컨텍스트를 플러시 하는 방법

  1. entityManager.flush()
  2. 트랜잭션 커밋 (flush 자동 호출)
  3. JPQL 쿼리 실행 (flush 자동 호출)
profile
배운것을 기록하자

0개의 댓글