[JPA 활용] OSIV와 성능 최적화
포스트
취소

[JPA 활용] OSIV와 성능 최적화

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에 맞춘 서비스

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.