JPA OSIV에 대해
JPA OSIV 사용시 주의할 점에 대해 알아보자.
OSIV
- Open Session In View (Open EntityManager In View)
- OSIV란 영속성 컨텍스트의 생존 범위를 결정하는 것을 말한다.
- 스프링 사용시 OSIV 옵션은 기본으로 true(ON)로 설정되어있다.
- OSIV를 true(ON)로 했을 때와 false(OFF)로 했을 때 각각 알아보자.
OSIV ON
spring.jpa.open-in-view: true
- OSIV를 ON 했을 때는 영속성 컨텍스트의 생존 범위가 트랜잭션을 넘어서 View가 랜더링되거나 API 컨트롤러에서 응답을 반환할 때까지 유지된다.
- ON 했을 때는 컨트롤러 계층에서 지연로딩이나 영속성 컨텍스트를 접근할 수 있는 장점이 있다.
- 하지만 이 전략은 매우 위험하다.
- 영속성 컨텍스트는 기본적으로 커넥션을 함께 사용한다. 그렇기 때문에 ON 했을 때는 DB 커넥션을 너무 길게 유지해야하기 때문에 커넥션이 부족해지는 문제가 발생할 수 있다.
- 그렇기 때문에 실시간 성능이 중요한 애플리케이션에서는 사용해서는 안된다.
OSIV OFF
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.