본문 바로가기
JPA

[JPA] OSIV(Open Session In View)

by 감자b 2024. 12. 29.

OSIV

최초 데이터베이스 커넥션 시작 시점(트랜잭션 시작)부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지시키는 기능이다.

이로 인해 View Template이나 API 컨트롤러에서 지연 로딩이 가능해진다.

(지연 로딩은 영속성 컨텍스트가 살아있어야 하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지)

하지만 해당 기능은 오랜 시간 데이터베이스 커넥션 리소스를 사용하므로 실시간 트래픽이 중요한 애플리 케이션에서는 커넥션이 모자라 장애로 이어지는 문제가 발생할 수 있다.

spring.jpa.open-in-view : 기본값 true
spring.jpa.open-in-view: false : OSIV 종료

 

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

즉 View template에서는 지연 로딩이 동작하지 않기에 모든 지연 로딩을 트랜잭션 끝나기 전에 강제로 호출해야 한다.

이로 인해 트랜잭션 안에서 복잡성이 증가할 수 있는데, 이는 Command와 Query를 분리하여 복잡성을 관리할 수 있다.

핵심 비즈니스, 화면이나 API 스펙에 맞춘 서비스 이 둘의 관심사를 명확하게 분리한다.

  • XxxService: 핵심 비즈니스 로직
  • XxxQueryService: 화면, API에 맞춘 서비스 (주로 읽기 전용 트랜잭션을 사용)

 

추가

OSIV를 켜면 영속성 컨텍스트의 생명주기가 확장되는 것 → 트랜잭션의 생명주기가 확장되는 것이 아님.

즉 서비스에서 트랜잭션을 커밋했다면 추가, 수정, 삭제 작업은 불가능 (JPA에서 쓰기 작업은 트랜잭션 내에서만 가능하기 때문에)

단 조회는 가능하므로 데이터베이스 커넥션은 유지가 된다.


참고

 

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의 | 김영한 - 인프런

김영한 | 스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., 스프링 부트, 실무에서 잘 쓰고 싶다면? 복잡한 문제까지 해결하는 힘을 길

www.inflearn.com

 

'JPA' 카테고리의 다른 글

[Spring Data JPA] @Modifying  (0) 2024.12.30
[Spring Data JPA] Page, Slice  (1) 2024.12.29
[JPA] JPQL  (0) 2024.12.29
[JPA] 데이터 타입  (0) 2024.12.29
[JPA] 영속성 전이, 고아 객체  (0) 2024.12.29