본문 바로가기

웹개발/Spring

OSIV란?

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

 

OSIV ON
spring.jpa.open-in-view : true 기본값
0 1 2 3 4
요청 → Filter Interceptor → Controller → Service → Repository 
   View ↙     
    트랜잭션 범위 (3~4)
  영속성 컨텍스트 생존 범위 (1~4)
  영속 상태, 수정 불가능 영속 상태, 수정 가능 

Q. 언제 JPA(영속성 컨텍스트)가 데이터베이스 커넥션을 획득?

A. 데이터베이스 트랜잭션 시작할 때 

 

장점

OSIV 전략은 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다.
→ 지연 로딩이 가능

 

단점

너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용 → 장애 

e.g. 컨트롤러에서 외부 API를 호출하면 외부 API 대기 시간 만큼 커넥션 리소스를 반환하지 못하고, 유지해야 한다.

 

 

OSIV OFF
spring.jpa.open-in-view: false OSIV 종료
0 1 2 3 4
요청 → Filter Interceptor → Controller → Service → Repository 
   View ↙     
    트랜잭션 범위 (3~4)
      영속성 컨텍스트 생존 범위 (3~4)
  준영속 상태 영속 상태

장점

OSIV를 끄면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.
커넥션 리소스를 낭비하지 않는다.

 

단점

OSIV를 끄면 모든 지연로딩을 트랜잭션 안에서 처리해야 한다. 

트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 한다.

 

OSIV를 끈 상태로 복잡성을 관리하는 좋은 방법: Command와 Query를 분리하는 것!

 

 

 

 

 

참조 - 자바 ORM 표준 JPA 프로그래밍

반응형