본문 바로가기
Spring/JPA

[SpringBoot] OSIV와 성능 최적화

by 진꿈청 2024. 2. 1.

OSIVOpen Session In View의 약자이다.

 

OSIV는 Spring에 spring.jpa.open-in-view: true 기본값으로 설정되어 있다.

 

OSIV 전략은 최초 데이터베이스 커넥션 시작부터 API 응답(View에 전송 및 DTO 반환 등)이 끝날 때 까지,

영속성 컨텍스트와 데이터베이스 커넥션을 유지한다.

 

그렇기 때문에 View Template 또는 Controller에서 지연 로딩이 가능하다.

따라서, 개발자로 하여금 어느 곳에서도 데이터베이스 커넥션을 신경쓰지 않고 개발할 수 있게 해준다는 장점이 있다.

 

하지만, 해당 전략은 너무 오랜시간동안 데이터베이스 커넥션을 사용하기 때문에

실시간 트래픽이 중요하고 많은 애플리케이션에서는 커넥션 쓰레드 풀이 모자랄 수 있다.

이는 곧 장애로 이어진다.

 

만약, spring.jpa.open-in-view: false로 한다면?

 

위 경우 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.

따라서, 커넥션 낭비가 적다. 그러나, 그에 따라 지연로딩을 트랜잭션 안에서 처리해야 한다.

그간 Controller 또는 View Template에서 사용했던 지연 로딩 코드를 트랜잭션 안으로 넣어야 한다.

(Service 및 Repository가 다소 복잡해짐)


위 작업을 하지 않으면 오류가 발생한다.

 

그렇다면 어떻게 해야 할까?

 

작은 서비스면 큰 문제가 없겠지만, 큰 서비스에서는 화면에 맞춘 성능 최적화가 중요하다.

또한, 보통 장애 및 성능 문제는 조회에서 발생하기 때문에 관련된 복잡한 내용의 Service를 따로 패키지를 만든다.

이는 유지보수 관점에서 큰 의미가 있다.

 

예를 들어, TempService가 있다면,

TempService(핵심 비즈니스 로직), TempQueryService(화면이나 API에 맞춘 서비스)로 변환한다.

TempQueryService는 보통 주로 읽기 전용 트랜잭션에 사용하면 좋다.

 

 

정리

고객 서비스의 실시간 API는 OSIV를 끄면 좋고 ADMIN 처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 키는게 좋다고 한다.

 

 

 

본 내용은 김영한 강사님의 인프런 JPA 강의를 토대로 작성되었습니다.