Page 객체 그대로 반환 vs 메타데이터 추출하여 클라이언트에 반환

sobaman·2025년 1월 4일
0

Java

목록 보기
8/10

궁금중


Rest API 구현 프로젝트를 진행하던 도중

컨트롤러에서 클라이언트에게 Page 그대로 반환하는 경우도 있고,

페이지네이션 메타데이터를 추출하여 공통 스펙에 따로 넣어 반환하는 케이스도 있다는 것을 알았다.

두 가지 방식이 어떠한 차이가 있는지 정리하고 넘어가야 할 필요성을 느껴 찾아보게 되었다.

Page 를 그대로 반환


Page 객체를 그대로 반환할 때, Spring Data JPA는 내부적으로

전체 데이터 개수, 전체 페이지 수, 현재 페이지 정보 등 페이지네이션 메타데이터를 이미 포함해서 제공한다.

따라서 기본적으로는 따로 추출하지 않고도 이러한 정보를 클라이언트에서 사용할 수 있다.

Paga 객체는 아래와 같은 정보들을 포함

  • 전체 데이터 개수: getTotalElements()
  • 전체 페이지 수: getTotalPages()
  • 현재 페이지: getNumber()
  • 현재 페이지의 데이터 목록: getContent()

메타데이터를 따로 추출하여 반환


그런데 왜 메타데이터를 따로 추출하여 반환하는 케이스가 생기는가?

  1. 클라이언트가 메타데이터를 Page 객체 형태로 이해하기 어려울 수 있다.

  2. 팀 규약을 정해 특정 형태로 데이터를 받기로 요구하는 환경일 수 있다.

    • 예시
    {
      "data": [
        {"id": 1, "subject": "Question 1"},
        {"id": 2, "subject": "Question 2"}
      ],
      "meta": {
        "totalElements": 100,
        "totalPages": 10,
        "currentPage": 1
      }
    }
  1. Page 객체는 JPA나 특정 라이브러리와 강하게 결합되어 있어, 응답 구조를 사용자가 정의하기 어렵다
  • 별도의 DTO 나 커스텀 응답구조를 사용하면 필요한 데이터만 효율적으로 전달할 수 있고, 의존성을 최소화하여 유지보수성을 높일수도 있다.
  1. Page 객체는 기본적으로 전체 데이터 개수를 (totolCount) 계산하기 위해 추가 쿼리를 실행하는데 대규모 데이터셋에서는 병목 현상을 일으킬 수 있다. 따라서 전체 개수를 반드시 제공하지 않아도 되는 경우 최소 정보만을 추출해 반환할 수 있다.

정리


Page 객체를 그대로 반환하면 필요없는 메타데이터까지 전달하는 경우가 생길 수 있고,

특히 전체 데이터 개수가 매우 클 경우 계산을 위한 추가 쿼리 때문에 성능에 영향을 끼칠 수도 있다.

팀 규약, 성능 최적화, 클라이언트 편의 성 , 응답 형식 커스텀 가능 등의 이유로

별도 추출이 권장되는 경우도 많다.

profile
백엔드 공부 정리 블로그

0개의 댓글