개발/Spring
OSIV(open session in view)
jis1218
2024. 9. 22. 22:43
OSIV란?
JPA나 Hibernate 같은 ORM을 사용할 때, 영속성 컨텍스트(Session)를 뷰 렌더링 단계까지 열어두는 패턴. 이를 통해 뷰를 렌더링할 때도 데이터베이스에 접근할 수 있게 됨.
Hibernate에서는 세션(Session)이라고 부르는 것을 JPA에서는 영속성 컨텍스트라고 부른다. 따라서 해석을 해보자면 영속성 컨텍스트를 view단까지 열어둘 것인지를 설정하는 것이라고 생각하면 된다.
트랜잭션이 시작될 때 영속성 컨텍스트가 데이터베이스 커넥션을 가져오게 되는데
OSIV가 true일 경우
OSIV가 true이면 트랜잭션이 끝나도 커넥션을 반환하지 않고 유저에게 response가 응답된 후, 또는 html에 렌더링한 후에 데이터베이스 커넥션을 반환하고 영속성 컨텍스트도 그 때 사라진다. 따라서 Controller나 View 단에서 Lazy Loading이 필요할 경우 유용하다.
하지만 컨트롤러 단에서 외부 API와 커넥션이 있다고 하고 이 커넥션이 길다고 하면 그만큼 데이터베이스 커넥션도 끊기지 않고 물고 있는 것이기 때문에 커넥션 풀이 꽉 찰 수도 있는 위험이 있다.
OSIV가 false일 경우
OSIV를 끄면 트랜잭션이 종료될 때 영속성 컨텍스트를 닫고 커넥션도 반환한다. 그러므로 지연로딩 등과 같은 것은 트랜잭션 안에서 끝내야 한다. 만약 밖에서 Lazy Loading을 하려고 하면 LazyInitializationException이 발생한다.
OSIV는 기본값이 true이기 때문에(Springboot 3.3.3 기준) 서비스에 맞게 설정해주는 것이 중요하다.