몰입하며 나아가는 개발이란

Framework/JPA

OSIV란?

류하을 2022. 5. 3. 10:00

OSIV

Open-Session-In-View

OSIV? OEIV?

JPA에서는 Open EntityManager In View, OEIV 라고하며, 하이버네이트에서는 OSIV라고 부르지만 같은 기능이다.

OSIV 전략은 트랜잭션 시작시 최초 데이터베이스 커넥션 시작 시점부터 API응답이 끝날 때(View) 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다.

즉, View 레이어에서도 지연로딩을 사용할 수 있다.

스프링이 제공하는 OSIV는 서블릿 또는 인터셉터에서 적용이 가능하며, OSIV사용시 영속성 컨텍스트는 View 레이어까지 지속되지만 영속상태의 객체를 수정할경우에는 트랜잭션 안에서만 가능하다.

OSIV 사용시

spring.jpa.open-in-view = true 설정후 어플리케이션을 구동하면 시작 시점에 warn 로그를 출력하게된다.

OSIV 사용시 단점

이 전략은 너무 오랜시간동안 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다.

OSIV를 끄면 트랜잭션을 종료할때 영속성 컨텍스트를 닫고, 테이터베이스 커넥션도 반환 한다.

OSIV를 끄면 모든 지연로딩을 트랜잭션 안에서 처리 해야한다. 즉, 트랜잭션이 끝나기전에 지연로딩을 강제호출해 두어야 한다.

OSIV 미사용시

OSIV를 끄게 되면 아래와 같이 트랜잭션 레이어에서 영속성 컨택스트를 유지하게 된다. 따라서 커넥션 리소스가 사용시 보다 일찍 종료되어 트레픽이 많아 커넥션 리소스가 모자를 때 선택하는 전략이다.

OSIV 미사용시 장단점

OSIV 미사용시 View레이어에 보낼 데이터를 강제 정리해야하므로 Service에서 복잡성이 증가하게 되는데 이러한 복잡성은 Command와 Query를 분리하는 방법이 있다. 규모가 크고 트레픽이 많은 복잡한 애플리케이션이라면 성능 최적화와 유지보수 관점에서 이러한 방법을 고려해 볼 수 있고, 그렇지 않고 규모가 작고 트레픽이 적은 간단한 애플리케이션이라면 복잡성만 늘어나는 결과를 초래할 수 있으므로 이점을 잘 고려하여 선택해야한다.

'Framework > JPA' 카테고리의 다른 글

Spring Data JPA  (0) 2022.05.02