OSIV(OPEN SESSTION IN VIEW)란?

2021. 2. 4. 17:43JPA/JPA

OSIV

OSIV는 세션(JPA에서는 엔티티매니저)의 생명 주기를 설정할 수 있는 옵션이다.

엔티티 매니저는 데이터베이스 커넥션의 생명 주기를 같이 가지고 있어 엔티티 매니저가 생성될때 데이터 베이스 커넥션을 생성하여 엔티티 매니저가 사라질때 데이터 베이스의 커넥션은 반환된다.

엔티티 매니저는 트랜잭션 시작시 생성된다.

spring.jpa.open-in-view: true (기본값)

데이터 베이스 커넥션, 엔티티 매니저가 트랜잭션 시작시 생성되고 컨트롤러에서 응답될때 데이터 베이스 커넥션 반환, 엔티티 매니저가 사라진다.

장점: 컨트롤러에서 지연로딩이 가능하다. (코딩이 편하다)

단점: 커넥션을 물고 있는 주기가 길어지고 커넥션을 빨리 반환하지 않으면 커넥션풀로 인해 장애로 이어질 수 있다.

 

spring.jpa.open-in-view: false

트랜잭션 시작시 엔티티 매니저, 데이터베이스 커넥션을 얻어오고 트랜잭션 종료시 반환된다.

OSIV OFF

장점: 데이터 베이스 커넥션 반환 주기가 빨라져 성능이 향상된다.

단점: 지연로딩을 위해 서비스단에서 강제로 지연로딩을 하여 프록시를 초기화 해줘야 하기 때문에 서비스단의 복잡도가 커진다.

 

따라서 커맨드 쿼리 책임 분리 패턴을 적용하여 핵심 비즈니스를 다루는 Service와 화면이나 API에 맞춘 Service를 분리하여 관리해야한다.