JPA 의 OSIV(Open Session In View) 에 대하여

Daniel·2024년 3월 26일
0

DataBase

목록 보기
2/3

들어가며

JPA 사용하려 초기 설정을 마치고 애플리케이션을 구동시켜보면 콘솔에 아래와 같은 경고가 출력됩니다.

spring.jpa.open-in-view is enabled by default, so database queries can be performed during view rendering.To disable this alert, configure spring.jpa.open-in-view explicitly

spring:
	jpa:
		open-in-view: false

위와같이 .yaml 파일에 설정을 해주면 경고는 사라지는데, 뭘 의미하는 속성일까? 하는 궁금증에 포스트를 작성합니다.

OSIV(Open Session In View) 란?

OSIV(Open Session In View)는 하이버네이트(Hibernate)나 JPA(Java Persistence API)와 같은 ORM(Object-Relational Mapping) 프레임워크를 사용할 때 자주 언급되는 패턴입니다.
이 패턴의 핵심 아이디어는 HTTP 요청이 시작될 때 데이터베이스 세션을 열고, 요청이 완료될 때까지 세션을 열어두는 것입니다.
이를 통해 뷰 레이어에서 지연 로딩(Lazy Loading)과 같은 ORM 기능을 사용할 수 있게 됩니다.

즉, 데이터베이스 세션을 요청 시작부터 끝까지 열어두고 필요할 때마다 데이터를 가져올 수 있는 패턴이라고 생각하면 됩니다.

동작 원리

  1. 세션 열기
    클라이언트로부터 HTTP 요청이 들어오면, ORM 프레임워크는 데이터베이스 세션을 열어줍니다.
  2. 요청 처리
    컨트롤러, 서비스 레이어를 거쳐 비즈니스 로직이 처리되고, 데이터가 필요할 경우 ORM을 통해 DB에서 데이터를 조회합니다.
  3. 지연 로딩 활용
    뷰를 렌더링하는 시점에서도 세션이 열려 있기 때문에, 연관된 엔티티를 지연 로딩을 통해 불러올 수 있습니다.
  4. 세션 닫기
    HTTP 응답이 클라이언트로 전송된 후, DB 세션을 닫습니다.

? 지연 로딩 (Lazy Loading) 이란?

DB 에서 데이터를 필요한 순간에 조회하는 방식을 말합니다.
이는 애플리케이션의 성능을 향상시키고, 불필요한 자원 사용을 줄이는 데 도움이 됩니다.

예를 들어, 사용자 정보에 여러 개의 주문 정보가 연관되어 있을 때, 사용자 정보만 필요하고 주문 정보는 필요하지 않은 상황에서는 사용자 정보만 불러오고, 주문 정보는 실제로 그 정보를 접근할 때까지 데이터베이스에서 불러오지 않습니다. 이렇게 함으로써, 모든 연관 정보를 처음부터 불러오는 것(Eager Loading)에 비해 효율적으로 데이터를 관리할 수 있습니다.

장.단점

OSIV의 장점

  • 지연 로딩 활용: OSIV를 사용하면, 뷰 레이어에서 지연 로딩을 자유롭게 사용할 수 있어, 필요한 데이터를 필요한 시점에 불러올 수 있습니다. 이는 애플리케이션의 유연성을 높여줍니다.
  • 개발 편의성: 세션 관리를 신경 쓰지 않아도 되므로, 개발자가 비즈니스 로직에 더 집중할 수 있습니다.

OSIV의 단점

  • 성능 문제: 요청 처리 과정에서 필요하지 않은 데이터까지 지연 로딩을 통해 불러오게 되면, 성능 저하를 일으킬 수 있습니다.
  • 리소스 사용: 요청 처리 시간 동안 데이터베이스 세션을 계속 열어두어야 하므로, 리소스 사용이 증가할 수 있습니다.
  • 트랜잭션 관리 복잡성: 뷰 레이어까지 트랜잭션 범위가 확장되므로, 트랜잭션 관리가 복잡해질 수 있습니다.

사용에 대한 고려 사항

OSIV 패턴은 특정 상황에서 매우 유용할 수 있지만, 사용할 때는 그로 인해 발생할 수 있는 성능 문제와 리소스 사용에 대해 주의해야 합니다. 최신 Spring Boot 버전에서는 OSIV가 기본적으로 활성화되어 있으나, 필요에 따라 비활성화하고 명시적인 세션 관리나 페치 전략을 선택하는 것이 좋습니다.

profile
응애 나 애기 개발자

0개의 댓글