안녕하세요
이번 시간에는 Django에서 Page에 대해 알아보고 페이징 처리(Pagination)하는 실습을 진행하겠습니다.
0. 사전 준비하기 (템플릿 확장, Bootstrap4)
[Django] Django에서 템플릿 확장의 개념과 템플릿 확장 적용하는 방법 실습하기 (tistory.com)
[Django] Bootstrap4에 대해 알아보고 Django에 Bootstrap4 부트스트랩 적용하기 (tistory.com)
실습을 진행하기 앞서 개발 환경을 맞추고자 Django 템플릿 확장과 Bootstrap4를 적용해야 합니다.
1. 페이지(Page)란?
페이징(Paging) 처리란 데이터를 페이지(Page) 단위로 나누어 표시하는 방식을 의미합니다. 이 방식은 대용량 데이터를 효율적으로 처리할 수 있도록 해주며, 대표적으로 웹 페이지나 앱에서 리스트 형태로 보여지는 목록 등에서 많이 사용됩니다.
2. 페이징(Paging) 처리의 장점
페이징 처리를 하는 이유는 다음과 같습니다.
1. 성능 향상
대용량 데이터를 한 번에 모두 로딩하면, 사용자가 페이지를 열 때마다 오랜 시간이 걸리고 서버 부하가 증가하여 성능이 저하됩니다. 페이징 처리를 하면 필요한 페이지만 로딩하여 불필요한 자원 낭비를 줄이고, 페이지 로딩 속도를 향상시킬 수 있습니다.
2. 사용자 경험 개선
페이징 처리를 하면 사용자가 필요한 데이터를 빠르게 찾을 수 있습니다. 일반적으로 페이지 번호나 스크롤을 이용하여 다음 페이지로 이동할 수 있으며, 이는 사용자가 자신이 원하는 데이터를 찾는 데에 도움을 줍니다.
3. 검색 엔진 최적화(SEO)
페이징 처리를 함으로써 검색 엔진이 페이지를 크롤링할 때 더 많은 페이지를 인식할 수 있게 됩니다. 이는 검색 엔진 최적화에 도움을 줍니다.
4. 메모리 절약
페이징 처리를 하면 필요한 데이터만 메모리에 저장할 수 있습니다. 대용량 데이터를 한 번에 로딩하면 메모리를 많이 차지하여 다른 작업에 영향을 미칠 수 있습니다.
페이징 처리는 웹 개발에서 필수적인 기술 중 하나입니다. 이를 통해 성능을 개선하고 사용자 경험을 향상시킬 수 있으며, 검색 엔진 최적화와 메모리 절약에도 도움을 줍니다.
3. 페이징(Paging) View 만들기
Django에서 페이징 처리를 하려면 django.core.paginator 모듈을 사용할 수 있습니다. 이 모듈은 Paginator 클래스를 제공하며, 이를 사용하여 쉽게 페이징 처리를 할 수 있습니다.
# views.py
from django.core.paginator import Paginator
from django.shortcuts import render
def my_view(request):
my_data = ["data1", "data2", "data3", "data4", "data5", "data6", "data7", "data8", "data9", "data10"]
paginator = Paginator(my_data, 2) # 페이지 당 2개의 아이템을 보여줌
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'my_template.html', {'page_obj': page_obj})
위 코드에서 my_data는 페이징 처리를 해야 할 데이터입니다. Paginator 클래스의 첫 번째 인자에는 이 데이터를 전달하고, 두 번째 인자에는 페이지당 보여줄 데이터의 개수를 전달합니다. request.GET.get('page')를 통해 요청한 페이지 번호를 가져온 후, paginator.get_page() 메서드를 사용하여 해당 페이지의 데이터를 가져옵니다.
4. 페이징(Paging) 템플릿 만들기
<!-- my_template.html -->
<ul>
{% for data in page_obj %}
<li>{{ data }}</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
메서드 | 기능 |
has_previous | 이전 페이지 유무 |
previous_page_number | 이전 페이지 번호 |
current-page | 현재 페이지 번호 |
has_next | 다음 페이지 유무 |
next_page_number | 다음 페이지 번호 |
page_obj | 페이지 처리된 객체 |
위 코드에서 page_obj를 이용해 페이지에 해당하는 데이터를 보여주고, 이전 페이지와 다음 페이지로 이동할 수 있는 링크를 제공합니다.
5. URLconf 설정하기
# urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('', my_view, name="page"),
]
MTV 디자인 패턴에 따라 URLconf를 구성하여 my_view 함수와 매핑합니다.
6. 서버 실행하기
python manage.py runserver
서버를 실행하여 페이징 처리 됐을 때 어떻게 동작하는지 확인해보겠습니다.
이전 실습을 진행할 때 찍어뒀던 페이징 처리 형태이지만 현재 코드에서는 한 페이지당 2개의 아이템이 나오게 끔 되어 있습니다. 코드를 실행했을 때 정상적으로 한 개의 페이지당 2개의 아이템이 나오는 것을 확인할 수 있습니다.
이번 시간에는 페이지(Page)에 대해 알아보고 Django에서 페이징 처리(Pagination)하는 실습을 진행했습니다.
감사합니다.
'Framework > Django' 카테고리의 다른 글
[django] request.GET/request.GET.get MultiValueDictKeyError 해결 (0) | 2021.03.18 |
---|---|
[Django] Select option 선택한 옵션으로 이동하고 선택한 값 GET으로 받기, 월별 데이터 출력하기 (2) | 2021.03.17 |
[Django] Django 게시판 구현하기(3) Sign Up, Login, Logout, Style 추가 (0) | 2021.02.23 |
[Django] Django 회원가입 구현하기(2) Login, Logout (0) | 2021.02.23 |
[Django] Django 회원가입 구현하기(1) Sign Up, UserCreationForm (2) | 2021.02.23 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!