[JPA] Open Session In View

CoHa·2021년 4월 24일
0

JPA를 공부하기 위해 토이프로젝트를 진행하고 있다.

spring application.yml을 작성하던 중 spring.jpa.open-in-view를 설정할 일이 있어 알아보고 이렇게 글로 남기게 되었다.

OSIV

영속성 컨텍스트를 뷰까지 열어둔다는 뜻이다.

영속성 컨텍스트 생존 범위

우선 영속성 컨텍스트의 생존 범위에 대해서 알아봐야하는데,
여기서 핵심은 view 에서도 지연 로딩이 가능하도록 하는 것이다.

다음과 같을 때, filter ~ repository 까지 영속 상태를 유지하는 것이다.

OSIV 장단점

이 방식은 트랜잭션 방식의 OSIV 방식인데 이렇게 하면 영속 상태를 유지하므로 뷰에서도 지연로딩을 할 수 있어 엔티티를 미리 초기화할 필요가 없다. (이 부분은 좀 더 공부하고 나중에 글로 남겨야겠다.)

하지만 단점도 존재하는데, 이러한 경우 데이터를 변경해서 보여줘야하는 경우 controller나 view에서의 수정이 데이터베이스에 반영되는 것이 문제이다.

(2021.05.09 추가)

트랜잭션이 시작하면 영속성 컨텍스트가 DB 커넥션을 획득한다.

Open Session In View 를 true 로 할 경우

장점 
DB 커넥션을 획득한 이후 filter ~ repository 까지 
영속성 컨텍스트와 DB 커넥션을 유지하기 때문에 지연로딩이 가능하다.

단점 
영속성 컨텍스트와 DB 커넥션의 생존 범위가 넓기 때문에 성능상 이슈가 발생할 수 있다.

Open Session In View 를 false 로 할 경우

장점 
트랜잭션이 종료될 때 영속성 컨텍스트와 DB 커넥션이 종료되므로 리소스를 낭비하지 않게 된다.

단점 
트랜잭션이 종료되기 전에 모든 지연 로딩을 초기화해야하는 번거로움이 발생한다.

해결책

그래서 스프링 프레임워크에서 제공하는 OSIV(서블릿 필터 혹은 스프링 인터셉터에 적용할지에 따라 원하는 클래스를 선택하면 된다)는 위와 같은 문제를 해결하기 위해 같은 영속 상태이지만 @Transactional 어노테이션을 통해 수정 가능과 수정 불가능한 상황을 분리할 수 있다.

참조

자바 ORM 표준 JPA 프로그래밍 - 김영한

profile
백엔드 개발을 좋아하는 주니어 개발자

0개의 댓글