[ Spring ] OSIV란

신범철·2023년 10월 14일
0

스프링부트

목록 보기
18/20

OSIV란?

OSIV(Open Session In View)란 영속성 컨텍스트의 범위를 뷰까지 열어줄 것인가를 설정하는 것이다.
서비스의 사용자가 많아지면 DB커넥션에 대해 신경 써야하는데 OSIV 설정을 통해 DB커넥션의 성능을 향상 시킬 수 있다.

  • 부르는 명칭이 조금씩 다르지만, 관례상 OSIV라고 부른다.
    • Hibernate : OSIV(Open Session In View)
    • JPA : OEIV(Open EntityManage In View)

OSIV - True

  • 영속성 컨텍스트를 뷰까지 열어둔 상태(default)
  • sping.jpa.open-in-view : true

트랜잭션이 시작하는 시점에서 DB커넥션을 얻어서 요청이 끝날 때까지 DB커넥션을 가지고 있는다.
Service Layer의 @Transaction시작부터 -> Presentation Layer의 Response를 리턴할 때 까지 DB 커넥션을 점유한다.
그렇기 때문에 컨트롤러에서도 지연 로딩이 가능하다.


위 컨트롤러에서order.getmember().getName()에서 지연로딩이 발생하는데 에러가 나지 않는다.

  • 장점
    • 위에서 말했듯이 영속성 컨텍스트의 생존 범위가 Presentation Layer까지 확장 되었기 때문에 지연로딩 전략을 Presentation Layer에서 사용 가능하다.
  • 단점
    • 오랜 시간 DB커넥션을 유지하여 리소스를 사용하기 때문에 실시간 트레픽이 중요한 서비스에서는 DB커넥션이 모자랄 수 있다.

OSIV - False

  • 영속성 컨텍스트를 뷰에서 사용하지 못하도록 닫아놓은 상태
  • sping.jpa.open-in-view : false


DB커넥션를 Transaction 내부에서만 점유한다.


위 컨트롤러에서order.getmember().getName()에서 지연로딩이 발생하는데 에러가 발생한다.

  • 장점
    • 트랜잭션이 종료될 때 영속성 컨텍스트가 끝나 DB커넥션을 반납하기 때문에 DB커넥션 리소스를 효율적으로 사용한다.
  • 단점
    • 모든 지연로딩을 트랜잭션 내부에서 처리해야 한다.

지연로딩 해결 방안

  1. 지연로딩 Query를 위한 Service Layer class 생성
  2. Sevice와 Repository에서 모든 지연로딩 처리

지연로딩 Query를 위한 Service Layer class 생성은 Command와 Query를 분리한다는 것으로 컨트롤러에서 지연로딩을 처리해야 할 때 Query용 Service를 만드는 것을 의미한다.
Ex) OrderService : 핵심 비즈니스 로직
OrderQueryService : 화면이나 API에 맞춘 서비스(주로 읽기 전용 트랜잭션)

OSIV 전략

  • OSIV False 설정
    • 고객 서비스의 실시간 API인 경우
  • OSIV True 설정
    • ADMIN처럼 커넥션이 많이 않는 곳
profile
https://github.com/beombu

0개의 댓글