OSIV (Open-(Session)-In-View) 란?

2022. 12. 14. 12:20Java/JPA

OSIV 

Hibernate에서는 Open Session In View라 하고, JPA에서는 Open EntityManager In View라 합니다.

관례상 OSIV이라 칭합니다.

 

 

Session

쿠키, 세션 할 때 그 세션인가요? 아닙니다. DB에 접근할 수 있는 세션입니다.

 

 

application.yml

spring:
  jpa:
    open-in-view: true    #default
  • open-in-view: true
    • 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있습니다. API라면 클라이언트에게 응답될 때까지 View라면 랜더링 될 때까지 영속성 컨텍스트가 살아있습니다.
  • open-in-view: false
    • 트랜잭션을 종료할 때 영속성 컨텍스트가 닫히므로  Lazy loading 또한 할 수 없습니다.

 

 

예)

상황
- SNS에서 apple이라는 유저가 사진을 업로드하고자 합니다.
- 업로드 후 profile페이지로 돌아가면 자신이 올린 이미지가 나와야 합니다.

백엔드 로직:
View단으로 갈 때 User는 (자신이 올린) Image도 함께 가져가야 합니다. (양방향 매핑)

방법 :
- 즉시 로딩 + open-in-view: false
- 지연 로딩 + open-in-view: true

 

이러한 방법으로 User가 해당 id로 등록한 Image들을 가져올 수 있습니다. 그림으로 한 번 보겠습니다. 

false부터 설명드린 후 true를 설명드리는 게 순서상 자연스러워서 false부터 시작하겠습니다.

 

 

 

open-in-view: false

  • 1. DB에 접근 가능한 세션 생성
  • 2. Service가 끝나는 시점에 세션이 종료됨
  • 3. 이미 세션이 종료된 상태의 Controller에서 DB에 Image를 요청 → DB가 거절
    • 단, 즉시 로딩이라면 영속성컨텍스트에 User+images 있는 상태이므로 가져올 수 있음

 

 

open-in-view: true

  • 1. DB에 접근 가능한 세션 생성
  • 2. View단까지 세션을 open
  • 3. 그럼 지연 로딩으로 설정해도 DB에서 user id에 딸린 images를 가져올 수 있음

 

 

 

open-in-view: true 단점

영속성 컨텍스트를 유지한다는 건 DB Connection 또한 계속 가지고 있다는 뜻입니다. (자원 낭비)
실시간 트래픽이 중요한 애플리케이션에서는 DB Connection이 모자를 수 있으므로 성능이 중요하다면 OSIV는 false로 설정하는 것을 권장합니다.

 

 

 

 

 

 

 

 

 

참고 :

https://gracelove91.tistory.com/100