OSIV
- OSIV (Open Session In View = Open EntityManager In View) : 최초 데이터베이스 커넥션 시작 시점부터 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지하는 것.
- API의 경우 API가 유저에게 반환될 때까지 / 화면의 경우 화면을 렌더링할 때까지 영속성 컨텍스트를 유지시킨다.
- 지연 로딩을 가능하게 하는 기능
- 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지한다.
- 단점 - 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기에 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있고 장애로 이어진다.
- ex) 컨트롤러에서 외부 API를 호출하면 외부 API 대기 시간만큼 커넥션 리소스를 반환하지 못하고 유지한다.
- 하이버네이트에서 EntityManger = Session
- spring.jpa.open-in-view의 기본값은 True
- OSIV를 끄면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고 데이터베이스 커넥션도 반환한다.
- 주로 Service에서 트랜잭션을 사용하기에 Service단의 코드를 수행하고 나면 영속성 컨텍스트와 데이터 커넥션을 사용하지 않는다.
- 컨트롤러나 화면을 담당하는 view에서는 지연 로딩을 사용할 수 없다.
- 커넥션 리소스를 낭비하지 않지만 모든 지연 로딩을 트랜잭션 안에서 처리해야한다.
- 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출, 페치 조인을 사용해야한다.
- 주로 Service에서 트랜잭션을 사용하기에 Service단의 코드를 수행하고 나면 영속성 컨텍스트와 데이터 커넥션을 사용하지 않는다.
- 실무에서 OSIV를 끈 상태로 복잡성을 관리하는 방법
- Command와 Query를 분리하는 것.
= Getter 역할과 Setter 역할을 분리하는 것- 핵심 비지니스 로직을 가지고 있는 일반적인 Service와 화면이나 API에 맞춘 서비스 로직을 가지고 있는 Service로 나눠서 관리하는 것이 유지보수 관점에서 좋다.
- Command와 Query를 분리하는 것.
- 실무에서는 주로 고객 서비스와 같은 실시간 API는 OSIV를 끄고 ADMIN처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 켜서 사용하는 것이 좋다.
출처: [인프런 김영한 실전 스프링 부트와 JPA 활용 2 - API 개발과 성능 최적화]
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의 | 김영한 - 인프런
김영한 | 스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., 스프링 부트, 실무에서 잘 쓰고 싶다면? 복잡한 문제까지 해결하는 힘을 길
www.inflearn.com