반응형

OSIV에 대한 이해를 하려면 영속성 컨텍스트가 뭔지 알아야한다. 이전 글을 참고하자.

2022.01.27 - [개발/spring] - [jpa] 영속성 컨텍스트 in spring

 

[jpa] 영속성 컨텍스트 in spring

영속성 컨텍스트? 엔티티를 영구 저장하는 환경으로 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하

bangpurin.tistory.com

 

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?

라고 하면 프레젠테이션 단부터의 영속성 유지 방식을 말한다.

old OSIV

이렇게 될 경우 저번 시간에 살펴 본 지연로딩의 문제는 사라지겠지만, 컨트롤러 단에서 수정한 값이 별도의 로직이 없이도 그대로 DB에 반영되어 위험하다. 

 

스프링의 OSIV는 비즈니스 계층 중심의 OSIV이다. 

위 설정 값에 따라 두 가지 버전을 제공하는데, 하나씩 알아보자.

OSIV ON / spring.jpa.open-in-view=true

OSIV on

영속성 컨텍스트의 범위와 트랜젝션의 범위를 다르게 가져가는 것이다. 이전 글에서 '스프링 컨테이너는 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다'고 했는데 그걸 깰 수 있게 되는 것이다.

  • 장점
    • API 요청부터 응답이 끝날 때 까지 영속성 컨텍스트와 DB 커넥션을 유지
    • 지연로딩 등의 처리가 가능
  • 단점
    • DB 커넥션 리소스를 비교적 장시간 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자를 수 있음
    • 예를 들어 외부API가 오래걸려서 생기는 지연동안에도 DB커넥션을 들고있어 비효율적임

 

OSIV OFF / spring.jpa.open-in-view=false

OSIV off

저번 시간에 본 스프링 컨테이너의 기본전략과 동일하다.

  • 장점
    • 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, DB 커넥션도 반환하기에 커넥션 리소스를 낭비하지 않음
  • 단점
    • 준영속 시 생기는 문제 그대로 나옴
    • 모든 지연로딩 코드를 트랜잭션 안으로 넣거나 강제 호출해야 함

해결법?

요즘 뜨는 cqrs기법이 제일인 듯 하다.

2022.01.11 - [architecture/micro service] - [arch] what is cqrs - 조회와 비조회의 엄연한 분리

 

[arch] what is cqrs - 조회와 비조회의 엄연한 분리

CQRS는 Command and Query Responsibility Segregation(명령과 조회의 책임 분리)의 약자이다. 즉 쉽게 말해서 data에 대한 read와 write는 분리되어 개발되어야 한다는 것이다. 1. Before 설명을 하기 전에 그림..

bangpurin.tistory.com

 


그래서 OSIV 를 끄라는 건지, 켜라는 건지...

  • 실시간 트레픽/성능이 중요한 경우 OSIV를 사용하지 말고(off), DTO로 직접 조회하도록 하자.
  • 어드민 페이지같이 실시간 트레픽이 중요하지 않는 경우 OSIV를 사용해도 좋다(on)!

참고

영속성과 OSIV: https://ttl-blog.tistory.com/183

 

[JPA] OSIV란? (feat. 스프링 JPA의 작동원리, 퍼사드 패턴 등)

OSIV에 다가가기까지 조금 서론이 길다. (JPA의 작동원리, FACADE 계층 등) OSIV에 대해서만 궁금하다면 그쪽 부분만 찾아서 보길 바란다. 스프링에서 JPA를 사용하게 되면, 스프링 컨테이너가 트랜잭

ttl-blog.tistory.com

 

728x90
반응형

+ Recent posts