기존 코드에서 페이지네이션이 없었던 ReviewSearchAPIView
를 개선하여, 페이지네이션 기능을 추가하고, 클라이언트가 요청한 페이지에 따라 데이터를 효율적으로 반환하도록 수정했습니다.
has_next
) 여부나 현재 페이지 번호(current_page
) 같은 메타데이터가 없었습니다.Paginator
를 사용해 페이지네이션을 간단하고 효율적으로 구현.page
와 limit
를 기반으로 특정 페이지의 데이터를 반환.current_page
: 현재 페이지 번호has_next
: 다음 페이지 존재 여부EmptyPage
예외 처리를 제거하고, Paginator
의 기본 동작으로 페이지 요청을 처리404 Not Found
를 반환하도록 간결하게 수정from django.core.paginator import Paginator
class ReviewSearchAPIView(APIView):
"""
리뷰 검색 API
"""
def get(self, request):
"""리뷰 검색"""
keyword = request.query_params.get("keyword", "").strip()
if not keyword:
return Response(
{"detail": "검색어를 입력해주세요."}, status=status.HTTP_400_BAD_REQUEST
)
# 검색 결과 필터링
game_ids = Game.objects.filter(name__icontains=keyword).values_list(
"appID", flat=True
)
reviews = Review.objects.filter(
Q(content__icontains=keyword)
| Q(categories__icontains=keyword)
| Q(app_id__in=game_ids)
).distinct()
if not reviews.exists():
return Response(
{"detail": "검색 결과가 없습니다."}, status=status.HTTP_404_NOT_FOUND
)
# 페이지네이션 처리
page = int(request.query_params.get("page", 1))
paginator = Paginator(reviews, 10)
page_obj = paginator.page(page)
# 응답 생성
serializer = ReviewSerializer(page_obj, many=True)
return Response(
{
"reviews": serializer.data,
"has_next": page_obj.has_next(),
"current_page": page_obj.number,
},
status=status.HTTP_200_OK,
)
모든 데이터를 한꺼번에 반환:
[
{
"id": 1,
"content": "리뷰 내용 1",
"categories": "액션",
"app_id": 12345
},
...
]
페이지네이션 메타데이터를 포함:
{
"reviews": [
{
"id": 1,
"content": "리뷰 내용 1",
"categories": "액션",
"app_id": 12345
},
...
],
"has_next": true,
"current_page": 1
}
current_page
, has_next
)를 제공하여 클라이언트가 다음 페이지 여부를 쉽게 판단