[JPA] OSIV(Open Session In View)

jimmy·2025년 3월 20일
post-thumbnail

OSIV란?

OSIV(Open Session In View)란 세션 관리 전략 중 하나로, 영속성 컨텍스트를 View 영역까지 열어 두는 것을 말한다.

이 전략은 기본적으로 spring.jpa.open-in-viewtrue로 설정되어 있으며, 상황에 맞게 전략을 유연하게 가져갈 수 있다.

OSIV ON

OSIV ON일 경우, 데이터베이스 커넥션 시작 시점(트랜잭션 시작 시점)부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 이 설정을 통해 영속성 컨텍스트가 계속 열려 있기 때문에 view template이나 API 컨트롤러에서 지연 로딩이 가능하다.

하지만, 이 전략은 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하므로 실시간 트래픽이 중요한 애플리케이션에서는 커넥션 부족이 발생할 수 있다.

OSIV OFF

OSIV OFF로 설정하면, 트랜잭션이 종료될 때 영속성 컨텍스트가 닫히고, 데이터베이스 커넥션도 반환된다. 이렇게 하면 커넥션을 더 이상 유지하지 않으므로 커넥션 리소스를 낭비하지 않는다.

하지만, OSIV를 끄면 모든 지연로딩을 트랜잭션 내에서 처리해야 한다. 즉, 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 하므로 코드가 복잡해질 수 있다.

Command와 Query 분리

OSIV OFF 상태에서 복잡성을 관리하는 좋은 방법이다.

화면에 맞춘 조회 api (query) 는 코드가 변경될 가능성이 많지만, 핵심 비즈니스 로직 api (command) 들은 자주 변경되지 않는다. 따라서 이 둘의 라이프 사이클이 다르기 때문에 이 둘을 명확하게 분리하는 것이 유지보수 관점에서 좋다.

결론

  • OSIV를 기본적으로 켜두는 것이 좋다. 하지만, 성능 문제가 발생할 수 있는 곳에서는 OSIV를 끄는 것이 좋다.
  • 고객 서비스의 실시간 API는 OSIV를 끄고, ADMIN 처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 켜두는 것이 좋다.

참고
실전! 스프링 부트와 JPA 활용2

profile
백문이 불여일기

0개의 댓글