Post

JPA OSIV에 대해

JPA OSIV 사용시 주의할 점에 대해 알아보자.

OSIV

  • Open Session In View (Open EntityManager In View)
  • OSIV란 영속성 컨텍스트의 생존 범위를 결정하는 것을 말한다.
  • 스프링 사용시 OSIV 옵션은 기본으로 true(ON)로 설정되어있다.
  • OSIV를 true(ON)로 했을 때와 false(OFF)로 했을 때 각각 알아보자.

OSIV ON

image

  • spring.jpa.open-in-view: true
  • OSIV를 ON 했을 때는 영속성 컨텍스트의 생존 범위가 트랜잭션을 넘어서 View가 랜더링되거나 API 컨트롤러에서 응답을 반환할 때까지 유지된다.
  • ON 했을 때는 컨트롤러 계층에서 지연로딩이나 영속성 컨텍스트를 접근할 수 있는 장점이 있다.
  • 하지만 이 전략은 매우 위험하다.
  • 영속성 컨텍스트는 기본적으로 커넥션을 함께 사용한다. 그렇기 때문에 ON 했을 때는 DB 커넥션을 너무 길게 유지해야하기 때문에 커넥션이 부족해지는 문제가 발생할 수 있다.
  • 그렇기 때문에 실시간 성능이 중요한 애플리케이션에서는 사용해서는 안된다.

OSIV OFF

image

  • spring.jpa.open-in-view: false
  • OFF로 설정하면 트랜잭션 범위에서 영속성 컨텍스트도 끝이 난다. 따라서 DB 커넥션을 낭비하지 않고 사용할 수 있다.
  • 이 전략은 영속성 컨텍스트를 사용하는 지연로딩을 사용하는 로직을 모두 트랜잭션 안에 넣어야되므로 Service 계층의 복잡성이 증가한다는 단점이 있다.

OSIV OFF시 단점 해결

  • Service 계층이 복잡성이 너무 증가했다면 여러가지 방법으로 복잡성을 줄일 수 있다.
  • 대표적으로 Service 로직을 분리해서 실제 비즈니스 로직과 화면 출력을 위한 쿼리를 분리하는 방법이 있다.
  • OrderService
    • OrderService: 핵심 비즈니스 로직
    • OrderQueryService: 화면이나 API에 맞춘 서비스 (주로 읽기 전용 트랜잭션 사용)
  • 이 방법 외에도 다양한 방법이 존재하니 고민해보자.

출처)

[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의김영한 - 인프런 (inflearn.com)](https://www.inflearn.com/course/스프링부트-JPA-API개발-성능최적화)
This post is licensed under CC BY 4.0 by the author.