OSIV 를 통한 성능 최적화 ( Connection 관리 관점 )
OSIV 란 뭘까?
OSIV는 Open Session In View의 약자로 spring.kpa.open-in-view 옵션을 통해 application.properties 또는 yml 파일에서 On / Off 설정을 할 수 있다.
OSIV의 기본값은 true 이다. ( on 상태를 의미한다. )
기본적으로, 트랜잭션을 시작할 때 JPA의 영속성 콘텍스트는 데이터베이스 커넥션을 가져온다.
OSIV는 트랜잭션이 끝나도 사용자에게 Response 가 반환 될 때까지 영속성 콘텍스트와 데이터베이스 커넥션을 끝까지 살려주는 역할을 한다.
OSIV - On
OSIV 가 On 이면 위 그림과 같이 요청에서 응답까지 이르는 모든 범위에서 영속성 콘텍스트와 데이터베이스 커넥션이 살아 있다.
이렇게 모든 범위에서 영속성 컨텍스트가 살아 있으면 지연(Lazy) 로딩을 view template와 Controller에서도 사용할 수 있다는 장점을 가진다. (지연 로딩은 영속성 콘텍스트가 살아 있어야 사용 가능하다. 관련 내용은 2024.02.05 - [개발/jpa] - JPA 에서 프락시 객체와 지연 로딩에 자세하게 정리했다 )
이렇게 커넥션을 계속 유지해주는 것은 개발자의 관점과 유지보수 시에는 큰 장점이 되지만, 커넥션이 많이 발생하는 경우에는 불필요한 커넥션 개수 때문에 커넥션 자체가 말라버리는 단점으로 변경된다.
예를 들어서 외부 API에 연결을 할 때 오래 걸리면, 외부 API에서 response 가 떨어질 때까지 불필요한 커넥션이 유지되는 것을 생각해보면 이해하기 쉽다.
OSIV - Off
off 상태는 데이터베이스 트랜잭션 범위까지만 영속성 컨텍스가 유지된다. 이렇게 되면 불필요한 커넥션이 유지되는 문제는 해결할 수 있지만, 지연 로딩을 사용하는 서비스 로직들을 모두 트랜잭션 내에서 ( service / repository ) 처리해야 하는 단점이 있다.
만약 커넥션이 많이 발생하는 서비스의 경우, Off로 변경한 뒤 핵심 비즈니스 로직과 화면이나 API에 맞춰 변화하는 서비를 분리해서 코드를 관리하면 좋은 해결방법이 될 수 있다.