영속성 관리

hoonie·2023년 3월 19일
0

자바 표준 ORM: JPA

목록 보기
2/3

이 포스트는 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'의 내용을 정리한 포스트 입니다.

영속성 컨텍스트

  • JPA를 이해하는데 가장 중요한 개념
  • '엔티티를 영구 저장하는 환경'이라는 뜻
  • 영속성 컨텍스트는 논리적인 개념
  • 엔티티 매니저(entity manager)를 통해서 영속성 컨텍스트에 접근 가능

영속성 컨텍스트의 생명주기

  • 비영속 (new / transient)

    • 영속성 컨텍스트와 전혀 관계없는 새로운 상태
  • 영속 (managed)

    • 영속성 컨텍스트에서 관리되는 상태
  • 준영속 (detached)

    • 영속성 컨텍스트에서 관리되다가 분리된 상태
  • 삭제 (removed)

    • 삭제된 상태

영속성 컨텍스트의 이점

  1. 1차 캐시
    • 엔티티를 persist로 영속화하면 1차 캐시라는 곳에 저장이 된다. 이때 같은 엔티티를 조회하면 db에서 찾는 것이 아니라 1차 캐시에 저장되어 있는 엔티티를 조회한다. 만약 find를 통해서 찾는 엔티티가 1차 캐시에 존재하지 않으면 db에서 조회 후 1차 캐시에 저장한다.
  2. 동일성(identity) 보장
    • 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 db가 아닌 어플리케이션 차원에서 제공한다.
  3. 트랜젝션을 지원하는 쓰기 지연(transactinal write-behind)
    • 엔티티를 persist해서 저장하는 과정에서 persist를 호출하는 순간에 db에 저장되는 것이 아니고 쓰기 지연 SQL 저장소에 INSERT쿼리가 저장되고 트랜젝션이 commit되는 순간 db에 쿼리를 날려서 INSERT쿼리가 실행된다.
  4. 변경 감지(dirty checking)
    • 영속성 컨텍스트에 영속화 된 엔티티에 대해서 그 순간의 상태를 스냅샷으로 관리한다. 이때 flush가 호출되는 순간 스냅샷과 현재의 엔티티를 비교해서 변경 사항이 있다면(변경감지) 그때 UPDATE쿼리를 db에 날린다.
    • flush란 영속성 컨텍스트의 변경사항을 데이터베이스에 반영하는 것이다. flush는 다음과 같은 경우에 호출된다.
      • 직접 호출 em.flush()
      • 트랜젝션 커밋 transaction.commit() -> 플러시 자동 호출
      • JPQL 쿼리 실행 -> 플러시 자동 호출
    • flush는 영속성 컨텍스트를 비우는 것은 아니다. 영속성 컨텍스트의 변경사항을 데이터베이스와 동기화하는 과정이고 영속성컨텍스트르 비우고 싶으면 em.clear()를 호출하면 됨.
  5. 지연 로딩(lazy loading)
profile
사우루스 팡팡!

0개의 댓글