본문 바로가기

Programming/JPA

[JPA] OSIV(Open Session In View)

728x90

OSIV On

OSIV가 on 되어 있을때 영속성 컨텍스트 생존 범위를 나타낸 그림

- spring.jpa.open-in-view : true (default)

- OSIV 전략 : 트랜잭션 시작처럼 최초 DB 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 DB 커넥션 유지

- 장점

 1) 뷰 템플릿이나 API 컨트롤러에서 지연 로딩 가능 (지연 로딩은 영속성 컨텍스트가 살아 있어야 가능)

 2) DB 커넥션 유지

- 단점

 너무 오랜시간동안 DB 커넥션 리소스를 잡아먹음 → 실시간 트래픽이 중요한 애플리케이션에서는 커넥션 부족할 수 있음 = 장애 발생

OSIV Off

OSIV가 off 되어 있을때 영속성 컨텍스트 생존 범위를 나타낸 그림

- spring.jpa.open-in-view : false

- 장점 : 트랜잭션 종료시 영속성 컨텍스트를 닫고, DB 커넥션도 반환 → 커넥션 리소스를 낭비하지 않음

- 단점

 1) 지연 로딩을 트랜잭션 안에서 처리해야 함

 2) 뷰 템플릿에서 지연 로딩 동작 X 

→ 트랜잭션이 끝나기 전에 지연 로딩을 호출해둬야 함 (지연로딩 처리를 안하면 에러 발생)

 

* OSIV off 상태에서 지연 로딩 해결 방법

→ 커맨드와 쿼리를 분리 (Command-query seperation)

핵심 비즈니스 로직화면이나 API에 맞춘 서비스를 명확하게 분리하면 유지보수 관점에서 좋다

ex) OrderService : 핵심 비즈니스 로직, OrderQueryService : 화면이나 API에 맞춘 서비스 (주로 readonly 트랜잭션 사용)

- 서비스 계층에서 트랜잭션 유지하면서 지연 로딩 사용

 

고객 서비스의 실시간 API → OSIV off

Admin 서비스 → OSIV on

 

 

*참고 : 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의 (강사 : 김영한)

'Programming > JPA' 카테고리의 다른 글

[JPA] 데이터 조회 방식  (0) 2021.03.12