반응형
1.OSIV란?
- OSIV는 Open Session In View의 줄임말로써 영속성 컨텍스트를 view까지 열어두는 기능이다. 영속성 컨텍스트가 유지된다면 엔티티도 영속 상태로 유지되고 view까지 영속성 컨텍스트가 유지된다면 지연 로딩을 사용할 수 있다.
쉽게 이야기 하면 view에 가서도 엔티티 호출하여 데이터를 불러올 수 있다는 말이다. - Spring JPA에서 OSIV는 디폴드 값이 true 이며 설정 변경을 통해 on/off 가능하다.
2. OSIV ON
- 기본적으로 JPA가 DB 컨넥션을 가져오는 시점은 @Transactional 어노테이션이 추가된 메소드가 실행될 때 DB 컨넥션을 가져오게 된다.(일반적으로 Service영역)
그렇다면 DB에 컨넥션을 반환하는 시점은 언제일까? 일반적으로 Transaction이 종료될 때 컨넥션을 반환하게 되고 영속성 컨텍스트도 종료하게 된다. - Open-in-view 옵션을 true로 설정 시 에는 트랜잭션이 종료되더라도 영속성 컨텍스트가 종료되지 않고 계속 사용가능한 상태가 된다. 그렇기에 최종 view 렌더링이 완성되고 data response가 나가야지만 DB 컨넥션을 반환하고 영속성 컨텍스트 역시 이 시점에 사라지게 된다.
그렇기에 View Template나 Controller로에서도 지연 로딩이 가능하게 되는 것이다.
(View나 Controller 영역에서도 DB 호출을 통한 엔티티 호출이 가능하다)
- OSIV ON 상태의 가장 큰 단점은 DB 커넥션이 오랫동안 유지된다는 점이다. 오랫동안 유직되기 때문에 장점이 되기도 하지만 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모잘라수 있다.
예를 들어 Controller에서 외부 API 호출을 하는 경우가 있을 수도 있다. 이때 외부 API쪽의 장애 혹은 지연 현상이 벌어지게되면 대기 시간 만큼 컨넥션 리소스를 반환하지 못하게 되고 이는 결국 DB 컨넥션 갯수의 부족으로 장애 상황까지 벌어질 수 있다.
3. OSIV OFF
- open-in-view 옵션을 false로 하게되면 @transactional 이 선언된 메소드가 종료 시에 DB 컨넥션 반환과 영속성 컨텍스트 종료가 된다. 그렇기에 on 상태와는 다르게 DB 컨넥션 리소스에 대해 낭비가 없다.
아래 그림에서 보다시피 트랜잭션 범위와 영속성 컨텍스트 범위가 동일하게 적용되면 Controller, View 영역에서는 지연로딩 사용이 불가능하다.
- OSIV OFF 상태의 단점은 모든 지연로딩을 트랜잭션 안에서만 처리해야한다. 그러다보니 특정 모듈을 같이 사용하다보면 복잡도가 올라가면서 유지보수에 어려움이 발생한다.
- 이러한 단점을 해결하기 위해서는 Command와 Query를 분리하여 사용한다. 복잡한 화면을 구성하기 위해서는 쿼리 역시 복잡해지고 최적화가 필하다. 그러므로 관심사를 분리하는 것이 유지보수 관점에서는 유용하다.
예) OrderService : 핵심 비지니스 로직
OrderQueryService : 특정 화면이나 API에 맞춘 서비스( 주로 읽기전용 트랜잭션 사용)
- 참고 자료 : 실전! 스프링 부트와 JPA 활용2(김영한님)
반응형
'Backend > Spring' 카테고리의 다른 글
Spring JPA mappedBy? 연관관계의 주인? (0) | 2022.03.04 |
---|---|
Spring Data JPA -Cascade와 orphanRemoval? (0) | 2022.03.03 |
[JPA] N+1 문제 (0) | 2022.02.28 |
JPA 즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)? (0) | 2022.02.24 |
JPA 프록시란? (0) | 2022.02.24 |