Database/JPA

JPA 영속성 컨텍스트

BUST 2018. 9. 8. 15:53

JPA 영속성 컨텍스트

jpa 영속성에 대한 이미지 검색결과

영속성 컨텍스트

  • 영속성 컨텍스트란 엔티티를 영구로 저장하는 환경(context)라는 의미이다
    • 영속성 컨텍스트 개념을 구현한게 entity manger이라고 생각을 하면 된다.
  • 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. 없으면 예외가 발생한다.
  • 영속성 컨텍스트에 엔티티를 저장하면 이 엔티티는 언제 저장이 될까?
    • JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이를 플러시(flush)라 한다.
  • 영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점이 있다.
    • 1차 캐시
    • 동일성 보장
    • 트랜잭션을 지원하는 쓰기 지연
    • 변경 감지
    • 지연 로딩

엔티티의 생명주기

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

Flush

플러시(flush())는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 다음과 같은 일이 일어난다.
  1. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
  2. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제 쿼리)

영속성 컨텍스트를 플러시하는 방법은 3가지가 있다.

  1. 직접 호출 하는 방법인데 엔티티 매니저의 flush() 메서드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시 하면 도니다. 테스트나 다른 프레임워크와 JPA를 함께 사용할 때를 제외하고 거의 사용하지 않는다.
  2. 트랜잭션 커밋이 자동으로 플러시가 호출된다.
  3. JPQL 쿼리 실행 할때에도 플러시가 자동으로 호출된다.


'Database > JPA' 카테고리의 다른 글

JPA CascadeType  (0) 2018.09.08
@ EnableTransactionManagement Advice Mode PROXY와 ASPECTJ  (0) 2018.06.03
Transactional with jpa repository  (0) 2018.05.28
Database Transaction Lock With JPA  (0) 2018.05.28