개요
개발을 하거나 면접을 보게 되면 Spring Data Jpa관련 단골 질문으로 가장 많이 나오는 내용이라 생각합니다.
그럼 도대체 OSIV가 뭐길래 JPA에서 계속 말이 나오게 되는 걸까? 한번 알아보도록 하겠습니다.
OSIV란
OSIV란 Open Session In View의 약자로써 사실 JPA가 도입되면서 Open EntityManager In View로 개념이 확립되었으나 편의상 지금까지 OSIV라고 부르고 있습니다.
말 그대로 OSIV는 View까지 EntityManager를 열어두는 것을 의미합니다.
그럼 JPA에서 EntityManager이라 함은 무엇일까요?
바로 영속성 컨텍스트를 의미합니다.
영속성 컨텍스트는 요청이 들어오면 생성되고 사라지는 휘발성 콘텍스트입니다.
해당 콘텍스트는 기본적으로 요청이 들어오면 생성되고, 요청이 끝나면 사라지게끔 되어있는데, 이는 OSIV 설정이 기본으로 True로 설정되어 있어 가능한 일입니다.
만약 OSIV가 False로 설정되어 있다면 영속성 콘텍스트는 Transaction범위에 따라 생성되고 Transaction이 끝날 시 사라지게 됩니다.
이로써 OSIV가 어떤 설정인지 알았으니 해당 설정이 기능과 성능에 미치는 영향에 대해 알아보겠습니다.
OSIV가 미치는 영향
OSIV 설정은 아래 그림으로 한 번에 확인할 수 있습니다.
위와 같이 데이터를 생성, 수정, 삭제 기능들은 트랜잭션 범위 내에서 작업이 가능합니다.
다만 읽기 기능의 경우 영속성 콘텍스트 범위 내에 있을 경우 읽기가 가능한데,
OSIV는 영속성 콘텍스트를 view까지 늘려 트랜잭션이 아닌 요청의 생존 범위까지 늘리는 것을 의미합니다.
즉 생성, 수정, 삭제는 OSIV의 목적은 아니고, 읽기 범위를 늘리는 것이 주목적이라고 보시면 됩니다.
그럼 왜! 읽기 범위를 늘리는 것인가?
이는 Lazy Loading과 밀접한 관련이 있습니다.
Lazy Loading이란 지연 읽기 기능인데, 처음 데이터베이스에서 조회하는 것이 아닌 추후 해당 데이터를 사용할 때 조회하는 기능입니다.
해당 기능을 사용할 때, 영속성 콘텍스트의 생존범위 내에서 로딩하는지가 중요한데 이를 어디까지 허용할 것인지를 조절할 수 있다고 보시면 좋을 것 같습니다.
그럼 해당 기능이 왜 성능 향상에 기여할 수 있는가? 영속성 콘텍스트를 유지하는 것 또한 많은 자원을 소모하게 됩니다.
이를 View까지 유지하지 않고 트랜잭션 범위에 맞춰 종료하게 되면 OSIV가 TRUE인 상태보다 좀 더 효율적으로 자원을 사용할 수 있게 됩니다.
해당 옵션은 위에서 말했듯 default True인 옵션입니다.
만약 애플리케이션 성능 향상에 있어 관심이 많다면 테스트해보시길 바랍니다.
Reference
'Server' 카테고리의 다른 글
[Architecture] Clean Architecture VS Hexagonal Architecture (0) | 2025.01.14 |
---|---|
[DNS] 너의 주소는? (6) | 2024.12.30 |
URL로 어떻게 사이트를 접속할 수 있을까? (9) | 2024.10.23 |
WebServer와 WebApplicationServer가 뭔가요? (2) | 2024.10.23 |
[VM] MAC OS에서 VM으로 Ubuntu 설치 및 실행하기 (3) | 2024.10.13 |