Open Session In View: 하이버네이트
Open Entity Manager In View: JPA
관례상 OSIV라고 한다.

Spring.Jpa.open-in-view는 기본값이 true로 되있으며 이 전략은 최초 DB 커넥션 시작 지점부터 API응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지하는 것이다. 지연 로딩을 하기 위해서는 영속성 컨텍스트가 살아 있어야 하고, 또 영속성 컨텍스트는 기본적으로 DB 커넥션을 유지하기 때문에 이 전략을 사용하게 되면 View Template와 API 컨트롤러는 지연로딩이 가능하다.
하지만 이 전략은 단점이 오랜기간 DB커넥션 리소스를 사용하기에 만약 트래픽이 몰리게 된다면 커넥션이 모자라 장애가 생성된다.
그래서 이러한 상황을 막기 위한 전략이다

Spring.Jpa.open-in-view를 false로 설정하게 되면 OSIV가 종료되며 트랜잭션이 끝날 때 영속성 컨텍스트는 닫고 DB커넥션은 반환된다. 그래서 위와 같은 상황에 커넥션 리소스가 낭비되는 일은 없다.
하지만 OSIV가 종료되면 모든 지연 로딩은 저 트랜잭션 범위내에서 해결해야하기에 지연 로딩코드를 트랜잭션 안으로 넣어야 하며 view template에서 지연로딩은 동작하지 않는다. 결국 트랜잭션이 끝나기 전에 강제로 지연로딩을 호출해 두어야 한다.
그래서 나온 방법이 Command와 Query를 분리하는 방법이다.
비즈니스 로직은 엔티티 몇개를 등록 및 수정하는 정도라 성능에 문제가 되지 않지만 조회하여 복잡한 화면을 출력하기 위한 쿼리는 성능을 최적화 하는것이 중요하다.
그래서 이 두가지를 명확하게 분리하는 선택은 유지보수 관점에서 의미있다.
만약 수정과 등록 등의 핵심비즈니스 로직을 OrderService라 하면
화면 또는 API에 맞춰야 하는 서비스는 OrderQueryService처럼 작성할 수 있다.(주로 읽기 전용 트랜잭션을 사용한다.)
보통은 서비스 계층에서 트랜잭션을 유지하며 두 서비스 모두 트랜잭션을 유지하면서 지연 로딩을 사용할 수 있다.
이때 마이크로서비스 아키텍쳐를 사용한다 하면 사용자들이 많이 사용하는 서비스는 OSIV를 끄고
ADMIN과 같은 관리자 페이지는 OSIV를 켜서 사용하는 것 처럼 설정을 각각 지정하여 서비스가 가능하다.
출처
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 인프런 | 강의
스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'Spring' 카테고리의 다른 글
| [SpringBoot] @MappedSuperclass (0) | 2023.05.21 |
|---|---|
| [Java] Stream이란? (0) | 2023.05.14 |
| [SpringBoot] 싱글톤(Singleton) 이란? (0) | 2023.05.12 |
| [java] Dependency Injection 개념 (0) | 2023.05.11 |
| [SpringSecurity] AccessDeniedHandler (0) | 2023.05.09 |