OSIV 정리
Intro
JPA에서 OSIV(Open Session In View)와 관련된 최적화방법을 기술하겠습니다.
1. OSIV 설명
OSIV(Open Session In View)는
영속성 컨텍스트와 데이터베이스 커넥션을
뷰까지 생존시키는 전략입니다.
OSIV ON
spring.jpa.open-in-view : true //기본값
기본값으로 osiv 전략을 사용하는 것으로 되어있습니다.
OSIV가 켜져있는 경우에는
위와 같이 트랜잭션을 벗어난 컨트롤러 단까지
영속성컨텍스트와 DB커넥션을 유지시키기 때문에
컨트롤러 단에서도 지연로딩이 가능해집니다.
- 장점: 사용자가 많은 경우가 아닌 ADMIN 페이지 같은 경우엔 지연로딩의 이점을 챙길 수 있습니다.
- 단점: 커넥션 리소스를 오래 붙잡고 있기 때문에 사용자가 많은 경우 장애로 이어질 수 있습니다.
Lazy로딩을 길게 가져가서 나중에 발현할 수록 중복도 줄여주고 유지보수성도 높아집니다.
OSIV OFF
spring.jpa.open-in-view : false
OSIV를 끄게되면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫게되고 데이터베이스 커넥션도 반환합니다.
- 장점: 커넥션 낭비를 줄여줍니다.
- 단점: 트랜잭션이 끝나기전에 트랜잭션 안에서 일일이 지연로딩을 호출해주어야하기 때문에 서비스 단의 복잡도가 상승합니다.
2. OSIV 최적화
Comand와 Query 분리
OSIV를 끈 상태로 복잡성을 관리하려면 Comand와 Query를 분리하는 것을 추천합니다.
* OrderService
- OrderService: 핵심 비즈니스 로직
- OrderQueryService: 화면이나 API에 맞춘 서비스 (주로 읽기 전용 트랜잭션 사용)
위와같은 방식으로 하나의 서비스를
간단하고 대부분 불변하는 핵심 비즈니스 로직과
자주 변경되는 복잡한 쿼리를 분리시키는 것입니다.
FACADE(퍼사드) 패턴
FACADE 패턴은 복잡한 서브시스템을 인터페이스로 한번 더 감싸서 간단하게 만드는 패턴입니다.
View -> Controller -> (FACADE Class) -> Service -> Repository -> DB
Lazy 로딩 초기화를 담당하는 중간 클래스를 하나 생성하여 거치게 하는 방법입니다.
OSIV보다 생산성이 떨어집니다.
Leave a comment