[JPA-3] JPA "영속성"

김아람·2024년 7월 17일
post-thumbnail

📌 1. JPA 키워드 "영속성"

: 엔티티를 영구 저장하는 환경 의미

  • DB에 저장하는 게 아니라 영속성 컨텍스트라는 곳에 저장
  • 영속성 컨텍스트는 논리적인 개념(눈에 안보임)
  • 엔티티 매니저를 통한 영속성 컨텍스트에 접근
  • 엔티티 매니저를 생성하는 영속성 컨텍스트 1:1 생성

📌 2. 엔티티의 생명주기

  • 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
	Member member = new Member( );
	member.setId("member1");
	member.setUsername("회원1");
  • 영속(managed) : 영속성 컨텍스트에 관리되는 상태
	Member member = new Member( );
	member.setId("member1");
	member.setUsername("회원1");

	EntityManager em = emf.createEntityManager( );
	em.getTransaction( ).begin( );

	// 객체를 저장한 상태(이 시점부터 영속)
	em.persist( member );
  • 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
	em.detach(member);

"엔티티 객체가 영속성 컨텍스트와의 연결이 끊긴 상태"

연결이 끊어져서 영속→비영속으로 바뀌지 않는 이유는
연결이 완전히 끊어진 것이 아니라 다시 연결할 수 있기 때문

  • 삭제(removed) : 삭제된 상태
	em.remove(member);

📌 3. 1차캐시(영속성 이점)

  • 동일성(identity)보장
    : 같은 엔티티 객체에 대한 동일성을 보장

  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
    : 1차 캐시는 트랜잭션 범위 내에서 유지
    즉, 한 번 시작된 트랜잭션 내에서는 같은 엔티티를 여러 번 조회하더라도
    1차 캐시에 저장된 상태에서 제공(일관성을 유지, 중복 데이터베이스 조회X)

  • 변경감지(Dirty Checking) : 엔티티의 변경 추적

  • 지연 로딩(Lazy Loading)
    : 동일한 엔티티가 여러 번 로드되어야 하는 상황에서, 1차 캐시를 통해 이미 로드한 엔티티는 다시 데이터베이스에서 가져오지 않고 캐시된 엔티티를 반환함으로써 성능을 최적화 함

📌 4. flush

: flush( )가 호출되는 시점에 Entity와 스냅샷을 전부 비교 후 변경된 것을 확인 후 자동 수정

1) 플러시 발생

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
  • 변경 감지(Dirty Checking)
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL저장소의 쿼리를 데이터베이스에 전송
    (등록, 수정, 삭제 쿼리)

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

  • 트랜잭션 커밋 : 플러시 자동 호출
  • em.flush( ) : 직접 호출
  • jpql 쿼리 실행 : 플러시 자동 호출

3) 플러시 주요사항

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위가 중요 → 커밋 직전에만 동기화 하면 됨
  • JPA는 동시성, 데이터를 맞추는 등을 모두 트랜잭션에 위임한다.

0개의 댓글