Open-In-View는 관례상 OSIV(Open-Session-In-View)라고 하고, 경우에 따라 Open-EntityManager-In-View 라고도 한다.
JPA에서 제공하는 기능 중 하나로 application.yml
설정 파일에서 Open-In-View를 true of false로 설정할 수 있다. 기본값은 true이다.
spring:
jpa:
open-in-view: true
open in view가 false일 경우 트랜잭션을 종료할 때 영속성 컨텍스트 또한 닫히게 된다.
open in view가 true일 경우 트랜잭션이 완수 되도 영속성 컨텍스트는 살아있다.
open in view가 false일 경우 위에서 설명한대로 트랜잭션을 종료할 때 영속성 컨텍스트가 닫히게 된다. 즉 controller에서 view에게 반환할 때 영속성 컨텍스트가 관리하는 객체에 접근할 수가 없게 된다.
이게 문제인 이유가 실무에선 여러가지 이유로 주로 JPA 연관관계 매핑 fetch type을 Lazy로 쓰는데 controller에서 이 연관관계에 있는 객체를 호출 할 수 없다는 이야기가 된다.
예를들어, User 객체 내에 Images가 1:N 관계로 연관관계를 맺고 있는다 했을 때, profile이라는 페이지를 호출한다고 하면 User를 가져올 땐 Images는 지연로딩이므로 영속성 컨텍스트에 proxy객체만 있고 실제 객체는 없다. 여기서 Service 단의 일이 끝나고 Controller 단으로 가게 되면 영속성 컨텍스트는 닫히게 되고 view의 jsp에서 images를 호출할 경우 Controller는 images에 접근하고 싶어도 영속성 컨텍스트가 이미 닫혀있어 error를 내게된다.
즉, 영속성 컨텍스트가 닫혀있다면 Lazy Loading을 할 수 없다.