Django URL dispatcher — 깔끔한 URL 설계

Django URL dispatcher — 깔끔한 URL 설계

웹 애플리케이션에서 URL은 사용자가 가장 먼저 만나는 것이에요. 깔끔하고 우아한 URL 체계는 품질 높은 앱의 중요한 요소예요. Django는 URL을 프레임워크의 제약 없이 원하는 대로 설계할 수 있게 해 줘요. 그 중심에 URLconf(URL configuration)가 있어요.

출처: URL dispatcher | Django documentation

URLconf란

앱의 URL을 설계하려면 비공식적으로 URLconf라고 부르는 파이썬 모듈을 만들어요. 이 모듈은 순수 파이썬 코드로, URL 경로 표현식과 파이썬 함수(뷰) 사이의 매핑이에요. 매핑은 짧을 수도 길 수도 있고, 다른 매핑을 참조할 수도 있으며, 순수 파이썬이라 동적으로 구성할 수도 있어요.

Django가 요청을 처리하는 과정

사용자가 Django 사이트에서 페이지를 요청하면, 어떤 파이썬 코드를 실행할지 결정하는 알고리즘은 이래요.

  1. 사용할 루트 URLconf 모듈을 결정해요. 보통은 ROOT_URLCONF 설정 값이지만, 들어오는 HttpRequest 객체에 urlconf 속성이 있으면(미들웨어가 설정) 그 값이 ROOT_URLCONF 대신 쓰여요.
  2. 그 파이썬 모듈을 로드하고 urlpatterns 변수를 찾아요. 이건 django.urls.path()django.urls.re_path() 인스턴스의 시퀀스여야 해요.
  3. 각 URL 패턴을 순서대로 돌면서, path_info에 대해 매칭되는 첫 번째 패턴에서 멈춰요.
  4. 패턴이 매칭되면 지정된 뷰(파이썬 함수 또는 클래스 기반 뷰)를 import 해 호출해요. 뷰에는 HttpRequest 인스턴스와, URL 패턴에서 캡처한 값들이 인자로 전달돼요.

매칭되는 URL 패턴이 없거나 처리 중 예외가 발생하면 Django는 적절한 에러 처리 뷰를 호출해요.

예제 URLconf

샘플 URLconf를 볼게요.

from django.urls import path

from . import views

urlpatterns = [
    path("articles/2003/", views.special_case_2003),
    path("articles/<int:year>/", views.year_archive),
    path("articles/<int:year>/<int:month>/", views.month_archive),
    path("articles/<int:year>/<int:month>/<slug:slug>/", views.article_detail),
]

URL에서 값을 캡처하려면 꺾쇠 괄호(<>)를 써요. 캡처된 값에는 선택적으로 컨버터 타입을 지정할 수 있어요. 예를 들어 <int:year>는 정수 매개변수를 캡처하고, <slug:slug>는 slug 형식을 캡처해요. 컨버터가 없으면 / 문자를 제외한 모든 문자열이 매칭돼요.

이 패턴의 동작을 몇 가지 짚어 볼게요.

  • articles/2003/는 정확히 2003년에만 매칭돼요.
  • articles/<int:year>/는 2004, 2023 같은 어떤 정수 연도에도 매칭돼요. 연도 값은 year 인자로 뷰에 전달돼요.
  • articles/2023/03/처럼 연도·월을 모두 받는 패턴은 더 구체적으로 매칭돼요.
  • 이름 붙은 그룹이 없으면 정규표현식 매치가 위치 인자로, 이름 붙은 부분이 있으면 키워드 인자로 전달돼요.

Django는 URL을 활성 언어에 따라 번역하는 기능도 제공해요. 다국어 URL이 필요하면 국제화 문서를 참고하면 돼요.

정리하면, URLconf는 urlpatternspath()(또는 re_path())를 나열해서 URL과 뷰를 연결하는 순수 파이썬 매핑이에요. <int:...> 같은 컨버터로 값을 캡처해 뷰에 넘기는 방식이 핵심이에요.

더 알아보기