[20210625] Open Session In View

JPA의 옵션 중 하나인 OSIV에 대해 알아보자.

JPA는 영속성 컨텍스트를 이용하여 동작한다. 하지만, 영속성 컨텍스트는 트랜잭션 단위로 존재하며, 트랜잭션이 종료되면 영속성 컨텍스트도 함께 종료된다.

Open Session In View

  • Session은 영속성 컨텍스트를 의미(예전에 영속성 컨텍스트를 session이라 불렀음)
  • 즉, 영속성 컨텍스트를 View까지 열어둔다는 뜻

왜 View까지 열어둘까?

  • 일반적으로 트랜잭션은 Service와 Repository 단에서 시작되고 종료됨
  • 만약 트랜잭션이 종료되는 시점에 영속성 컨텍스트도 사라진다면 View 단에서는 dirty checking이랑 lazy loading이 불가능해짐

사용법

  • spring.jpa.open-in-view 속성을 enabled로 설정하여 사용(spring boot에서는 기본 값으로 enabled로 설정해줌)

OSIV On

장점

  • Controller나 View 에서도 지연로딩이 가능해짐

단점

  • DB Connection resource를 오래 잡고 있으므로 자원 낭비
  • 극단적으로 모든 커넥션이 사용중이라면 장애 발생 가능

OSIV Off

장점

  • 커넥션 리소스 절약

단점

  • 모든 지연로딩을 트랜잭션 안에서 처리해야함
  • 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 한다.
  • 이를 위한 별도 메소드를 추가로 정의해야 함.

정리

  • 서비스 서버는 일반적으로 OSIV를 끄고, 관리자 페이지와 같이 동시 접속이 많지 않은 상황에서는 편의를 위해 켤 수 있음.