template → view/model → 각 앱의 urls → 프로젝트의 urls → settings
본 문서는 일반적인 Django의 개발 순서(MTV 구조)와는 다르게, 사용자 화면(UI)을 먼저 구성하고, 이후 해당 템플릿에 백엔드 로직을 연결해 나가는 방식으로 구성되어 있다.
즉, HTML 기반의 템플릿을 먼저 작성한 뒤, 해당 템플릿을 처리하기 위한 view 함수 및 model 클래스, 이를 브라우저에서 접근할 수 있도록 연결하는 URL 설정, 마지막으로 전체 환경을 제어하는 settings.py 설정의 순서로 진행된다.
mkdir 프로젝트이름 ; cd 프로젝트이름
uv venv .venv -p 3.12
.venv\Scripts\activate
uv
는pip
을 대체하는 빠르고 현대적인 패키지 관리 도구이며,venv
는 가상환경을 생성한다.
Windows 기준으로는.venv\Scripts\activate
, Mac/Linux에서는source .venv/bin/activate
를 입력한다.
uv pip install django
django-admin startproject config .
uv pip install django
를 통해 Django를 설치하고,.
을 명시하여 현재 디렉토리에 프로젝트를 생성한다.
python manage.py startapp user ; python manage.py startapp todolist
Django는 프로젝트 내 기능 단위를 앱(App)으로 구성한다.
user
앱은 사용자 인증을,todolist
앱은 할 일 목록을 관리한다.
앱을 생성한 뒤에는settings.py
의INSTALLED_APPS
에 반드시 추가해야 한다.
mkdir templates
mkdir templates\base templates\user templates\todolist
mkdir static static\css static\js
Django는 템플릿과 정적 파일을 별도로 관리한다.
base.html
은 공통 레이아웃으로 활용되며, 각 앱 별로 템플릿을 분리하여 구성한다.
static
폴더에는 CSS, JS 파일을 저장하며,STATICFILES_DIRS
에 해당 경로를 지정해야 한다.
templates/
├── base/
│ └── base.html
├── user/
│ ├── login.html
│ └── join.html
└── todolist/
├── todolist.html
각 HTML 파일은 해당 앱의 화면을 담당하며,
base.html
은 공통 레이아웃을 정의한다.
하위 템플릿에서는{% extends 'base/base.html' %}
를 통해 상속받는다.
# user/views.py
from django.shortcuts import render
def login_view(request):
return render(request, 'user/login.html')
render()
함수는 요청을 받아 HTML 템플릿을 반환하는 역할을 한다.
템플릿 경로는settings.py
에 명시된'templates'
디렉토리를 기준으로 작성한다.
# user/urls.py 생성 후 아래와 같이 작성
from django.urls import path
from .views import login_view
urlpatterns = [
path('login/', login_view, name='user-login'),
]
# todolist/urls.py 생성 후 아래와 같이 작성
from django.urls import path
from .views import todolist, delete, update
urlpatterns = [
path('', todolist, name='todolist-todolist'),
path('todolist-delete/<int:todo_id>/', delete, name='todolist-delete'),
path('todolist-update/<int:todo_id>/', update, name='todolist-update'),
]
각 앱 내부에
urls.py
를 생성하고, 필요한 view 함수들을 연결한다.
name=
옵션은 URL Reverse 기능을 활용할 수 있도록 URL에 이름을 붙이는 것으로, 템플릿이나redirect()
함수에서 사용된다.
# config/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('user.urls')),
path('', include('todolist.urls')), # 메인 페이지는 todolist로 연결
]
include()
함수를 통해 각 앱의 URLConf를 프로젝트 전체 URLConf에 연결한다.
이로써 각 앱이 독립적으로 URL을 관리할 수 있으며, 유지보수에 유리한 구조를 갖게 된다.
예를 들어/user/login/
이나/todolist-delete/1/
처럼 앱 단위로 URL 경로가 설정된다.
urls.py
를 먼저 생성하고 view 함수를 등록한다.config/urls.py
에서 include()
를 통해 각 앱의 urls.py
를 연결한다.
ALLOWED_HOSTS
는 외부 요청 허용 도메인을 지정하며, 개발 중에는['*']
로 설정할 수 있다.
STATICFILES_DIRS
는 정적 파일 경로를 지정하며,BASE_DIR
와 함께 사용된다.
MySQL 사용 시mysqlclient
를 설치해야 하며, 컴파일 오류 발생 시에는wheel
설치 및Build Tools
확인이 필요하다.
모델 클래스에서는 DB 테이블 구조를 정의한다.
todo_name
과status
는 각각 문자열과 불리언 필드를 나타내며,__str__()
은 객체의 문자열 표현을 반환한다.
request.POST.get()
으로 form 데이터를 받아오며, 유효성 검사를 통해 공백이나 중복을 방지한다.
messages
모듈을 활용해 사용자에게 성공/오류 메시지를 전달할 수 있다.
path('', todolist)
처럼 특정 URL과 view 함수를 연결하며,path('todolist-update/<int:id>')
와 같이 동적 URL도 설정할 수 있다.
이를 통해 브라우저에서 원하는 작업(조회, 삭제, 수정 등)을 실행할 수 있게 된다.
모델에 새로운 필드를 추가하면
views.py
,forms.py
,templates
등의 수정이 함께 필요하다.
이후에는 반드시makemigrations
,migrate
명령어로 DB 스키마를 반영해야 한다.
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
makemigrations
는 변경 사항을 감지해 마이그레이션 파일을 생성하며,
migrate
는 실제 DB에 반영한다.
runserver
로 개발 서버를 실행하면http://127.0.0.1:8000
에서 페이지를 확인할 수 있다.
오류 발생 시 서버 로그의 traceback을 확인하여 원인을 파악한다.
주로 URL 설정, 템플릿 경로 오류, 모델 필드 누락, 마이그레이션 누락 등이 주요 원인이다.