영속성 관리 - JPA 내부 구조

RoyBae·2022년 8월 9일
0

Hello JPA

목록 보기
2/2

연속성 관리

JPA에서 가장 중요한 2가지
1. 객체와 관계형 데이터베이스 맵핑하기
(Object Relational Mapping)
2. 영속성 컨텍스트

영속성 컨텍스트

  • JPA를 이해하는데 가장 중요한 용어
  • "엔티티를 영구 저장하는 환경"
  • EntityManager.persist(entity);

연속성 컨텍스트는 보이지 않는 논리적인 개념이다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근을 한다.

엔티티의 생명주기

  • 비영속 (new/transient)
    영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속 (managed)
    영속성 컨텍스트에 관리되는 상태
  • 준영속 (detached)
    영속성 컨텍스트에 저장되었다가 분리되는 상태
  • 삭제 (removed)
    삭제된 상태

1. 비영속

2. 영속

  • 영속성 컨텍스트에 저장된 객체를 조회하는 경우
    데이터베이스에 쿼리를 통해 데이터를 조회해오지 않고
    1차 캐시에 찾는 find("3L") 가 있는 경우엔 캐시에 있는 객체를 가져오게 된다.
  • 그런데 1차 캐시에 없는 find("5L")을 찾게 된다면,
    데이터베이스에 조회를 하여 조회된 객체를 영속 컨텍스트 1차 캐시에 저장 후 반환한다.
  • 영속 엔티티는 동일성을 보장한다.

  • 트랜잭션을 지원하는 쓰기 지연

영속 엔티티에 여러 객체를 저장을 하면 쓰기 지연 SQL 저장소에 Insert 쿼리를 생성하여 저장하고 있다가 em.commit(); 시점에 데이터베이스에 쿼리를 보낸다.

  • 변경 감지 (Dirty Checking)
    영속 엔티티를 수정하게 되면 영속 컨텍스트에 flush()요청을 하게 되는데 저장된 객체(변경된 엔티티)와 스냅샷(기존 엔티티) 비교하여 서로 다른 객체일 때 Update 쿼리를 자동으로 생성하여 쓰기지연 저장소에 저장하게 된다.
    이후 em.commit(); 시점에 Update 쿼리가 데이터베이스에 보내지게 되며 commit을 하게 된다.

3. 준영속, 삭제

영속성 컨텍스트의 장점 정리

  • 1차 캐시
  • 동일성(identity) 보장
  • 트렌잭션을 지원하는 쓰기 지연
    (transactional write-behind)
  • 변경 감지 (Dirty Checking)
  • 지연 로딩 (Lazy Loading)
  • 앞서 언급한 flush() 라는 기능은
    영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 역활을 한다.
    flush는 트랜잭션 안에서 작업 단위로 동작하기 때문에
    commit 직전에만 동기화 하면된다.

  • flush가 발생 시 동작
    변경감지
    수정된 엔티티 쓰기 지연 저장소에 등록
    쓰기 지연 저장소의 쿼리를 데이터베이스에 전송
    (등록, 수정, 삭제 쿼리)

  • flush 발생 시점 및 직접 호출 방법
    em.flush() : 직접 호출
    트랜잭션 커밋 em.commit() : flush 자동 호출
    JPQL 쿼리 실행 : flush 자동 호출

flush mode option

em.setFlushMode(FlushModeType.COMMIT)
  • FlushModeType.AUTO
    commit이나 쿼리를 실행할 때 flush (default)
  • FlushModeType.COMMIT
    commit할 때만 flush

출처 : https://inf.run/Q6fc

profile
반도체 IT System Developer

0개의 댓글