본문 바로가기

Spring boot

[spring boot] OSIV와 영속성 컨텍스트

OSIV란?
  • Open Session In View: 하이버네이트
  • Open EntityManager In View: JPA 

크고 복잡한 애플리케이션을 개발한다면, 성능과 복잡성의 관심사를 명확하게 분리하는 선택은 유지보수 관점에서 충분히 의미 있다. 만약 OSIV를 끈다면 다음처럼 분리하자.

  • OrderService: 핵심 비즈니스 로직
  • OrderQueryService: 화면이나 API에 맞춘 서비스 (주로 읽기 전용 트랜잭션 사용)

> 참고: 고객 서비스의 실시간 API 서버는 OSIV를 끄고, ADMIN 처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 켠다.

 

 

(아래는 참고)

OSIV ON (기본값)

영속성 컨텍스트가 트랜잭션 범위 밖에서도 유지되며 화면에 렌더링 될때 View나 Controller에서까지 유지된다. 

 

 

 

OSIV OFF

spring.jpa.open-in-view : false 설정

영속성 컨텍스트의 범위가 트랜잭션 시작과 끝이므로 view나 controller에서 영속성 컨텍스트를 사용 할 수 없다. 따라서 영속성 컨텍스트가 필요한 지연로딩을 view나 contoller에서 한다면 LazyInitializationException error가 뜬다. 

> 에러 해결 방법 : 핵심 비즈니스 로직이 들어간 서비스주로 읽기 전용인 화면이나 API에 맞춘 서비스로 나눈다. -> API 전용 서비스에 트랜잭션을 실행시켜 그 속에서 지연로딩(강제 초기화)을 한다.

= 트랜잭션 안에서 데이터를 다 초기화 시켜 DB에 저장해두고 view나 controller에서는 이미 초기화된 데이터를 꺼내 사용하기.