OSIV에 대한 이해를 하려면 영속성 컨텍스트가 뭔지 알아야한다. 이전 글을 참고하자.
2022.01.27 - [개발/spring] - [jpa] 영속성 컨텍스트 in spring
springboot2.0 이 후 springboot 프로젝트를 시작하면 아래와 같은 warning이 지나갔는데, 딱히 별 일 없어서 그냥 넘어갔었다.
WARN [JpaBaseConfiguration$JpaWebConfiguration.openEntityManagerInV: 219] 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
warning을 지우는 방법은 프로퍼티(application.properties)에 아래 설정값을 주면 되긴하지만,
spring.jpa.open-in-view=false
단순히 저 warning을 지우는 건 의미가 없으므로.. 저 설정 값의 의미를 생각해보도록 한다.
참고로 default는 true로 사용하는 것임
OSIV란?
Open Session In View의 줄임말로 영속성 컨텍스트를 뷰까지 열어둔다는 뜻이다. 영속성 컨텍스트가 살아있으면 엔티티는 영속 상태로 유지된다. (따라서 뷰에서도 지연 로딩을 사용할 수 있다.)
참고로 Open Session In View는하이버네이트에서 사용하는 단어이며, JPA에서는 Open EntityManager In View 라고 하지만 보통 OSIV라고 한다.
기존 방식의 OSIV?
라고 하면 프레젠테이션 단부터의 영속성 유지 방식을 말한다.
이렇게 될 경우 저번 시간에 살펴 본 지연로딩의 문제는 사라지겠지만, 컨트롤러 단에서 수정한 값이 별도의 로직이 없이도 그대로 DB에 반영되어 위험하다.
스프링의 OSIV는 비즈니스 계층 중심의 OSIV이다.
위 설정 값에 따라 두 가지 버전을 제공하는데, 하나씩 알아보자.
OSIV ON / spring.jpa.open-in-view=true
영속성 컨텍스트의 범위와 트랜젝션의 범위를 다르게 가져가는 것이다. 이전 글에서 '스프링 컨테이너는 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다'고 했는데 그걸 깰 수 있게 되는 것이다.
- 장점
- API 요청부터 응답이 끝날 때 까지 영속성 컨텍스트와 DB 커넥션을 유지
- 지연로딩 등의 처리가 가능
- 단점
- DB 커넥션 리소스를 비교적 장시간 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자를 수 있음
- 예를 들어 외부API가 오래걸려서 생기는 지연동안에도 DB커넥션을 들고있어 비효율적임
OSIV OFF / spring.jpa.open-in-view=false
저번 시간에 본 스프링 컨테이너의 기본전략과 동일하다.
- 장점
- 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, DB 커넥션도 반환하기에 커넥션 리소스를 낭비하지 않음
- 단점
- 준영속 시 생기는 문제 그대로 나옴
- 모든 지연로딩 코드를 트랜잭션 안으로 넣거나 강제 호출해야 함
해결법?
요즘 뜨는 cqrs기법이 제일인 듯 하다.
2022.01.11 - [architecture/micro service] - [arch] what is cqrs - 조회와 비조회의 엄연한 분리
그래서 OSIV 를 끄라는 건지, 켜라는 건지...
- 실시간 트레픽/성능이 중요한 경우 OSIV를 사용하지 말고(off), DTO로 직접 조회하도록 하자.
- 어드민 페이지같이 실시간 트레픽이 중요하지 않는 경우 OSIV를 사용해도 좋다(on)!
참고
영속성과 OSIV: https://ttl-blog.tistory.com/183
'개발 > spring' 카테고리의 다른 글
[spring] graceful shutdown default as of 2.3 (0) | 2022.02.03 |
---|---|
[actuator] git info를 health에 포함하기 (0) | 2022.01.28 |
[jpa] 영속성 컨텍스트 in spring (0) | 2022.01.27 |
[jpa] one-indexed pageable (0) | 2022.01.27 |
[swagger] in springboot2.6.2 and springdoc (0) | 2022.01.26 |