스프링 OSIV 설정은 HTTP 요청이 완료될 때까지 데이터베이스 세션을 열어둘지 여부를 결정하는 설정입니다.
// application.properties 에서 설정합니다.
spring.jpa.open-in-view=true or false
1. OSIV true 일 때
장점
- 지연 로딩 지원
- 지연 로딩된 엔티티에 대해 뷰 렌더링 시점까지 데이터베이스 세션이 열려 있어 안전하게 접근할 수 있습니다.
- 뷰 계층에서 엔티티의 지연 로딩을 원활하게 수행할 수 있습니다.
- 코드 간결화
- 데이터베이스 세션이 유지되므로, 서비스 계층에서 필요한 모든 데이터를 미리 로드할 필요가 없어 코드가 간결해집니다.
- 개발 용이성
- 개발자가 데이터베이스 세션의 범위를 명확히 관리하지 않아도 되므로, 개발과 디버깅이 용이합니다.
- 뷰 계층에서 바로 엔티티에 접근할 수 있습니다.
단점
- 성능 저하
- 데이터베이스 세션이 HTTP 요청이 완료될 때까지 유지되므로, 오래 지속되는 연결로 인해 성능이 저하될 수 있습니다.
- 이는 데이터베이스 리소스의 비효율적 사용으로 이어질 수 있습니다.
- 메모리 사용 증가
- 지연 로딩된 엔티티가 뷰 렌더링 시점까지 메모리에 유지되므로, 메모리 사용량이 증가할 수 있습니다.
- 이는 메모리 관리에 신경 써야 하는 상황을 초래할 수 있습니다.
- 잠금 문제
- 긴 트랜잭션으로 인해 데이터베이스 잠금이 오래 지속될 수 있으며, 이는 다른 트랜잭션의 성능에 영향을 미칠 수 있습니다.
2. OSIV false 일 때
장점
- 트랜잭션 경계 명확화
- 데이터베이스 세션이 서비스 계층에서 시작되고 종료되므로, 트랜잭션 경계가 명확해집니다.
- 트랜잭션 관리와 디버깅을 용이하게 합니다.
- 성능 최적화
- 데이터베이스 세션이 짧게 유지되므로, 데이터베이스 연결의 오랜 유지로 인한 성능 저하를 방지할 수 있습니다.
- 데이터베이스 리소스의 효율적인 활용을 돕습니다.
- 메모리 사용 절약
- 지연 로딩된 엔티티가 뷰 렌더링 시점에 로드되지 않으므로, 불필요한 메모리 사용을 줄일 수 있습니다.
- 메모리 사용량을 최적화하고, 애플리케이션의 안정성을 향상시킵니다.
단점
- 지연 로딩 문제
- OSIV가 비활성화되면 지연 로딩된 엔티티에 접근하려고 할 때
LazyInitializationException
이 발생할 수 있습니다. 이를 방지하기 위해 필요한 데이터를 서비스 계층에서 미리 로드해야 합니다.
- 코드 복잡도 증가
- 서비스 계층에서 필요한 모든 데이터를 명시적으로 로드해야 하므로, 코드의 복잡도가 증가할 수 있습니다.
- 이는 개발자에게 추가적인 작업을 요구할 수 있습니다.
- 개발 부담 증가
- 데이터베이스 세션의 범위를 명확히 관리해야 하므로, 개발자가 트랜잭션과 데이터 로딩을 더 신중하게 관리해야 합니다.
Share article