정의
OSIV란 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지하는 것을 말합니다. Service 계층을 벗어난 범위에서 지연 로딩이 가능하려면 영속성 컨텍스트가 살아있어야 하고 영속성 컨텍스트는 데이버베이스 커넥션이 유지되어야 가능합니다. OSIV를 사용하면 View Template과 API 컨트롤러에서 지연로딩이 가능해집니다.
설정
springboot에서 OSIV설정의 기본 값은 true 입니다.
- spring.jpa.open-in-view:true
- Open Session In View : 하이버네이트
- Open EntityManager In View : JPA
OSIV를 켤 때 ****주의사항
OSIV를 켜두면 너무 오랜 시간 데이터베이스 커넥션을 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 데이터베이스 커넥션이 부족할 수 있습니다.
OSIV를 끌 때 ****주의사항
반대로 OSIV를 꺼두면 모든 지연 로딩 관련 로직을 트랜잭션 안에서 수행해야 합니다. view template에서는 지연로딩이 동작하지 않습니다. 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 합니다.
지연 로딩을 강제로 호출하는 과정이 필요하면, 이러한 과정을 명시적으로 계층을 분리하는 것이 좋습니다. CQS의 개념을 적용해서 Query 전용 Service를 분리하는 방법이 있습니다. Repository에서 조회한 뒤 필요한 지연 로딩을 명시적으로 미리 조회하는 Query 패키지를 추가해서 사용합니다.
OSIV 사용방법
실질적으로 OSVI를 켤지 끌지를 고민할 때에는 애플리케이션의 목적에 따라서 판단할 수 있습니다. 고객의 실시간 API를 담당하는 애플리케이션에서는 OSIV를 끄고, ADMIN처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 키면 좋습니다.
'DEV > Spring Data JPA' 카테고리의 다른 글
데이터베이스 트랜잭션과 락 1 (2) | 2024.03.18 |
---|---|
데이터베이스 트랜잭션 기초 (0) | 2024.03.18 |
Entity의 Id를 직접 지정할 때 주의사항 (persist vs merge) (0) | 2023.09.27 |
JpaRepository를 custom해서 사용하는 방법 (0) | 2023.09.24 |
QueryHint를 적용하기 전에 고려해볼 사항 (0) | 2023.09.24 |