영속성 컨텍스트(Persistence Context)를 뷰까지 열어두는 기능을 말한다. 뷰에서도 지연 로딩을 사용할 수 있어 스프링 프레임워크에서는 OSIV Default값을 true로 설정하고 있다.
# application.yml
spring:
jpa:
open-in-view: true
OSIV가 켜져있다면 Service, Repository 단에서 트랜잭션이 끝나도 영속 상태를 끝까지 유지한다. 그래서 데이터베이스 커넥션과 영속 컨텍스트는 컨트롤러 단에서 최종적으로 Response를 내보낼 때까지 살아있고 컨트롤러에서도 지연 로딩이 가능하다.
세션 관리 작업을 간단하게 처리할 수 있으나, 영속성 컨텍스트를 끝까지 유지한다는 것은 실시간 트래픽이 중요한 애플리케이션에서 커넥션이 모자라 서비스 장애의 원인이 될 수도 있다. 특히 컨트롤러에서 외부 API를 호출하면 외부 API의 대기 시간만큼 리소스를 반환하지 못하고 유지해 로딩이 지연될 수 있다.
# application.yml
spring:
jpa:
open-in-view: false
트랜잭션 종료 시 바로 영속성 컨텍스트를 닫고, 데이터베이스의 커넥션도 반환한다. 즉 영속성 컨텍스트의 생존 범위는 트랜잭션 안(Service와 Repository 단)으로 한정되기 때문에 커넥션 리소스를 낭비하지 않는다. 하지만 지연로딩을 모두 트랜잭션 안에서 처리해야 한다는 단점이 있다.
// OSIV OFF 인 경우
@RequiredArgsConstructor
class OrderService {
private final OrderRepository repository;
@Transactional
public ResponseDto createOrder(RequestDto requestDto) {
Order order = new Order(requestDto);
repository.save(order);
return new ResponseDto(order); // 영속성 컨텍스트 종료
}
...
}