OSIV는 무엇입니까
OSIV(Open Session In View)를 통해 지속성 컨텍스트 및DB 연결을 유지하십시오. 이것은 뷰와 컨트롤러에서 레이지 로딩을 가능하게 합니다.
* 트랜잭션 시작 시 DB 연결을 획득합니다.
그러나 이 전략에는 DB 연결이 너무 오랫동안 활성 상태로 유지되면 리소스 고갈로 이어질 수 있다는 큰 단점이 있습니다.
따라서 상황에 맞는 OSIV 전략이 필요합니다.
OSIV 작동 방식
jpa에서는 OSIV의 기본값이 true(사용)로 제공됩니다.
1. 클라이언트 요청이 들어오면 Servlet 필터 또는 Spring 인터셉터에 지속성 컨텍스트가 생성됩니다.
2. 서비스 계층(@Transactional 주석이 있는 위치)에서 이전에 생성된 지속성 컨텍스트로 트랜잭션을 시작합니다.
3. 트랜잭션을 커밋하면 지속성 컨텍스트가 플러시되지만 지속성 컨텍스트는 닫히지 않습니다(뷰와 컨트롤러는 보존됨).
4. 요청이 반환되면 지속성 컨텍스트가 플러시되지 않고 즉시 닫힙니다.
OSIV 꺼짐
OSIV가 꺼져 있으면 트랜잭션 후에도 DB 연결이 유지되므로 리소스가 낭비되지 않습니다.
그러나 지속성 컨텍스트도 종료되기 때문에 뷰와 컨트롤러에서 지연 로딩을 수행할 수 없습니다.
따라서 하나의 트랜잭션 내에서 모든 지연 로딩을 처리해야 합니다.
이를 해결하는 방법에는 여러 가지가 있습니다.
B. OSIV를 다시 켜거나 페치 조인을 사용합니다.
관심사를 가장 간단하게 분리하면 문제가 해결됩니다.
(명령어와 쿼리 분리)
명령과 쿼리의 분리
일반적으로 핵심 비즈니스 로직은 일단 개발되면 쉽게 변경되지 않습니다.
반면, 화면을 구성하는 뷰 로직은 개발이 시작된 이후에도 여러 번 변경되기 때문에 둘의 수명주기가 다릅니다.
따라서 유지 관리 관점에서 둘 사이의 관심사를 명확하게 분리하는 것이 이치에 맞습니다.
전)
주문 서비스
OrderService: 핵심 비즈니스 로직
OrderQueryService: 화면 또는 API 맞춤형 서비스(대부분 읽기 전용 트랜잭션 포함)
두 서비스 모두 트랜잭션을 유지하면서 지연 로드를 사용할 수 있습니다.