Rest API 구현 프로젝트를 진행하던 도중
컨트롤러에서 클라이언트에게 Page 그대로 반환하는 경우도 있고,
페이지네이션 메타데이터를 추출하여 공통 스펙에 따로 넣어 반환하는 케이스도 있다는 것을 알았다.
두 가지 방식이 어떠한 차이가 있는지 정리하고 넘어가야 할 필요성을 느껴 찾아보게 되었다.
Page 객체를 그대로 반환할 때, Spring Data JPA는 내부적으로
전체 데이터 개수, 전체 페이지 수, 현재 페이지 정보 등 페이지네이션 메타데이터를 이미 포함해서 제공한다.
따라서 기본적으로는 따로 추출하지 않고도 이러한 정보를 클라이언트에서 사용할 수 있다.
Paga 객체는 아래와 같은 정보들을 포함
getTotalElements()getTotalPages()getNumber()getContent()그런데 왜 메타데이터를 따로 추출하여 반환하는 케이스가 생기는가?
클라이언트가 메타데이터를 Page 객체 형태로 이해하기 어려울 수 있다.
팀 규약을 정해 특정 형태로 데이터를 받기로 요구하는 환경일 수 있다.
{
"data": [
{"id": 1, "subject": "Question 1"},
{"id": 2, "subject": "Question 2"}
],
"meta": {
"totalElements": 100,
"totalPages": 10,
"currentPage": 1
}
}
Page 객체를 그대로 반환하면 필요없는 메타데이터까지 전달하는 경우가 생길 수 있고,
특히 전체 데이터 개수가 매우 클 경우 계산을 위한 추가 쿼리 때문에 성능에 영향을 끼칠 수도 있다.
팀 규약, 성능 최적화, 클라이언트 편의 성 , 응답 형식 커스텀 가능 등의 이유로
별도 추출이 권장되는 경우도 많다.