Django의 URL 라우팅 (urls.py 설정)
Django는 강력한 URL 라우팅 시스템을 제공하여 클라이언트의 요청을 적절한 View로 매핑할 수 있도록 돕습니다. 이번 글에서는 Django의 urls.py
설정과 URL 패턴을 정의하는 방법을 예제 코드와 함께 자세히 설명하겠습니다.
1. Django의 URL 라우팅 개념
Django의 URL 라우팅은 다음과 같은 구조로 이루어집니다.
- 사용자가 특정 URL로 요청을 보냄
- Django의 URL Dispatcher가
urls.py
에서 해당 URL 패턴을 검색 - 일치하는 패턴이 있으면 연결된 View 함수 또는 Class-Based View를 실행
- View가 응답을 생성하여 클라이언트에 반환
2. 프로젝트 수준의 urls.py
설정
Django 프로젝트를 생성하면 기본적으로 project_name/urls.py
파일이 생성됩니다. 이 파일에서 프로젝트 전반에 걸친 URL 패턴을 설정할 수 있습니다.
기본적인 urls.py
의 구조는 다음과 같습니다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')), # app의 urls.py 파일을 포함
]
여기서 중요한 부분은 include('blog.urls')
입니다. 이 설정은 blog
라는 앱의 urls.py
파일을 참조하여 해당 URL 패턴을 불러오도록 합니다.
3. 앱 수준의 urls.py
설정
Django에서는 각 애플리케이션마다 별도의 urls.py
파일을 생성하여 관리하는 것이 일반적입니다. 예를 들어, blog
라는 애플리케이션이 있을 때 blog/urls.py
를 다음과 같이 설정할 수 있습니다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('<int:post_id>/', views.detail, name='detail'),
]
이 설정에서는 두 개의 URL 패턴을 정의했습니다.
path('', views.index, name='index')
:/blog/
로 접속하면index
뷰 함수가 실행됩니다.path('<int:post_id>/', views.detail, name='detail')
:/blog/1/
과 같은 요청이 들어오면detail
뷰 함수가 실행됩니다.
4. View 함수와 연동하기
위에서 정의한 urls.py
파일에서 사용한 views.index
와 views.detail
은 실제로 views.py
에 정의된 함수입니다.
예제 views.py
:
from django.http import HttpResponse
# 블로그 메인 페이지
def index(request):
return HttpResponse("Hello, 블로그 메인 페이지입니다.")
# 특정 게시글 상세 페이지
def detail(request, post_id):
return HttpResponse(f"게시글 번호 {post_id}의 상세 페이지입니다.")
이렇게 하면 /blog/
로 접근하면 "Hello, 블로그 메인 페이지입니다."라는 응답이,/blog/1/
로 접근하면 "게시글 번호 1의 상세 페이지입니다."라는 응답이 반환됩니다.
5. URL 패턴에 정규 표현식 활용하기
Django 2.0부터는 path()
를 사용하여 가독성이 좋은 URL 패턴을 정의할 수 있지만, 정교한 패턴이 필요할 경우 re_path()
를 사용할 수도 있습니다.
예제:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^post/(?P<slug>[\w-]+)/$', views.post_detail, name='post_detail'),
]
위 예제에서는 /post/some-slug/
와 같은 URL을 매칭할 수 있습니다.
6. 네임스페이스 활용하기
여러 앱에서 같은 이름의 URL 패턴이 충돌하는 것을 방지하기 위해 URL 네임스페이스를 활용할 수 있습니다.
project/urls.py
:
urlpatterns = [
path('blog/', include(('blog.urls', 'blog'), namespace='blog')),
]
이렇게 하면 reverse()
또는 url
템플릿 태그에서 blog:index
처럼 네임스페이스를 지정할 수 있습니다.
7. 템플릿 시스템과 연결하기
Django의 HttpResponse
대신 템플릿을 사용하여 HTML을 반환하는 방법을 소개하겠습니다.
views.py
:
from django.shortcuts import render
def index(request):
return render(request, 'blog/index.html')
def detail(request, post_id):
return render(request, 'blog/detail.html', {'post_id': post_id})
이렇게 하면 blog/templates/blog/index.html
과 blog/templates/blog/detail.html
파일을 생성하여 렌더링할 수 있습니다.
8. URL Reverse 기능 활용하기
Django에서는 URL 패턴을 변경해도 쉽게 유지보수할 수 있도록 reverse()
및 {% url %}
템플릿 태그를 지원합니다.
예제:
from django.urls import reverse
from django.http import HttpResponseRedirect
def redirect_to_blog(request):
return HttpResponseRedirect(reverse('blog:index'))
템플릿에서 사용하기:
<a href="{% url 'blog:detail' post_id=5 %}">게시글 보기</a>
9. 정리
Django의 URL 라우팅 시스템은 간단하면서도 확장성이 뛰어납니다. urls.py
를 잘 구성하면 유지보수성이 높아지고 프로젝트 구조가 깔끔해집니다.
이번 포스팅에서 다룬 내용은 Django URL 설정의 핵심 개념이며, 프로젝트에 맞게 응용하여 사용할 수 있습니다.
'Python Django' 카테고리의 다른 글
Django Template 엔진 활용법 (0) | 2025.02.26 |
---|---|
Django의 View와 HttpResponse 기본 사용법 (0) | 2025.02.25 |
Django의 MTV(Model-Template-View) 패턴 이해하기 (0) | 2025.02.23 |
Django 기본 폴더 구조 및 역할 (0) | 2025.02.22 |
Django 프로젝트와 앱 개념 이해 (0) | 2025.02.21 |