본문 바로가기
Spring

OSIV와 성능 최적화

by 아토로 2022. 3. 25.

OSIV란

  • 하이버네이트: Open Session In View
  • JPA: Open EntityManager In View

OSIV ON

  • spring.jpa.open-in-view : true (기본값)

동작 원리

  1. 클라이언트의 요청이 들어오면 영속성 컨텍스트를 생성한다. 이때 트랜잭션은 시작하지 않는다.
  2. 서비스 계증에서 트랜잭션을 시작하면 생성해둔 영속성 컨텍스트에 트랜잭션을 시작한다.
  3. 비즈니스 로직을 실행하고 서비스 계층이 끝나면 트랜잭션을 커밋하면서 영속성 컨텍스트를 플러시한다. 이때 트랜잭션만 종료하고 영속성 컨텍스트는 살려둔다.
  4. 클라이언트의 요청이 끝날 때 영속성 컨텍스트를 종료한다.

장점

  • 영속성 컨텍스트가 유지되지 때문에 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를 활성화해도 된다.

댓글