Django에서 urls.py는 프로젝트 수준앱 수준에 존재할 수 있으며, 이들은 서로 다른 목적과 역할을 수행합니다. 어떤 작업을 하고 있는지(흐름에 따라) 적절한 위치의 urls.py를 사용하게 됩니다.


1. 프로젝트 수준의 urls.py vs 앱 수준의 urls.py

(1) 프로젝트 수준의 urls.py

1) 역할 및 목적

  • 웹 애플리케이션 전체의 URL 라우팅을 총괄하는 역할.
  • 개별 앱들의 urls.py를 포함하여 중앙에서 앱 단위로 URL을 관리.
  • 서버에 요청이 들어오면 가장 먼저 확인하는 URL 매핑 파일.

2) 위치 및 파일 구조

보통 프로젝트 폴더 안의 urls.py가 해당됩니다.

예시 디렉토리 구조:

myproject/
│-- myproject/
│   │-- __init__.py
│   │-- settings.py
│   │-- urls.py  <-- 프로젝트 수준의 urls.py
│   │-- wsgi.py
│-- myapp/
│   │-- urls.py  <-- 앱 수준의 urls.py
│-- manage.py

3) 작동 방식

프로젝트의 urls.py는 앱을 포함하는 역할을 합니다.

예제 (myproject/urls.py):

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Django 기본 관리자 페이지
    path('myapp/', include('myapp.urls')),  # 앱 내부의 urls.py 포함
]

설명:

  • include('myapp.urls'): 앱의 URL 구성을 프로젝트에서 가져와서 사용.
  • 모든 요청이 먼저 프로젝트의 urls.py로 전달된 후, 등록된 앱의 URL로 이동함.

(2) 앱 수준의 urls.py

1) 역할 및 목적

  • 특정 앱(예: 블로그, 사용자 관리 등)에 대한 세부적인 URL 처리.
  • 개별적인 기능에 대한 URL을 정의하여 관리의 편의성을 높임.
  • 모듈화를 통해 코드 유지보수 및 확장성을 확보.

2) 위치 및 파일 구조

앱 폴더 내부에 위치.

예시 디렉토리 구조:

myproject/
│-- myapp/
│   │-- __init__.py
│   │-- models.py
│   │-- views.py
│   │-- urls.py  <-- 앱 수준의 urls.py
│   │-- admin.py
│   │-- tests.py

3) 작동 방식

앱 수준의 urls.py는 해당 앱의 특정 기능별 URL을 정의합니다.

예제 (myapp/urls.py):

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),  # 기본 페이지
    path('detail/<int:id>/', views.detail, name='detail'),  # 상세 페이지
]

설명:

  • path(''): 기본 루트 요청(myapp/에 접속 시) → views.home 실행.
  • path('detail/<int:id>/'): myapp/detail/5/ 같은 URL 처리.

2. 프로젝트 수준과 앱 수준의 urls.py의 관계와 흐름

Django의 URL 처리는 다음과 같은 흐름을 따릅니다:

  1. 사용자가 브라우저에서 http://127.0.0.1:8000/myapp/detail/5/ 요청.
  2. **프로젝트의 urls.py**에서 'myapp/' 패턴을 찾아 myapp.urls로 연결.
  3. **앱의 urls.py**에서 detail/<int:id>/ 패턴을 찾아 해당 뷰(views.detail) 실행.
  4. 해당 뷰가 데이터를 가공 후 템플릿을 렌더링하여 응답.

3. 언제 프로젝트 vs 앱 수준의 urls.py를 사용해야 하나요?

상황별 사용 예시:

상황 urls.py 위치 설명

프로젝트 전체 URL을 설정할 때 프로젝트 urls.py 관리자 페이지, 앱을 포함할 때.
특정 기능(예: 블로그, 유저 관리)별로 URL 관리 앱 urls.py 블로그의 글, 사용자 등록, 주문 처리 등을 관리할 때.
여러 앱을 하나의 프로젝트에서 사용할 때 프로젝트 + 앱 urls.py 프로젝트에서 여러 앱을 포함하고 각각 기능을 나눌 때.

실전 예시:

  • http://127.0.0.1:8000/admin/ → 프로젝트 수준에서 처리
  • http://127.0.0.1:8000/blog/ → 프로젝트 수준 → 앱의 블로그 URL 매핑
  • http://127.0.0.1:8000/blog/post/1/ → 앱의 URL 처리

4. 전체적인 URL 처리 과정 흐름 요약

  1. 프로젝트 수준의 urls.py
    • 웹 애플리케이션의 전체 URL을 통제하고 앱의 URL을 포함.
    • 주 역할: admin/, app/ 등 주요 경로 설정.
  2. 앱 수준의 urls.py
    • 개별 앱의 특정 기능에 대한 URL 설정.
    • 주 역할: home/, detail/5/ 등 세부 기능 처리.
  3. 뷰(View)에서 요청 처리
    • urls.py에서 지정된 뷰 함수가 호출되어 데이터를 처리.

5. Django URL 설정의 목적 및 장점

  1. 모듈화
    • 프로젝트와 앱을 분리하여 관리가 용이함.
  2. 확장성
    • 새로운 앱을 쉽게 추가 가능.
  3. 유지보수 용이
    • 특정 앱의 URL 변경이 전체 프로젝트에 영향을 주지 않음.

6. 예제 프로젝트 설정 흐름

프로젝트 urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),  # blog 앱 URL 포함
]

앱 urls.py (blog 앱)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # 기본 블로그 페이지
    path('post/<int:id>/', views.post_detail, name='post_detail'),
]

뷰 함수 (views.py)

from django.http import HttpResponse

def index(request):
    return HttpResponse("블로그 홈입니다.")

def post_detail(request, id):
    return HttpResponse(f"블로그 글 번호: {id}")

이제 http://127.0.0.1:8000/blog/로 접속하면 블로그 홈이 보이고,
http://127.0.0.1:8000/blog/post/1/로 접속하면 특정 게시글이 출력됩니다.


 

+ Recent posts