spring.jpa.open-in-view
: true
기본값
쉽게 말해 뷰 템플릿을 통해 표시할 때까지 영속성 생명 주기를 더 길게 늘려주는 것이다. 커넥션을 유지한다는 것 자체가 장점인 것이다.
단점은 너무 오래 유지하는 것이다. 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 어플리케이션에서는 커넥션이 모자랄 수 있다.
spring.jpa.open-in-view
: false
OSIV 종료
트랜잭션을 종료할때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.
이로인해 커넥션 리소스를 낭비하지 않게 된다.
단점은 이 방법을 사용한다면 모든 지연로딩을 트랜잭션 안에서 처리해야 한다. 이 예제해서 많은 지연로딩이 컨트롤러에 들어있는데, 이를 트랜잭션 안으로 넣어야 한다.
이 단점을 해결할 수 있는 몇 가지 방법이 있다.
그 중에서 추천하는 것은 OSIV를 끈 상태로,
커맨드와 쿼리를 분리하는 것이다.
쉽게 말해 컨트롤러는 컨트롤러 일만 하고, 쿼리 관련 지연로딩 관련 모든 트랜잭션 비즈니스 로직을 전용 서비스를 따로 만드는 것이다.
OrderService
OrderService
: 핵심 비즈니스 로직OrderQueryService
: 화면이나 API에 맞춘 서비스 (주로 읽기 전용(readOnly
) 트랜잭션 사용)보통 서비스 계층에서 트랜잭션을 유지한다.
코딩만 생각하면 OSIV를 키는것이 편하고 좋다.
성능을 생각하면 OSIV를 끄는것이 유지보수하기 좋다.
오프셋을 통한 설계가 필요하다.