jpa에서 OSIV는 API가 끝날때까지 즉, view에 반환할때까지 DB Connection을 가지고 있는것을 말한다. OSIV가 켜져 있으면, Transaction이 끝나도 영속성 컨텍스트가 DB Connection을 붙들고 있기 때문에 lazy loading같은 fetch 전략을 사용가능하다. 하지만, 트래픽이 많을 때는 DB connection을 계속 유지하고 있으면 thread pool의 connection이 모자라 서비스 장애로 이어질 수 있다.
따라서 트래픽이 많은 곳에서는 OSIV를 꺼두어야 한다.
OSIV를 끄면, transaction이 끝남과 동시에 DB Conn을 반납하기 때문에 지연로딩은 모두 transaction안에서 처리해야 한다.
OSIV가 켜져 있을때는 controller단에서도 지연로딩을 처리할 수 있지만
OSIV가 꺼져 있다면 service단의 한 transaction안에서 지연로딩을 처리하면 된다.
OSIV는 default가 true이고, 설정하는 방법은 다음과 같다.
application.yaml 파일에 설정한다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/test2
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
default_batch_fetch_size: 100
format_sql: true
open-in-view: false
spring.jpa.open-in-view 에 false라고 설정하면 OSIV가 꺼진다.