OSIV

강한친구·2022년 7월 25일
0

JPA

목록 보기
17/27

Open Session In View

혹은 JPA에서는 Open EntityManager In View라고 하지만
관례상 OSIV라고 한다.

spring.jpa.open-in-view
defalut = true

OSIV ON

OSIV 전략은 트랙잭션 시작처럼 DB 첫 커넥션 시점부터 API 응답종료까지 영속성 컨텍스트와 DB 커넥션을 유지한다.

즉, Transaction이 시작하고 나면 DB에 연결하고, 트랜잭션이 끝나도 이 API호출이 아예 끝날때까지, 혹은 response가 나가고 더 이상 쓸모가 없어질때까지 들고있는상태로 간다.

지연로딩은 영속성 컨텍스트가 살아있어야 가능한데 이 기능을 통해 뷰나 컨트롤러쪽에서도 지연로딩이 가능하게 되는것이다.

하지만 이 전략은, DB 커넥션을 너무 오래 물고있게된다. 만약 실시간 트래픽이 중요한 어플리케이션에서는 커넥션부족 문제가 생길 수 있다. 컨트롤러에서 외부 API를 호출하면 외부 API 대기시간만큼 커넥션을 유지해야하는 큰 단점이 있다.

OSIV OFF

OSIV를 끄면 이전과는 반대로 트랜잭션을 종료하는 시점에서 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다. 따라서 커넥션 리소스를 오래 물고있지 않는다.

대신 이를 끄면 지연로딩을 외부에서 더 이상 처리할 수가 없기때문에 트랜잭션안에서 전부 해결해야하는 단점이 생긴다.

끄고 난 후의 해결책

외부에서 처리하던 모든 코드를 Transaction안으로 옮기면 해결된다. Query 조회 전용 Service를 만들고 그 service에 Transaction을 붙이고 돌리는 방식으로 하면 된다.

커맨드와 쿼리 분리

OSIV를 끈 상태로 복잡성을 관리하는 방법이 존재한다.
바로 커맨드와 쿼리 분리이다.

보통 비즈니스 로직은 특정 엔티티를 등록하거나 수정하는것이라 성능에 영향이 별로 없고 자주 변하지도 않는다. 주로 성능문제는 화면에 자료를 출력할 때 발생하게 된다.
따라서

OrderService : 비즈니스 로직 전용
OrderQueryService : 쿼리 전용

이렇게 분리해서 개발하는것이 권장된다.

그래서 끄는가 키는가

유지보수만 보면 키는게 좋지만, 키자니 성능이 무너진다.

따라서 서비스에 따라 적당히 조절해야한다.

0개의 댓글