티스토리 뷰

반응형

OSIV(Open Session In View)

 영속성 컨텍스트를 뷰까지 열어두는 기능을 말한다. 뷰에서도 지연 로딩을 사용할 수 있어 스프링 프레임워크에서는 OSIV 사용 여부를 기본적으로 true로 설정하고 있다.

 

JPA가 데이터베이스 커넥션을 언제 가져올까?

 트랜잭션이 처음 발생할 때 데이터베이스 커넥션을 가져온다!

 

그렇다면 JPA는 데이터베이스 커넥션을 언제 종료할까?

OSIV가 켜져 있는 경우

 OSIV가 켜져있다면 Service, Repository 단에서 트랜잭션이 끝나도 영속 상태를 끝까지 유지한다. 그래서 데이터베이스 커넥션과 영속 컨텍스트는 컨트롤러 단에서 최종적으로 Response를 내보낼 때까지 살아있고 컨트롤러에서도 지연 로딩이 가능하다.

 그러나 영속성 컨텍스트를 끝까지 유지한다는 것은 실시간 트래픽이 중요한 애플리케이션에서 커넥션이 모자라 서비스 장애의 원인이 될 수도 있다. 특히 컨트롤러에서 외부 API를 호출하면 외부 API의 대기 시간만큼 리소스를 반환하지 못하고 유지해 로딩이 지연될 수 있다.

 

 

OSIV가 꺼져 있는 경우

 트랜잭션 종료 시 바로 영속성 컨텍스트를 닫고, 데이터베이스의 커넥션도 반환한다. 즉 영속성 컨텍스트의 생존 범위는 트랜잭션 안(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);   // 영속성 컨텍스트 종료
    }
    ...
 }

 

 

참조:

 

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 인프런 | 강의

스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

반응형