Django 간단한 TodoList 프로젝트

문승기·2025년 4월 25일
0
post-thumbnail

Django 간단한 TodoList 프로젝트

💡 이 문서의 구성 흐름: template → view/model → 각 앱의 urls → 프로젝트의 urls → settings

본 문서는 일반적인 Django의 개발 순서(MTV 구조)와는 다르게, 사용자 화면(UI)을 먼저 구성하고, 이후 해당 템플릿에 백엔드 로직을 연결해 나가는 방식으로 구성되어 있다.
즉, HTML 기반의 템플릿을 먼저 작성한 뒤, 해당 템플릿을 처리하기 위한 view 함수 및 model 클래스, 이를 브라우저에서 접근할 수 있도록 연결하는 URL 설정, 마지막으로 전체 환경을 제어하는 settings.py 설정의 순서로 진행된다.


목차


1. 프로젝트 폴더 생성

mkdir 프로젝트이름 ; cd 프로젝트이름
uv venv .venv -p 3.12
.venv\Scripts\activate

uvpip을 대체하는 빠르고 현대적인 패키지 관리 도구이며, venv는 가상환경을 생성한다.
Windows 기준으로는 .venv\Scripts\activate, Mac/Linux에서는 source .venv/bin/activate를 입력한다.


2. 프로젝트 생성

uv pip install django
django-admin startproject config .

uv pip install django를 통해 Django를 설치하고, .을 명시하여 현재 디렉토리에 프로젝트를 생성한다.


3. user, todolist 애플리케이션 생성

python manage.py startapp user ; python manage.py startapp todolist

Django는 프로젝트 내 기능 단위를 앱(App)으로 구성한다.
user 앱은 사용자 인증을, todolist 앱은 할 일 목록을 관리한다.
앱을 생성한 뒤에는 settings.pyINSTALLED_APPS에 반드시 추가해야 한다.


4. templates, static 폴더 생성

mkdir templates
mkdir templates\base templates\user templates\todolist
mkdir static static\css static\js

Django는 템플릿과 정적 파일을 별도로 관리한다.
base.html은 공통 레이아웃으로 활용되며, 각 앱 별로 템플릿을 분리하여 구성한다.
static 폴더에는 CSS, JS 파일을 저장하며, STATICFILES_DIRS에 해당 경로를 지정해야 한다.


5. templates 및 static 폴더 내용 구성

templates/
├── base/
│   └── base.html
├── user/
│   ├── login.html
│   └── join.html
└── todolist/
    ├── todolist.html

각 HTML 파일은 해당 앱의 화면을 담당하며, base.html은 공통 레이아웃을 정의한다.
하위 템플릿에서는 {% extends 'base/base.html' %}를 통해 상속받는다.


6. views.py에 렌더링 함수 작성

# user/views.py
from django.shortcuts import render

def login_view(request):
    return render(request, 'user/login.html')

render() 함수는 요청을 받아 HTML 템플릿을 반환하는 역할을 한다.
템플릿 경로는 settings.py에 명시된 'templates' 디렉토리를 기준으로 작성한다.


7. urls.py 생성 및 렌더링 함수 연결

(1) 각 애플리케이션의 urls.py 생성

# 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() 함수에서 사용된다.


(2) 프로젝트의 config/urls.py 수정

# 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를 연결한다.

8. settings.py 설정 및 MySQL 연동

ALLOWED_HOSTS는 외부 요청 허용 도메인을 지정하며, 개발 중에는 ['*']로 설정할 수 있다.
STATICFILES_DIRS는 정적 파일 경로를 지정하며, BASE_DIR와 함께 사용된다.
MySQL 사용 시 mysqlclient를 설치해야 하며, 컴파일 오류 발생 시에는 wheel 설치 및 Build Tools 확인이 필요하다.


9. models.py 작성 및 마이그레이션 준비

모델 클래스에서는 DB 테이블 구조를 정의한다.
todo_namestatus는 각각 문자열과 불리언 필드를 나타내며, __str__()은 객체의 문자열 표현을 반환한다.


10. views.py에서 CRUD 기능 구현

request.POST.get()으로 form 데이터를 받아오며, 유효성 검사를 통해 공백이나 중복을 방지한다.
messages 모듈을 활용해 사용자에게 성공/오류 메시지를 전달할 수 있다.


11. urls.py 재확인 및 연결

path('', todolist)처럼 특정 URL과 view 함수를 연결하며, path('todolist-update/<int:id>')와 같이 동적 URL도 설정할 수 있다.
이를 통해 브라우저에서 원하는 작업(조회, 삭제, 수정 등)을 실행할 수 있게 된다.


12. 기능 추가 시 반복 작업

모델에 새로운 필드를 추가하면 views.py, forms.py, templates 등의 수정이 함께 필요하다.
이후에는 반드시 makemigrations, migrate 명령어로 DB 스키마를 반영해야 한다.


13. 마이그레이션 및 서버 실행

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

makemigrations는 변경 사항을 감지해 마이그레이션 파일을 생성하며,
migrate는 실제 DB에 반영한다.
runserver로 개발 서버를 실행하면 http://127.0.0.1:8000에서 페이지를 확인할 수 있다.


14. 오류 수정

오류 발생 시 서버 로그의 traceback을 확인하여 원인을 파악한다.
주로 URL 설정, 템플릿 경로 오류, 모델 필드 누락, 마이그레이션 누락 등이 주요 원인이다.


profile
AI 모델을 개발하여 이를 활용한 서비스를 개발하고 운영하는 개발자가 되기 위해 꾸준히 노력하겠습니다!

0개의 댓글