[Spring] 영속성 컨텍스트

Jeon817·2024년 2월 28일

Spring

목록 보기
11/11

[영속성 컨텍스트]

영속성 컨텍스트는 모든 엔터티를 데이터베이스에서 가져오거나 데이터베이스에 저장하는 1차 캐시입니다. 이는 애플리케이션과 DB(영구 저장소) 사이에 위치합니다.

영속성 컨텍스트는 관리되는 엔터티에 대한 모든 변경 사항을 추적합니다.
트랜잭션 중에 변경된 사항이 있으면 엔터티는 더티로 표시됩니다. 트랜잭션이 완료되면 이러한 변경 사항이 DB 로 플러시됩니다.

[ EntityManager ]

EntityManager는 영속성 컨텍스트와 상호 작용할 수 있게 해주는 인터페이스입니다. EntityManager를 사용할 때마다 실제로 영속성 컨텍스트와 상호 작용합니다. 엔터티의 모든 변경 사항이 영구 저장소를 호출한다면 얼마나 많은 호출이 이루어질지 상상할 수 있습니다. 영구 저장소 호출은 비용이 많이 들기 때문에 성능에 영향을 미칩니다.

[ 영속성 컨텍스트 유형 ]

1) 트랜잭션 범위 영속성 컨텍스트
트랜잭션 영속성 컨텍스트는 트랜잭션에 바인딩됩니다. 트랜잭션이 완료되자마자 영속성 컨텍스트에 있는 엔터티는 영구 저장소로 플러시됩니다.
트랜잭션 내부에서 작업을 수행하면 EntityManager 는 영속성 컨텍스트를 확인합니다. 존재하는 경우 해당 항목이 사용됩니다. 그렇지 않으면 영속성 컨텍스트가 생성됩니다.

기본 영속성 컨텍스트 유형은 PersistenceContextType.TRANSACTION 입니다 . EntityManager 에게 트랜잭션 영속성 컨텍스트를 사용하라고 지시하려면 간단히 @PersistenceContext 로 주석을 달면 됩니다.

@PersistenceContext
private EntityManager entityManager;

2) 확장된 범위의 영속성 컨텍스트
확장 영속성 컨텍스트는 여러 트랜잭션에 걸쳐 있을 수 있습니다. 트랜잭션 없이 엔터티를 유지할 수 있지만 트랜잭션 없이 엔터티를 플러시할 수는 없습니다.
EntityManager에게 확장 범위 영속성 컨텍스트를 사용하도록 지시하려면 @PersistenceContext 의 유형 속성을 적용해야 합니다.

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;

Stateless Session Bean에서 한 구성요소의 확장 영속성 컨텍스트는 다른 구성요소의 영속성 컨텍스트를 전혀 인식하지 못합니다. 이는 둘 다 동일한 거래에 있는 경우에도 마찬가지입니다.

0개의 댓글