OSIV란?
- Open Session In View
- 영속성 컨텍스트를 뷰까지 열어두는 기능이다.
- 클라이언트 요청이 들어올 때 영속성 컨텍스트를 생성해서 요청이 끝날 때까지 같은 영속성 컨텍스를 유지한다. 하여 한 번 조회된 엔티티는 요청이 끝날 때까지 영속 상태를 유지한다.
- 뷰까지 영속성 컨텍스트가 살아있음에 따라 컨트롤러나 뷰에서도 지연 로딩을 사용할 수 있게 된다.
- Spring Boot JPA 의존성을 주입 받아 애플리케이션을 구성할 경우 기본적으로 OSIV가 적용된다. (default: true)
OSIV ON
- spring.jpa.open-in-view: true
- 트랜잭션 시작 시점에 영속성 컨텍스트가 데이터베이스 커넥션을 가져오며, 트랜잭션 종료 시점이 아닌 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 끝까지 유지한다.
- 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하다. 따라서 OSIV 사용시 영속성 컨텍스트가 컨트롤러와 뷰까지 유지되므로 지연 로딩을 더욱 유연하게 활용할 수 있다.
- 하지만 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. ("커넥션이 마른다"고 표현)
OSIV OFF
- spring.jpa.open-in-view: false
- 트랜잭션 종료 시점에 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.
- 따라서 커넥션 리소스를 낭비하지 않는다는 장점이 있다.
- 하지만 지연 로딩을 트랜잭션 안에서 모두 처리해야 한다는 단점이 있다. 결론적으로 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 한다.
커멘드와 쿼리 분리
- 성능을 생각한다면 OSIV를 마냥 켜둘 수만은 없다.
- 실무에서 OSIV를 끈 상태로 복잡성을 관리하기 위해 Command와 Query를 분리하는 방법을 사용한다.
- 비즈니스 로직은 특정 엔티티 몇 개를 등록, 수정하는 것이기 때문에 성능이 크게 문제되지 않는다.
- 하지만 복잡한 화면을 출력하기 위한 쿼리는 화면에 맞춰 성능을 최적화하는 것이 중요하다.
- 따라서 이 둘의 관심사를 명확하게 분리하는 것은 유지보수 측면에서 의미있다.
예를 들어 주문 서비스에 대해 커멘드와 쿼리를 분리한다면 다음과 같이 구성할 수 있다.
- OrderService : 핵심 비즈니스 로직
- OrderQueryService : 화면이나 API에 맞춘 서비스 (주로 읽기 전용 트랜잭션(read only) 사용)
'🌱 Spring > JPA' 카테고리의 다른 글
[JPA] JPQL : 경로 표현식 (0) | 2023.07.04 |
---|---|
[JPA] JPA 설정 총 정리 : ddl-auto 옵션, 실행 쿼리 보기(SpringBoot 3.x 버전 변경 추가) (1) | 2023.04.19 |
[JPA] Auditing 기능을 사용해 공통 칼럼(등록일, 수정일 등) 관리하기 (0) | 2023.04.03 |
[JPA] JPQL : 서브 쿼리 (0) | 2022.11.06 |
[JPA] JPQL : 조인 (0) | 2022.11.04 |
[JPA] JPQL : 페이징 (0) | 2022.11.03 |
[JPA] JPQL : 기본 문법 (0) | 2022.10.29 |
[JPA] JPA가 지원하는 쿼리 방법 (JPQL, Criteria, QueryDsl) (0) | 2022.10.29 |