OSIV (Open Session In View)란?
- 하이버네이트에서 제공하는 세션을 의미한다.
- JPA로 치면 EntityManager의 역할을 한다.
- JPA는 Hibernate, EclipseLink, DataNucleus같은 인터페이스의 모음이기 때문에 하이버네이트의 기능도 사용할 수 있다.
- JPA에서 사용할 때는 Open EntityManager In View라고 하지만 관례상 OSIV라고 부른다.
- 스프링에서는 기본적으로 활성화되어 있다.
활성화 여부에 따른 차이점
OSIV 활성화
- 설정 방법
- 활성화가 디폴트라서 추가설정을 안 해도 된다.
spring.jpa.open-in-view=true
설정
- 장점
- 데이터 로딩 속도 향상
- 쿼리 실행 횟수 감소로 데이터 로딩 속도가 크게 향상된다.
- 코드 간소화
- 중복된 쿼리 코드를 줄여 코드를 간소화하고 관리하기 쉬워진다.
- 데이터 로딩 속도 향상
- 단점
- 메모리 사용량 증가
- 영속성 컨텍스트가 유지되면서 메모리 사용량이 증가할 수 있다.
- 주의 깊은 사용 필요
- 잘못된 사용 시 데이터 오류나 성능 저하가 발생할 수 있다.
- 메모리 사용량 증가
OSIV 비활성화
- 설정 방법
spring.jpa.open-in-view=false
설정
- 장점
- 메모리 사용량 감소
- 영속성 컨텍스트가 요청마다 생성되고 종료되므로 메모리 사용량이 적다.
- 데이터 오류 가능성 감소
- 트랜잭션 범위가 명확하게 구분되어 데이터 오류 가능성이 낮다.
- 메모리 사용량 감소
- 단점
- 데이터 로딩 속도 감소
- 모든 요청마다 쿼리가 실행되어 데이터 로딩 속도가 느려질 수 있다.
- 코드 복잡화
- 중복된 쿼리 코드가 발생하여 코드 관리가 어려워질 수 있다.
- 데이터 로딩 속도 감소
주의사항
- 트랜잭션 관리
- OSIV를 사용하려면 트랜잭션 관리가 더욱 중요해진다.
- 트랜잭션 범위를 명확하게 설정하여 데이터 오류를 방지해야 한다.
- 일반적으로 서비스 레이어에서 트랜잭션을 시작하고 종료하는 것이 좋다.
- 메모리 사용량 관리
- OSIV 활성화 시 메모리 사용량을 지속적으로 확인하고 필요하면 영속성 컨텍스트를 수동으로 종료해야 한다.
EntityManager.clear()
메소드를 사용하여 영속성 컨텍스트를 수동으로 지울 수 있다.
- 변경감지
- OSIV가 활성화 상태라면 엔티티를 수정하면 JPA는 변경사항을 자동으로 감지하고 DB에 저장한다.
- OSIV가 비활성화 상태라면 뷰 렌터링이 끝난 후
EntityManager.flush()
메소드를 통해 변경 사항을 수동으로 저장해야 한다.
결론
- OSIV는 데이터 로딩 속도를 향상시키는 강력한 도구지만, 주의 깊게 사용해야 한다.
- OSIV를 활용할 때는 장점과 단점을 모두 고려하여 적절하게 활용해야 한다.
- 실시간 API같이 DB 커넥션이 많다면 OSIV를 비활성화하고, ADMIN처럼 DB 커넥션이 많지 않은 곳에서는 OSIV를 활성화한다.
- 실무에서 OSIV를 끈 상태로 복잡성을 관리하려면 서비스를 두 가지로 나누는 것이 좋다.
- Command : 핵심 비즈니스 로직
- Query : 화면이나 API에 맞춘 서비스