[JPA] 영속성 컨텍스트 알아보자

울상냥·2023년 3월 18일
0

JPA

목록 보기
2/4

JPA

  • Java Persistence API
  • java 진영의 ORM 표준 스펙

여기서 Persistence 즉 영속성이 등장함을 알 수 있다. 자세히 알아보자


영속성이란

데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성

JPA은 연속성 컨텍스트(persistence context)에 엔티티를 영구 저장하여 관리한다.

영속성 컨텍스트

  • 엔티티를 영구 저장하는 환경
  • 엔티티 매니저 한 개 생성시에 한 개의 영속성 컨텍스트가 생성됨
  • 엔티티 매니저를 통해 접근과 관리

엔티티 생명주기

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

장점

  • 1차 캐시와 동일성 보장
    동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
    엔티티 조회시에 영속성 컨텍스트 내부의 1차 캐시에서 조회 하고 , 없는경우 데이터베이스에서 조회하여 1차캐시에 저장한다.
    결론적으로 1차 캐시에 있는 동일한 엔티티를 반환하기 때문에 entity1==entity2 의 동일성이 보장된다.

  • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
    트랜잭션 커밋때까지 Insert SQL을 버퍼에 모아두고 배치 전송을 한다.

  • 변경 감지 (Dirty checking)
    컨텍스트 내에 변경이 감지되면 flush시에 Update SQL를 날린다. 자세히

  • 지연로딩과 즉시 로딩

    • 지연로딩(Lazy Loading) : 객체가 실제 사용될 때 로딩
      @ManyToOne(fetch = FetchType.LAZY)
    • 즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
      @ManyToOne(fetch = FetchType.EAGER) (default)

flush

영속성 컨텍스트의 변경내용을 데이터베이스에 반영

동작 과정

  1. 변경 감지(Dirty Checking)가 동작하여 수정된 엔티티를 찾는다
  2. 수정된 엔티티에 대해 Update SQL을 만들어 SQL 저장소에 저장한다.
  3. SQL저장소의 쿼리를 데이터베이스에 전송한다.

동작 방법

  • flush 메소드 실행
  • transaction commit 시 자동호출
  • jpql 쿼리 실행

(보통은 transaction commit시 자동호출 되고 있었던것..!)

profile
안되면 되게하라

0개의 댓글