JPA Persistence API 영속성 컨텍스트

개붕이·2025년 1월 1일

JavaPersistenceAPI

목록 보기
2/6
post-thumbnail

영속성 컨텍스트

JPA 핵심 2가지

  1. 객체와 DB 매핑 (Object Relational Mapping)
  2. 영속성 컨텍스트
    • 이번 포스트에서 알아볼 것

영속성 컨텍스트란?

  • Persistence Context
  • '엔티티 영구 저장 환경'
  • 논리적 개념
  • Entity Manager 를 통해 영속성 컨텍스트에 접근함

실행 환경에 따른 매핑 환경

J2SE : Entity Manager -> Persistence Context , 1:1 환경

Spring, J2EE : Entity Manager -> Persistence Context , N:1 환경

엔티티의 생명 주기

  1. 비영속 (New / Transient) : Persistence Context 와 관계없는 새로운 상태
  2. 영속 (Managed) : Persistence Context 에 관리되는 상태
  3. 준영속 (Detached) : Persistence Context 저장 상태 -> 분리 상태
  4. 삭제 (Removed) : 삭제된 상태


영속 상태의 이해

  1. 비영속 : 객체 생성만

  2. 영속 : EntityManager 의 객체가 em 이라면 em.persist(Object)

  3. 준영속 : em.detach(Object) , 영속성 컨텍스트에서 분리

  4. 삭제 : em.remove(Object) , 객체 삭제

이점

  1. 1차 캐싱
  2. 동일성 보장
  3. 트랜잭션을 지원하는 쓰기 지연 (Transactional Write-behind)
  4. 변경 감지 (Dirty Checking)(스냅샷)
  5. 지연 로딩 (Lazy Loading)

1차 캐시

Commit, Flush 전 1차 캐시에 영속된 데이터를 저장, 조회 시에도 1차캐시에서 먼저 Find() 를 실행함, 없는 객체를 조회하면 그 데이터(객체) 도
1차 캐시에 저장함

Persistence Context 내부에 존재하는 Object 가 같은 데이터라면 동일 Transaction 에선 동일성을 보장함 (Equal 비교 가능)



1차 캐싱으로 인해 반복 가능 읽기 (Repeated Read) 등급의 Transaction Isolation LevelApplication 차원에서 지원함.

트랜잭션을 지원하는 쓰기 지연

Entity Manager 는 데이터 변경 시에 Transaction 을 실행하야함. 이후 비즈니스 로직을 수행하고 오류없이 진행된다면 커밋함

커밋 시에 DatabaseSQL 을 보냄 (쓰기 지연 SQL 저장소에 SQL 문을 저장해놓음)

영속성 컨텍스트가 Commit 되면 Flush 하여 DB 에 한꺼번에 저장함

변경 감지

Snapshot 을 활용하여 Transaction 시작 지점의 DB 상태를 임시로 저장해두었다가 변경사항이 있을 시 스냅샷 데이터와 비교해 update SQL 문을 작성하고 이를 Flush 하여 DB 에 반영함.

엔티티 삭제도 마찬가지로 지연 SQL 저장소에 저장해두었다가 저장 후 지연로딩



Flush ?

영속성 컨텍스트의 변경 내용을 DB 에 반영함

  • 발생 시 : 변경 감지 -> 변경된 엔티티를 지연 SQL 저장소에 알맞은 SQL 문을 작성하여 등록함 -> 이를 DB 에 전송함
  • 호출 방법
    • 직접 호출 : em.flush()
    • 트랜잭션 커밋
    • JPQL 쿼리 실행

JQPL 실행 시에 Flush가 발생하는 이유?

JQPL 실행 시에 데이터가 최신 데이터로 갱신되어있지 않으면 데이터 무결성에 에러가 생김

Flush 모드 옵션

플러시 모드 옵션 : em.setFlushmode(FlushmodeType.COMMIT)

  • FlushmodeType.AUTO : 커밋, 쿼리 실행 시에 플러시 (기본 값)
  • FlushmodeType.COMMIT : 커밋 할 때만 플러시

Flush 의 특징

  • 영속성 컨텍스트를 비우지는 않음
  • 영속성 컨텍스트의 변경 내용을 DB 에 동기화
  • Transaction 작업 단위가 중요함 (COMMIT 직전에 Flush 로 데이터를 동기화 시킴)

준영속

준영속 상태는 Flush 에 영향을 받지 않음, 영속 상태의 엔티티가 Detach 되는 것이기 때문에 영속성 컨텍스트가 제공하는 1차 캐싱, 지연 sql 저장소 등등의 기능을 사용하지 못함

준영속 상태 설정법

  • em.detach(Object) : 특정 엔티티만 준영속 상태로 만듦
  • em.clear() : Persistence Context 를 초기화
  • em.close() : Persistence Context 를 종료시킴
profile
based on the record

0개의 댓글