Python Django

Django의 URL 라우팅 (urls.py 설정)

PyExplorer 2025. 2. 24. 12:35

Django의 URL 라우팅 (urls.py 설정)

Django는 강력한 URL 라우팅 시스템을 제공하여 클라이언트의 요청을 적절한 View로 매핑할 수 있도록 돕습니다. 이번 글에서는 Django의 urls.py 설정과 URL 패턴을 정의하는 방법을 예제 코드와 함께 자세히 설명하겠습니다.

1. Django의 URL 라우팅 개념

Django의 URL 라우팅은 다음과 같은 구조로 이루어집니다.

  1. 사용자가 특정 URL로 요청을 보냄
  2. Django의 URL Dispatcher가 urls.py에서 해당 URL 패턴을 검색
  3. 일치하는 패턴이 있으면 연결된 View 함수 또는 Class-Based View를 실행
  4. 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.indexviews.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.htmlblog/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 설정의 핵심 개념이며, 프로젝트에 맞게 응용하여 사용할 수 있습니다.