OSIV (Open Session In View)
영속성 컨텍스트를 HTTP 요청 시작부터 응답까지 유지하는 기능
여기서 View라는 개념이 어떤건지 궁금했다.
- REST API 등 View가 없는 서비스에서도 이 용어를 그대로 사용한다고 한다
- View라기보다는 클라이언트에 대한 응답이 완료되는 시점을 의미
- HTTP 응답이 끝날 때까지 영속성 컨텍스트를 유지하는 개념으로 확장
OSIV의 View는 역사적인 용어이며 현재는 클라이언트에 대한 응답 완료 시점으로 이해하면 된다고 한다.
spring.jpa.open-in-view=?
JPA를 사용하면 yml에서 위의 값을 true,false로 설정할 수 있다. 기본 설정값은 true이다.
spring.jpa.open-in-view=true
- 이 설정이 true 라면 http 요청 시작부터 끝까지 DB커넥션을 가져와 영속성 컨텍스트를 유지한다. (영속성 컨텍스트는 기본적으로 커넥션을 유지)
- 트랜잭션 범위가 아닌 곳에서도 사용할 수 있다는 것인데 예를들면 controller단에서의 엔티티 조회시 Lazy loading으로 조회가 가능하다.
- 커넥션을 오래 가지고 있게되어 성능에 문제가 발생할 수 있다.
spring.jpa.open-in-view=false
- @Transactional 이 붙은 service 쪽에서만 영속성 컨텍스트를 유지한다.
- 만약 다른곳에서 사용하고 싶다면 DTO 클래스를 만들어 반환하여 구성
- 오래 DB커넥션을 가지고 있지않아 대용량 트래픽 상황에서 커넥션 관리에 용이하다.
테스트
spring.jpa.open-in-view=true 설정했다.
별문제없이 Lazy Loading이 동작한다.


다음은 spring.jpa.open-in-view=false
LazyInitializationException이 발생한다!

물론 service단에서도 @Transactional을 붙이지 않으면 LazyInitializationException이 발생한다.


정리
Service를 제외하고는 엔티티를 직접적으로 사용하지 않게 코드를 작성해왔다 했다.
그렇지만 spring.jpa.open-in-view=true 기본설정값으로 인해 @Transactional 없는곳에서 동작했던 부분에 대해 직접 오류를 겪어보지 못했던거 같다.
앞으로도 Service쪽이 아닌 View 즉, 다른곳에서는 엔티티를 직접 호출하지 않을 것 같지만 Lazy Loading 관련해 동작원리에 대해 다시 되짚어보게 되는 시간이었다.
또 DB 커넥션을 HTTP 요청 시점부터 계속 잡고 응답 시에 반환하는 것은 대규모 트래픽에서 커넥션 풀 문제가 발생할 수 있다는 점을 이번에 새로 알게되었고 트래픽 상황에 고려해 설정값을 false로 두어야겠다.
참고 :Claud, ChatGPT
JPA - OSIV(Open Session In View) 정리
OSIV(Open Session In View) OSIV(Open Session In View)는 영속성 컨텍스트를 뷰까지 열어두는 기능이다. 영속성 컨텍스트가 유지되면 엔티티도 영속 상태로 유지된다. 뷰까지 영속성 컨텍스트가 살아있다면
ykh6242.tistory.com