OSIV란?
Open Session In View(하이버네이트), Open EntityManager In View(JPA) 라고 부르나, 통상 OSIV 라 함
영속성 컨텍스트의 생존 범위를 제어하는 설정
스프링부트에서는 spring.jpa.open-in-view 옵션으로 제어할 수 있으며 기본 값은 true
OSIV ON
JPA 를 사용하지 않을 경우 Spring 은 트랜잭션 시작 시 DB 커넥션을 얻어와 트랜잭션 종료 시 DB 커넥션을 종료함
OSIV 를 켜놓을 경우 트랜잭션이 종료되어도 API 가 응답을 반환하거나, view 템플릿을 렌더링할 때까지 영속성 컨텍스트, DB 커넥션이 유지됨
컨트롤러 단과 view 에서 지연 로딩과 같은 기능들을 사용할 수 있는 장점이 있음
그러나, DB 커넥션 리소스를 너무 오랜기간 사용하여 실시간 트래픽이 중요한 애플리케이션에서는 커넥션 수가 모자라 장애로 이어질 수 있음
OSIV OFF
트랜잭션 종료 시 DB 커넥션을 반환하고 영속성 컨텍스트를 닫아 리소스를 낭비하지 않음
모든 지연로딩을 트랜잭션 내에서 처리해야 한다는 단점이 존재
트랜잭션 밖에서 지연로딩 처리된 프록시에 접근 시 LazyInitializationException 이 터짐
OSIV와 성능 최적화
DB 커넥션 리소스를 아낄 수 있는 OSIV를 OFF로 설정하는 것이 성능에 좋다.
OSIV 를 끔으로써 발생하는 복잡성을 관리하는 좋은 방법이 Command와 Query를 분리하는 것이다.
핵심 비즈니스 로직이 담긴 서비스와 화면, API에 맞추어 반환하는 서비스를 분리하여 사용하면, 자주 변하는 API 스펙과 화면에 맞추어 해당 서비스만 빠르게 변경할 수 있어, 유지보수 관점에서 충분히 의미가 있다.
참고.
김영한씨는 트래픽이 많은 고객 서비스의 실시간 API는 OSIV를 끄고, ADMIN 처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 켠다.