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 처리는 다음과 같은 흐름을 따릅니다:
- 사용자가 브라우저에서 http://127.0.0.1:8000/myapp/detail/5/ 요청.
- **프로젝트의 urls.py**에서 'myapp/' 패턴을 찾아 myapp.urls로 연결.
- **앱의 urls.py**에서 detail/<int:id>/ 패턴을 찾아 해당 뷰(views.detail) 실행.
- 해당 뷰가 데이터를 가공 후 템플릿을 렌더링하여 응답.
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 처리 과정 흐름 요약
- 프로젝트 수준의 urls.py
- 웹 애플리케이션의 전체 URL을 통제하고 앱의 URL을 포함.
- 주 역할: admin/, app/ 등 주요 경로 설정.
- 앱 수준의 urls.py
- 개별 앱의 특정 기능에 대한 URL 설정.
- 주 역할: home/, detail/5/ 등 세부 기능 처리.
- 뷰(View)에서 요청 처리
- urls.py에서 지정된 뷰 함수가 호출되어 데이터를 처리.
5. Django URL 설정의 목적 및 장점
- 모듈화
- 프로젝트와 앱을 분리하여 관리가 용이함.
- 확장성
- 새로운 앱을 쉽게 추가 가능.
- 유지보수 용이
- 특정 앱의 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/로 접속하면 특정 게시글이 출력됩니다.
'Django' 카테고리의 다른 글
| Django ORM과 클래스 상속 원리 (0) | 2025.02.01 |
|---|---|
| Django코드 VS Python 코드 : 웹 개발 내 각각 역할 비교 및 분석 (0) | 2025.01.20 |
| Django의 아키텍쳐 설계 및 원칙 (0) | 2025.01.20 |
| Django 개발 WORKFLOW (1) | 2025.01.20 |