OSIV (Open Session In View)
영속성 컨텍스트를 View 영역까지 열어두는 기능
즉, View 에서도 지연로딩과 같은 영속성 컨텍스트의 특징을 사용할 수 있다.
Spring Boot 에서 OSIV는 기본적으로 활성화된 상태이다.
아무 설정하지 않고 어플리케이션을 실행하면 다음과 같은 WARN 메시지를 볼 수 있다.

WARN 13132 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
OSIV를 사용하지 않기 위해서는 다음과 같이 명시적으로 설정해햐 한다.
spring.jpa.open-in-view: false
spring.jpa.open-in-view: true
최초 데이터베이스 커넥션 시작 시점부터 View에 응답이 갈 때 까지 또는 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지시킨다. 그래서 View Template이나 API 컨트롤러에서 지연 로딩이 가능하다. 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지한다.
트랜잭션 범위를 벗어나고 프록시 객체에 접근해도 LazyInitializationException이 발생하지 않는다.

단점
데이터베이스의 컨텍션은 한정적인데 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리 케이션에서는 커넥션이 부족할 수 있다. 예를 들어서 컨트롤러에서 외부 API를 호출하면 외부 API 대기 시간 만큼 커넥션 리소스를 반환하지 못하고, 유지해야 한다.
spring.jpa.open-in-view: false
트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.

단점
OSIV를 끄면 모든 지연로딩을 트랜잭션 안에서 처리해야 하므로 지연 로딩 코드를 트랜잭션 안으로 넣어야 하며, view template에서 지연로딩이 동작하지 않는다. 즉 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 한다.
트랜잭션 범위를 벗어나고 프록시 객체에 접근하면 LazyInitializationException이 발생한다.
어떤것을 사용해야 할까?
ADMIN 처럼 요청이 많지 않은 서비스 또는 커넥션을 많이 사용하지 않는 곳에서는 true
고객 서비스 실시간 API는 false
참고
'Spring' 카테고리의 다른 글
[Spring] Swagger 적용(Springboot 3.x) (0) | 2024.09.11 |
---|---|
[Spring] ERROR : Unable to find a single main class from the following candidates (0) | 2024.09.09 |
[Spring/JPA] jpa delete가 안될 때 (0) | 2024.08.16 |
[Spring] @Bean, @Component, @Configuration (0) | 2024.08.09 |
[Spring Security] logout 할 때, GET /login?logout 해결 방법 (0) | 2024.08.02 |