본문 바로가기
Spring

OSIV 전략

by browoo97 2022. 5. 5.

Open Session In View : 하이버네이트

Open EntityManager In View : JPA

관례상 OSIV라 부른다.

 

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

  • OSIV ON

OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성컨텍스트와 테이터 베이스 커넥션을 유지한다. → 즉, controller 단에서 지연로딩 사용이 가능하다, 지연로딩을 트랙잭션에 안에서 모두 처리하지 않아도 된다.

 

  •  OSIV OFF

 

OSIV를 끄면 트랜잭션 종료시 영속성 컨텍스트가 종료되고 데이터베이스 커넥션 또한 반환된다. 따라서 리소스를 낭비하지 않는다. 영속성 컨텍스트가 종료될 시, 당연히 지연로딩 또한 사용할 수 없기 때문에 지연로딩에 대한 코드는 모두 트랜잭션 안에서 처리해야 한다.

 

 

OSIV 전략

장점 : 영속성 컨텍스트와 데이터베이스 커넥션이 API 응답시점까지 계속 유지되고 있기 때문에 지연로딩이 가능하다.

 

단점 : 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에서는 케녁션이 모자랄 수 있다. → 컨트롤러에서 외부 API를 호출하면(외부 api기 때문에 대기 시간이 비교적 길 수 있다.) 외부 api 대기시간 만큼 데이터베이스 커넥션 리소스를 반환하기 못하기 유지해야한다. → 즉, 데이터베이스 커넥션을 실제로 사용하지 않는데도 불구하고 데이터베이스를 반환하지 못한다. → controller 단 까지 커넥션을 끌고 가면 비효율적일 수 있다.

 

 

OSIV OFF 상태 - 복잡성 관리

  1. 비즈니스 로직 코드 (Command)
  2. 단순 api 화면을 위한 조회 코드(Query)

두개의 코드를 분리하여 관리한다.

controller 단의 지연로딩 코드들이 모두 service 단에서 처리되어 하기 때문에 service 단의 복잡성이 커질 수 있다.

규모가 작은 프로젝트에서는 두개 모두 한 곳에서 관리해도 상관없지만 규모가 커질수록 유지보수가 어렵기 때문에 이 둘의 관심사를 분리하는 선택은 유지보수 관점에서 의미있다.

또한 이 둘의 LifeCycle 이 다르다. 대부분 1.서비스 로직은 한 번 작성되면 비교적 변경이 적다. 하지만 2. api 화면 조회 코드는 프론트 화면이 빈번히 변경되기 때문에 이에 따라 조회코드 또한 변경되어야 하기 때문에 LifeCycle 이 비교적 짧다.

 

 

개인적 생각 - off 전략 선택

conroller 단에서 지연로딩을 사용할 일은 거의 없으며 쓰면 추가적인 디비 쿼리가 발생하기 때문에 성능상 좋지 않다.

때문에 조회쿼리 한번에 모든 api 화면에 필요한 정보들을 한 번에 조회할 수 있는 것이 베스트라 생각한다. 물론, toOne 모두 fetch.Lazy 전략을 디폴트로 가져가면서 조회 쿼리 작성시에 fetch 조인 또는 Join (left join, join)을 통해 조회하며 toMany의 컬렉션 엔티티 조회의 경우 @BatchSize 를 사용하는 것이 바람하다고 생각한다.

-비즈니스 로직과 조회 코드를 나누어 관리하는 것은 나누어 관리하는 비용보다 유지보수의 이점이 더 커질 경우 나누는 것을 고민해보록 하자.

'Spring' 카테고리의 다른 글

Querydsl 동적 정렬  (0) 2022.09.08
fetch 조인  (0) 2022.05.15
스프링 MVC 구조  (0) 2022.04.07

댓글