OSIV (Open-(Session)-In-View) 란?
2022. 12. 14. 12:20ㆍJava/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로 설정하는 것을 권장합니다.
참고 :
'Java > JPA' 카테고리의 다른 글
[API 개발 고급] 컬렉션 조회 최적화(페치 조인, 페이징) (0) | 2022.05.26 |
---|---|
[API 개발 고급] 지연 로딩과 조회 성능 최적화(V4) 4/4 (0) | 2022.05.26 |
[API 개발 고급] ❗지연 로딩과 조회 성능 최적화(V3) 3/4 (0) | 2022.05.25 |
[API 개발 고급] 지연 로딩과 조회 성능 최적화(V2) 2/4 (0) | 2022.05.25 |
[API 개발 고급] 지연 로딩과 조회 성능 최적화(V1) 1/4 (0) | 2022.05.25 |