[Spring] OSIV[Open

OSIV는 무엇입니까?

그것은 Hibernate에서 Open Session In View라고 불렸고 나중에 JPA가 생성된 후에 Open EntityManager In View라고 불렸습니다.

전통적으로 OSIV라고합니다. OSIV는 보기를 위해 최대 절전 모드를 열어 두는 기능입니다.

spring.jpa.open-in-view : true(기본값)


다음과 같이 애플리케이션 시작 시 경고 로그를 출력합니다. 이제 이유를 살펴보겠습니다.

OSIV 전략은 초기 데이터베이스 연결 시작부터 API 응답이 끝날 때까지 지속성 컨텍스트 및 데이터베이스 연결을 유지합니다. 이 때문에 뷰 템플릿이나 API 컨트롤러에서 지연 로딩이 가능했습니다. (지연 로딩(LAZY)이 작동하려면 지속성 컨텍스트가 활성화되어야 하며 기본적으로 지속성 컨텍스트는 데이터베이스 연결을 활성 상태로 유지합니다.) 중복을 줄이고 개발 관점에서 투명하게 LAZY 로딩을 지속할 수 있어 유지 보수 측면에서 매우 큰 이점입니다.

그러나 이 전략은 데이터베이스 연결 리소스를 너무 오래 사용하므로 실시간 트래픽이 중요한 애플리케이션의 연결이 끊길 가능성이 있습니다. 이 때문에 시스템 오류의 주요 원인이 될 수 있습니다.

이 문제를 해결하기 위해 spring.jpa.open-in-view를 false(OSIV OFF)로 설정하면 트랜잭션이 종료될 때 지속성 컨텍스트가 닫히고 데이터베이스 연결도 반환됩니다. 이것이 누락된 연결 문제를 해결할 수 있는 방법입니다.

그러나 단점은 모든 지연 로드가 트랜잭션 내에서 처리되어야 한다는 것입니다. Lazy loading은 보기 템플릿에서도 작동하지 않습니다.

((기존에 지원했던 지연 로딩은 지속성 컨텍스트가 닫혀 있고 지속성 컨텍스트의 생존 범위를 초과했기 때문에 불가능합니다.)

-> 트랜잭션이 끝나기 전에 지연 로드를 강제해야 합니다.

실제로 OSIV가 꺼져 있을 때 복잡성을 처리하는 한 가지 방법은 명령과 쿼리를 분리하는 것입니다. 비즈니스 로직에 등록되거나 수정되기 때문에 성능상의 문제는 없습니다.

그런데 검색 부분에서 성능 문제가 발생합니다. 복잡한 화면을 렌더링하는 쿼리는 화면에 대한 성능을 최적화해야 합니다. 따라서 유지/예약의 관점에서 이러한 로직을 포함하는 별도의 서비스를 만들고 화면이나 API에 대한 비즈니스 로직과 서비스를 분리하는 것이 좋습니다.

(큰 응용 프로그램을 구축하는 경우 안전을 위해 분리하는 것이 좋습니다.)

실시간 트래픽을 많이 사용하는 API에는 OSIV가 비활성화되고 연결을 많이 사용하지 않는 API에는 OSIV가 활성화됩니다.