이전에 면접에서 "JPA의 영속성 컨텍스트와 트랜잭션의 범위는 일치하는가?"라는 질문을 받았을 때, 당시에는 당연히 일치한다고 생각했다. 그러나 면접 후 복기하며 OSIV(Open Session In View)라는 개념을 알게 되었다.
OSIV (Open Session In View)는 스프링 프레임워크의 세션 관리 전략 중 하나로, 영속성 컨텍스트를 View 레이어까지 확장하여 열어두는 것을 의미한다. 즉, View 레이어에서도 지연 로딩 등 영속성 컨텍스트의 기능을 사용할 수 있다는 뜻이다. Spring Boot에서는 OSIV가 기본적으로 활성화되어 있다. OSIV를 비활성화하려면 아래와 같이 application.yml 파일에서 설정을 추가해야 한다.
spring.jpa.open-in-view=false
OSIV가 활성화되면 영속성 컨텍스트의 범위가 View 레이어까지 확장된다.
장점 : View나 Controller에서 지연 로딩을 사용할 수 있다.
단점 : DB 커넥션이 장시간 유지되어, 트래픽이 많을 경우 커넥션 부족 문제가 발생할 수 있다.
OSIV를 비활성화하면 영속성 컨텍스트의 범위가 트랜잭션까지로 제한된다.
장점 : DB 커넥션을 효율적으로 사용할 수 있다.
단점 : View나 Controller에서 지연 로딩을 사용할 수 없기 때문에, 트랜잭션 내부에서 지연 로딩을 전부 처리해야 한다.
OSIV는 언제 활성화하고, 언제 비활성화해야 할까?
일반적으로 실시간 API가 중요한 서비스에서는 OSIV를 비활성화하여 DB 커넥션 사용을 최적화하는 것이 좋다. 반면, ADMIN 등 DB 커넥션을 많이 사용하지 않는 환경에서는 OSIV를 활성화하여 지연 로딩을 간편하게 활용할 수 있을 것이다.