Spring
OSIV와 성능 최적화
아토로
2022. 3. 25. 22:07
OSIV란
- 하이버네이트: Open Session In View
- JPA: Open EntityManager In View
OSIV ON
- spring.jpa.open-in-view : true (기본값)
동작 원리
- 클라이언트의 요청이 들어오면 영속성 컨텍스트를 생성한다. 이때 트랜잭션은 시작하지 않는다.
- 서비스 계증에서 트랜잭션을 시작하면 생성해둔 영속성 컨텍스트에 트랜잭션을 시작한다.
- 비즈니스 로직을 실행하고 서비스 계층이 끝나면 트랜잭션을 커밋하면서 영속성 컨텍스트를 플러시한다. 이때 트랜잭션만 종료하고 영속성 컨텍스트는 살려둔다.
- 클라이언트의 요청이 끝날 때 영속성 컨텍스트를 종료한다.
장점
- 영속성 컨텍스트가 유지되지 때문에 View Template이나 API 컨트롤러에서 지연 로딩이 가능하다.
단점
- DB 커넥션 리소스를 오랫동안 점유하게 되어 커넥션 부족으로 인한 장애 발생 위험이 있다.
- OSIV를 활성화 하고 애플리케이션을 구동하면 아래와 같은 WARN 로그를 남긴다.
2022-03-25 21:56:30.174 WARN 20879 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
OSIV OFF
- spring.jpa.open-in-view : false
장점
- 트랜잭션이 종료될 때 영속성 컨텍스트를 닫고, DB 커넥션도 반환하므로 커넥션 리소스를 낭비하지 않는다.
단점
- 모든 지연로딩을 트랜잭션 안에서 처리해야 한다.
정리
- 실시간 트래픽이 많은 서비스에서는 서비스 레이어에서 트랜잭션을 처리하고 OSIV를 비활성화한다.
- Admin 시스템과 같이 트래픽이 많지 않은 서비스에서는 OSIV를 활성화해도 된다.