본문 바로가기

JPA

[개념] JPA 프로그래밍 - 03. 영속성 관리

영속성 컨텍스트란?

  • JPA를 이해하는 데 가장 중요한 용어
  • 엔티티를 영구 저장하는 환경
  • 여러 엔티티 매니저가 같은 영속성 컨텍스트에 접근할 수도 있음

엔티티 생명주기

비영속

  • 순수한 객체 상태
  • 영속성 컨텍스트나 데이터베이스와는 전혀 관련이 없음

영속

  • 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 함
  • 영속 상태라는 것은 영속성 컨텍스트에 의해 관리된다는 뜻

준영속

  • 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 됨

삭제

  • 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제

영속성 컨텍스트의 특징

  • 영속성 컨텍스트는 엔티티를 식별자 값(@Id)으로 구분하므로 영속 상태는 식별자 값이 반드시 있어야 함
  • JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이것을 플러시(flush)라 함
  • 장점
    • 1차캐시
    • 동일성 보장
    • 트랜잭션을 지원하는 쓰기 지연
    • 변경 감지
    • 지연 로딩

엔티티 조회

  • 영속성 컨텍스트 내부에 1차 캐시라는 Map이 하나 있는데 키는 @Id로 매핑한 식별자고 값은 엔티티 인스턴스
  • 영속성 컨텍스트는 성능상 이점과 엔티티의 동일성을 보장
Member a = em.find(Member.class, "member1"); //데이터베이스 조회
Member b = em.find(Member.class, "member1"); //1차캐시 조회
 
System.out.println(a == b); //참

엔티티 등록

  • 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
  • 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터베이스에 보내서 저장시킨다. 이를 트랜잭션을 지원하는 쓰기 지연이라 한다.

쓰기 지연, 회원 A 영속성
쓰기 지연, 커밋

출처도서 : 자바 ORM 표준 JPA 프로그래밍 - 김영한 지음