프로그래밍공부(Programming Study)/JPA(Java Persistence API)

1. 영속성 관리

Chaany 2022. 12. 28.
728x90

1. 영속성 컨텍스트

  • 논리적인 개념으로, 엔티티를 영구 저장하는 환경
  • 엔티티매니저를 통해 영속성 컨텍스트에 접근
  • EntityManager.persist(entity)
    • 영속성 컨텍스트를 통해 영구 저장하겠다
  • 엔티티의 생명주기
    • 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
    • 영속(managed) : 영속성 컨텍스트에 관리되는 상태
    • 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
    • 삭제(removed) : 삭제된 상태

  • 영속성 컨텍스트의 이점
    • 1차 캐시 
      • 영속성 컨텍스트라고 이해해도 무방함
      • 특정 트랜잭션 찰나의 순간에서만 이득이 있음
        (데이터 베이스 트랜잭션 단위로 엔티티매니저를 만듦 ->트랜잭션 후 1차 캐시 날라감[고객 한 명의 비즈니스 로직용])
    • 동일성(identity) 보장
      참고 : https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation
    • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
      • batch_size 옵션을 통해 버퍼링 기능 사용 가능(jdbc batch 기능) -> 특별한 배치 쿼리의 경우 이점
    • 변경 감지(Dirty Checking)
      • commit 시점에 내부적으로 flush() 호출 -> 스냅샷과 엔티티 비교 -> 쓰기 지연 SQL 저장소에 UPDATE 쿼리 생성 -> DB에 반영 
    • 지연 로딩(Lazy Loading)
  • 추가 내용

1차 캐시
동일성 보장
쓰기 지연
변경 감지

2. 플러시

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

  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
  • commit은 별개임
  • 1차 캐시 유지됨
  • 쓰기 지연 SQL 저장소 쿼리들이 db에 반영되는 것일 뿐임
  • 영속성 컨텍스트 플러시하는 방법
    • em.flush() - 직접 호출 -> 실제로 쓸 일은 주로 테스트 할 때 정도?
    • 트랜잭션 커밋 - 플러시 자동 호출
    • JPQL 쿼리 실행 - 플러시 자동 호출
  • 플러시 모드 옵션
    • 쓸 일은 딱히 없음
    • FlushModeType.AUTO(기본값) : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
    • FlushModeType.COMMIT : 커밋할 때만 플러시 -> 전혀 관련 없는 테이블의 값을 처리할 때 등등(쓸 일 거의 없음)
  • 주의사항
    • 영속성 컨텍스트를 비우지 않음
    • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
    • 트랜잭션이라는 작업 단위가 중요
      • JPA의 경우 데이터 정합성, 동시성 관련 기능들은 트랜잭션이라는 작업단위에 위임해서 사용함) -> 커밋 직전에만 동기화 하면 됨
      • 영속성 컨텍스트와 트랜잭션의 생명주기를 맞춰서 설계해야 개발에 문제가 없음(트랜잭션 끝 = 영속성 컨텍스트 끝)

3. 준영속 상태

  • 영속 -> 준영속
    • em.persist() or em.find() -> 영속(1차 캐시에 올라감)
    • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
    • 영속성 컨텍스트가 제공하는 기능(변경 감지, 쓰기 지연 등)을 사용 못함
  • 준영속 상태로 만드는 방법
    • em.detach(entity) : 특정 엔티티만 영속 상태로 전환
    • em.clear() : 영속성 컨텍스트를 완전히 초기화 -> 테스트 케이스 작성시 눈으로 보고 싶을 때 유용
    • em.close() : 영속성 컨텍스트 종료
출처
인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편(김영한님)

 

728x90

'프로그래밍공부(Programming Study) > JPA(Java Persistence API)' 카테고리의 다른 글

5. 값 타입  (2) 2022.12.28
4. 프록시와 연관관계 정리  (0) 2022.12.28
JPA 공부 개요  (0) 2022.12.28

댓글