페이징이 필요한 이유는 모든 피드를 가져오는데 걸리는 시간은 유저가 피드를 작성할 수록 오래걸리기 때문입니다.
페이징을 통해 페이지의 피드 개수와 페이지 인덱스를 정하면 고정된 피드 개수만을 가져와서 응답시간이 느려지는 문제를 해결할 수 있습니다.
다음은 여러 유저를 쿼리하는 view 입니다.
class UserInfoView(generics.ListAPIView):
serializer_class = UserSerializer
def get_queryset(self):
...
page_index = int(self.request.query_params.get('page_index', 0))
page_num = int(self.request.query_params.get('page_num', 4))
offset = page_num * page_index
limit = offset + page_num
queryset = User.objects.all().order_by("user_nickname")
if user_email is not None:
queryset = queryset.filter(user_email__startswith=user_email)[offset:limit]
return queryset
if user_nickname is not None:
queryset = queryset.filter(user_nickname__startswith=user_nickname)[offset:limit]
return queryset
if user_id is not None:
queryset = queryset.filter(id=user_id)[offset:limit]
return queryset
return User.objects.none()
page_index: 페이지의 인덱스입니다. 구글 검색할 때 1 페이지 같은 인덱스입니다.
page_num: 페이지 하나에 들어갈 피드의 개수입니다.
offset: 데이터베이스의 어느 인덱스부터 가져올 지에 대한 변수입니다.
limit: 어느 인덱스까지 가져올 지에 대한 변수입니다.
queryset.filter(user_email__startswith=user_email)[offset:limit]
: 리스트 슬라이싱을 통해 쿼리를 offset부터 limit까지의 인덱스로 가져옵니다.