<aside> ❗

트랜잭션 범위의 영속성 컨텍스트

[스프링 기본 전략]

@Transactional

<aside> ❗

기본 전략인 경우 발생할 수 있는 문제점

지연 로딩

org.hibernate.LazyInitializationException 예외 발생 !!!!

준영속 상태의 지연 로딩 문제를 해결하는 방법은 크게 2가지

  1. 뷰가 필요한 엔티티를 미리 로딩해두는 것
  2. OSIV를 사용해서 엔티티를 항상 영속 상태로 유지하는 방법 </aside>

<aside> ❗

FACADE 계층 추가 (파사드 디자인 패턴)

Controller → FACADE → Service → Repository

[FACADE 계층의 역할과 특징]

<aside> ❗

준영속 상태와 지연 로딩의 문제점

Ex) 엔티티를 조회할 때, 화면별로 최적화된 엔티티를 딱딱 맞아 떨어지게 초기화해서 조회하려면 FACADE 계층에 여러 종류의 조회 메서드가 필요 하게 됨

이런 경우 OSIV를 사용하는 것이 해결책이 될 수 있다.

Open Session In View란 영속성 컨텍스트가 트랜잭션이 종료된 이후에도 유지되는 것을 의미

</aside>

<aside> ❗

OSIV

초창기 OSIV - 요청당 트랜잭션

[문제점]

<aside> ❗

스프링 OSIV - 비즈니스 계층 트랜잭션

image.png

스프링 OSIV 분석

[기타]

  1. 각 스레드는 서로 다른 트랜잭션을 가짐 → 같은 요청이더라도 서로 다른 영속성 컨텍스트를 가짐
  2. Lazy Loading 문제 메인 스레드는 OSIV 덕분에 Lazy Loading이 가능하지만 새로운 스레드에서는 기존 영속성 컨텍스트를 공유하지 못하므로 LazyInitializationException 발생 가능
  3. 동기화 문제 한 스레드에서 엔티티를 변경했지만, 다른 스레드에서는 이를 알지 못할 수 있음 데이터 정합성 문제가 발생할 수 있음

트랜잭션 없이 읽기

<aside> ❗

스프링 OSIV 정리

<aside> ❗

스프링 OSIV 주의사항

image.png

<aside> ❗

</aside>