[JPA] Open-in-view

끝으로 ㅣ 2024. 4. 25. 18:40

Spring Boot 프로젝트에서 spring-data-jpa를 사용하는 경우 애플리케이션 실행 시 다음과 같은 WARN 로그를 본 적이 있을 것이다.

WARN o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration.openEntityManagerInViewInterceptor - 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

open-in-view(기본 값=true)를 false로 변경하면 해당 로그는 보이지 않게 되지만 open-in-view가 뭔지 궁금해서 알아보았다.

 

Open-in-view

OSIV(Open Session In View)를 open-in-view라고 한다.

Hibernate에서는 JPA의 EntityManager가 Session이어서 Open EntityManager In View지만 관례상 OSIV라고 한다.

 

OSIV가 true일 때와 false일 때의 차이를 알아보자.

open-in-view : true

open-in-view가 true로 설정되어 있다면, 트랜잭션 범위를 벗어나도 세션을 가지고 있다.

API의 경우 client에게 반환될 때까지, 화면의 경우 View Template의 렌더링이 끝날 때까지 가지고 있는데,

이 말은 트랜잭션 범위를 벗어나더라도 DB 커넥션을 유지한다는 것이다.

 

DB 커넥션을 유지하고 있기 때문에 지연 로딩이 가능했던 것 (지연 로딩은 영속성 컨텍스트가 살아있어야 함)

 

true일 때는 너무 오랜 시간동안 DB 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션의 경우 커넥션이 모자랄 수 있다.

 

open-in-view: false

open-in-view가 false라면 트랜잭션 범위동안만 DB 커넥션을 유지하게 된다.

그렇기 때문에 트랜잭션 안에서 모든 지연 로딩을 처리해야 함.

View Template에서 지연 로딩이 동작하지 않기 때문에 트랜잭션이 끝나기 전에 강제로 지연 로딩을 호출해야 한다.

 

 

본인의 프로젝트 상황에 맞게 OSIV 설정을 하여 사용하면 된다.

 

끝.

'Spring Data Jpa' 카테고리의 다른 글

[JPA] 데이터 중복 체크 existsBy vs countBy  (0) 2023.12.17