OSIV에 대하여

이상훈·2024년 11월 10일
0

Jpa

목록 보기
17/17

 이전에 면접에서 "JPA의 영속성 컨텍스트와 트랜잭션의 범위는 일치하는가?"라는 질문을 받았을 때, 당시에는 당연히 일치한다고 생각했다. 그러나 면접 후 복기하며 OSIV(Open Session In View)라는 개념을 알게 되었다.


OSIV란?

 OSIV (Open Session In View)는 스프링 프레임워크의 세션 관리 전략 중 하나로, 영속성 컨텍스트를 View 레이어까지 확장하여 열어두는 것을 의미한다. 즉, View 레이어에서도 지연 로딩 등 영속성 컨텍스트의 기능을 사용할 수 있다는 뜻이다. Spring Boot에서는 OSIV가 기본적으로 활성화되어 있다. OSIV를 비활성화하려면 아래와 같이 application.yml 파일에서 설정을 추가해야 한다.

spring.jpa.open-in-view=false

OSIV ON 상태

OSIV가 활성화되면 영속성 컨텍스트의 범위가 View 레이어까지 확장된다.

  1. 트랜잭션 AOP 프록시가 DB 커넥션을 datasource로부터 조회한다.
  2. DB 커넥션의 Auto Commit이 false로 변경되어 트랜잭션과 영속성 컨텍스트가 시작된다.
  3. 비지니스 로직을 처리한다.
  4. DB 커넥션의 Auto Commit이 true로 변경되어 트랜잭션이 종료된다.
  5. 영속성 컨텍스트가 열려 있으므로, View나 Controller에서 지연 로딩을 사용할 수 있다.
  6. API 응답이 끝나면 DB 커넥션이 반환되고 영속성 컨텍스트도 종료된다.

장점 : View나 Controller에서 지연 로딩을 사용할 수 있다.
단점 : DB 커넥션이 장시간 유지되어, 트래픽이 많을 경우 커넥션 부족 문제가 발생할 수 있다.


OSIV OFF 상태

OSIV를 비활성화하면 영속성 컨텍스트의 범위가 트랜잭션까지로 제한된다.

  1. 트랜잭션 AOP 프록시가 DB 커넥션을 datasource로부터 조회한다.
  2. DB 커넥션의 Auto Commit이 false로 변경되어 트랜잭션과 영속성 컨텍스트가 시작된다.
  3. 비지니스 로직을 처리한다.
  4. DB 커넥션의 Auto Commit이 true로 변경되어 트랜잭션이 종료된다. DB 커넥션이 반환되고 영속성 컨텍스트도 종료된다.

장점 : DB 커넥션을 효율적으로 사용할 수 있다.
단점 : View나 Controller에서 지연 로딩을 사용할 수 없기 때문에, 트랜잭션 내부에서 지연 로딩을 전부 처리해야 한다.


결론

 OSIV는 언제 활성화하고, 언제 비활성화해야 할까?

 일반적으로 실시간 API가 중요한 서비스에서는 OSIV를 비활성화하여 DB 커넥션 사용을 최적화하는 것이 좋다. 반면, ADMIN 등 DB 커넥션을 많이 사용하지 않는 환경에서는 OSIV를 활성화하여 지연 로딩을 간편하게 활용할 수 있을 것이다.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글