페이지네이션 구현과 코드 리팩토링

2star_·2025년 1월 23일
0

최종 프로젝트

목록 보기
26/32

기존 코드에서 페이지네이션이 없었던 ReviewSearchAPIView를 개선하여, 페이지네이션 기능을 추가하고, 클라이언트가 요청한 페이지에 따라 데이터를 효율적으로 반환하도록 수정했습니다.


1. 기존 코드의 문제점

  • 모든 데이터 반환: 검색 결과를 한 번에 모두 반환하여, 결과가 많아질 경우 성능 문제가 발생할 가능성이 있었습니다.
  • 페이징 정보 부족: 클라이언트가 데이터를 어떻게 나눠서 보여줄지 판단할 수 있는 정보가 부족했습니다.
    • 다음 페이지가 존재하는지(has_next) 여부나 현재 페이지 번호(current_page) 같은 메타데이터가 없었습니다.

2. 개선된 코드의 핵심 변경 사항

a. Django Paginator 도입

  • Django의 Paginator를 사용해 페이지네이션을 간단하고 효율적으로 구현.
  • pagelimit를 기반으로 특정 페이지의 데이터를 반환.

b. 메타데이터 추가

  • 클라이언트가 페이지를 탐색하기 쉽게 응답에 다음 정보를 추가:
    • current_page: 현재 페이지 번호
    • has_next: 다음 페이지 존재 여부

c. 불필요한 예외 처리 제거

  • EmptyPage 예외 처리를 제거하고, Paginator의 기본 동작으로 페이지 요청을 처리
  • 검색 결과가 없을 경우 404 Not Found를 반환하도록 간결하게 수정

3. 개선된 코드 구조

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,
        )

4. 응답 구조 변화

기존 응답

모든 데이터를 한꺼번에 반환:

[
    {
        "id": 1,
        "content": "리뷰 내용 1",
        "categories": "액션",
        "app_id": 12345
    },
    ...
]

개선된 응답

페이지네이션 메타데이터를 포함:

{
    "reviews": [
        {
            "id": 1,
            "content": "리뷰 내용 1",
            "categories": "액션",
            "app_id": 12345
        },
        ...
    ],
    "has_next": true,
    "current_page": 1
}

5. 장점

  • 효율적인 데이터 로드: 요청마다 필요한 데이터만 반환하여 서버 부담을 줄이고 클라이언트의 로딩 시간을 단축
  • 명확한 탐색 가능: 페이지 정보(current_page, has_next)를 제공하여 클라이언트가 다음 페이지 여부를 쉽게 판단
  • 데이터 과다로 인한 성능 문제 방지: 대량의 데이터를 한꺼번에 보내는 일을 방지하여 서버와 클라이언트의 성능 최적화
profile
안녕하세요.

0개의 댓글

관련 채용 정보