spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering.

MinSeong Kang·2022년 10월 9일
0

spring

목록 보기
17/18
최대한 확대해도 잘 안보인네요 ,,

스프링 부트로 웹 애플리케이션을 실행하였을 때, 특별한 설정을 해주지 않았다면 위와 같은 경고가 출력되는 것을 확인할 수 있을 것이다. 따라서 이번 포스팅을 통해 해당 경고는 왜 출력되는 것이고, spring.jpa.open-in-view가 뭔지에 대해서 간단하게 적어보려고 한다.

먼저 해당 경고가 항상 출력되는 것은 알고 있었으며, 그리고 Spring OSIV(open session in view)에 대해 간략하게만 알았다. 따라서 해당 경고를 처리할 생각을 하지 않고 있었는데, 이번에 [자바 ORM 표준 JPA 프로그래밍] 도서를 읽다가 Spring OSIV에 대해서 자세하게 공부하게 되었다.


Spring OSIV

Spring OSIV는 영속성 컨텍스트를 뷰까지 열어둔다는 뜻이다.

이로써 우리가 얻을 수 있는 장점은 지연 로딩에 있다.

평소에 컨트롤러와 서비스 계층을 나누어서 프로젝트를 개발함에 있어서 컨트롤러에 필요한 데이터에 따라 의존적으로 서비스를 만들곤 했다. 기본 비즈니스 로직을 제외하고는. 따라서 서비스 계층과 프레젠테이션 계층(Controller, View) 간에 논리적 의존 관계가 있었다고 할 수 있다.

하지만 Spring OSIV를 통해 영속성 컨텍스트를 뷰까지, 즉 요청이 시작해서 요청이 끝날 때까지 열어둠으로써 프레젠테이션 계층에서 지연로딩을 사용할 수 있다. 이로 인해 서비스 계층과 프레젠테이션 계층의 논리적 의존 관계를 제거할 수 있다.

영속성 컨텍스트가 프레젠테이션 계층까지 존재하니, 컨트롤러 계층에서 엔티티의 연관관계로 맺어있는 데이터를 지연로딩을 통해 가져올 수 있다.

  • 요청이 오면 서블릿 필터나 스프링 인터셉터에서 영속성 컨텍스트 생성, 서비스 계층의 @Tranctional을 통해 트랜잭션 시작, 서비스 계층이 끝나면 트랜잭션 커밋, 서블릿 필터나 스프링 인터셉터에 요청이 돌아오면 영속성 컨텍스트 종료(플러시 호출 X)

  • 프레젠테이션 계층에서 조회(지연 로딩) 가능 - 트랜잭션 없이 읽기, 수정(변경감지) 불가능

트랜잭션의 범위는 서비스 계층까지이기 때문에 프레젠테이션에서 데이터를 변경하더라도 영속성 컨텍스트이 종료될 때 flush되지 않아 무시된다.

  • 서비스 계층에서 조회 가능, 수정 가능
  • 프레젠테이션 계층에서 지연 로딩으로 인한 SQL문 발생 - 성능 튜닝 시에 확인할 부분이 많아지는 단점 존재

주의점

프레젠테이션 계층에서 엔티티를 수정한 직후에 다른 트랜잭션이 시작하는 서비스 계층을 호출하면 문제 발생 !!
왜냐하면, 스프링 OSIV는 같은 영속성 컨텍스트를 여러 트랜잭션이 공유할 수 있기 떄문에!!
그럼 어떻게 해야할까? 비즈니스 로직을 모두 호출하고 나서 엔티티를 수정하면 해당 문제는 발생하지 않는다!!


암튼! 그럼 위와 같은 장점이 있는데 OSIV를 왜 False로 설정해야 할까!

Spring OSIV는 default가 true이기 때문에 특별한 설정을 하지 않으면 Spring OSIV는 켜져 있는 상태이다. 하지만 OSIV를 통해 영속성 컨텍스트를 프레젠테이션 계층까지 열어둔다는 것은 DB 커넥션도 요청이 끝날 때까지 유지된다는 것이다!! 따라서 DB 커넥션 부족 현상이 초래될 수 있어 트래픽이 많거나 성능이 중요한 서버에서는 성능 저하라는 큰 문제를 일으킬 수 있다.

따라서 실시간 트래픽이 중요한 애플리케이션에서는 DB 커넥션이 부족할 수 있으며, Spring OSIV를 끄는 것이 바람직하다!
그래서 Spring에서 경고를 주는 것 같다..!

// application.properties
spring.jpa.open-in-view:false

// application.yml
spring:
  jpa:
    open-in-view: false

위와 같이 Spring OSIV를 끌 수 있다.!

0개의 댓글