본문 바로가기
Spring

JPA - OSIV (Open Session In View)

by jinukix 2021. 9. 30.

영속성 컨텍스트는 엔티티 매니저가 생성되는 시점에 생성되고, 엔티티 매니저가 종료되는 시점에 소멸한다. 기본적으로 스프링은 트랜잭션 범위의 영속성 컨텍스트를 기본 전략으로 사용한다. 따라서 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 동일하며, 트랜잭션 종료 시, 영속성 컨텍스트도 동일하게 종료하게 된다. 여기서 OSIV는 컨트롤러나 뷰 영역에도 영속성 컨텍스트를 유지하는 것이다.

최근에는 대부분 DTO 모델을 사용하기 때문에 뷰 영역에서 영속성 컨텍스트가 필요한 경우는 그리 많지 않다. 하지만 몇 년 전까지는 DAO에서 내려주는 엔티티를 그대로 결과 모델로 사용하는 경우가 많았다. 그러면서 컨트롤러나 뷰 영역에서도 엔티티를 조작하는 경우가 많았다. 스프링 부트에서는 기본적으로 OSIV가 활성화되어있다. 

OSIV ON

기본적으로 트랜잭션을 시작할 때 영속성 컨텍스트가 DB 커넥션을 가져온다. 커넥션을 획득한 후 API 응답이 끝날 때까지 유지한다. 트랜잭션이 끝나도 지연 로딩으로 프록시 객체를 초기화할 상황이 생기기 때문에 영속성 컨텍스트는 DB 커넥션을 유지해야 한다. 따라서 DB 커넥션을 반환하지 못하고 뷰 영역까지 유지해야 하기 때문에 애플리케이션에서는 DB 커넥션이 모자라는 상황이 발생할 수 있다.

OSIV OFF

OSIV를 끄는 경우 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고 DB 커넥션을 반환한다. 따라서 커넥션 리소스를 낭비하지 않는다. 대신 모든 지연 로딩을 트랜잭션 안에서 해결해줘야 한다.

'Spring' 카테고리의 다른 글

JDK Dynamic Proxy vs CGLIB  (0) 2021.11.23
@Transactional  (0) 2021.11.23
JPA - 영속성 컨텍스트  (0) 2021.10.01
MySQL - 파티셔닝  (0) 2021.10.01
JVM GC의 종류(Serial, Parallel, CMS, G1 GC)  (0) 2021.10.01

댓글