Django 프로젝트 구성 및 기능 구조 분석
다음은 기본적인 Django 웹 애플리케이션을 구축하고 구성 요소별 역할을 설명하는 가이드입니다.
프로젝트 설정 절차
1. 개발 환경 구축 및 프로젝트 초기화
# Django 라이브러리 설치
pip install django
# 프로젝트 생성 (myproject는 프로젝트 이름)
django-admin startproject myproject
cd myproject
# 애플리케이션 생성 (myapp은 애플리케이션 이름)
python manage.py startapp myapp
2. 디렉토리 구조
생성된 파일 시스템은 다음과 같은 형태를 갖습니다:
myproject/ # 프로젝트 루트
├── manage.py # Django 관리 스크립트
├── myproject/ # 프로젝트 설정 폴더
│ ├── __init__.py
│ ├── settings.py # 설정 파일
│ ├── urls.py # URL 매핑
│ └── wsgi.py # WSGI 서버 설정
└── myapp/ # 모듈 폴더
├── __init__.py
├── admin.py # 관리자 인터페이스
├── apps.py # 애플리케이션 설정
├── models.py # 데이터 모델
├── tests.py # 테스트 케이스
├── views.py # 요청 처리 로직
└── migrations/ # 데이터베이스 마이그레이션
코드 구현 사례
1. 프로젝트 설정 파일 myproject/settings.py
"""
Django 설정 파일
"""
import os
from pathlib import Path
# 프로젝트 경로
BASE_DIR = Path(__file__).resolve().parent.parent
# 보안 키 (생산 환경에서는 무작위 문자열 사용)
SECRET_KEY = 'django-insecure-unique-key-here'
# 디버깅 모드 (개발 중 True, 운영 중 False)
DEBUG = True
# 허용 호스트 목록
ALLOWED_HOSTS = []
# 활성화된 애플리케이션 목록
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
# 미들웨어 설정
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# URL 매핑 설정
ROOT_URLCONF = 'myproject.urls'
# 템플릿 설정
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# 데이터베이스 설정 (기본값 SQLite)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 정적 자원 경로
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
2. 모델 정의 myapp/models.py
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
3. 요청 처리 myapp/views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import BlogPost
def index(request):
posts = BlogPost.objects.all().order_by('-created_at')
return render(request, 'index.html', {'posts': posts})
def post_detail(request, post_id):
post = get_object_or_404(BlogPost, id=post_id)
return render(request, 'post_detail.html', {'post': post})
def about(request):
return HttpResponse("""
<h1>소개</h1>
<p>Django 기반의 간단한 블로그 플랫폼입니다.</p>
<a href="/">메인으로</a>
""")
4. 애플리케이션 URL 설정 myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('about/', views.about, name='about'),
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]
5. 프로젝트 URL 설정 myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
6. 관리자 등록 myapp/admin.py
from django.contrib import admin
from .models import BlogPost
@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
list_display = ['title', 'created_at', 'updated_at']
search_fields = ['title', 'content']
list_filter = ['created_at']
7. 템플릿 파일
templates/index.html:
<html>
<head><title>블로그 홈</title></head>
<body>
<nav>
<a href="/">홈</a> |
<a href="/about/">소개</a> |
<a href="/admin/">관리자</a>
</nav>
{% if posts %}
{% for post in posts %}
<div class="post">
<h2><a href="{% url 'post_detail' post.id %}">{{ post.title }}</a></h2>
<p>{{ post.content|truncatewords:30 }}</p>
<div class="meta">작성일: {{ post.created_at|date:"Y-m-d H:i" }}</div>
</div>
{% endfor %}
{% else %}
<p>게시물이 없습니다. 관리자에서 추가해 주세요.</p>
{% endif %}
</body>
</html>
templates/post_detail.html:
<html>
<head><title>{{ post.title }}</title></head>
<body>
<a href="/">← 홈으로</a>
<h1>{{ post.title }}</h1>
<div class="meta">
작성일: {{ post.created_at|date:"Y-m-d H:i" }}<br>
수정일: {{ post.updated_at|date:"Y-m-d H:i" }}
</div>
<div class="content">
{{ post.content|linebreaks }}
</div>
</body>
</html>
실행 절차
1. 데이터베이스 준비
python manage.py makemigrations
python manage.py migrate
2. 관리자 계정 생성
python manage.py createsuperuser
3. 개발 서버 실행
python manage.py runserver
4. 접근 주소
핵심 개념 설명
MVC 패턴
- 모델:
models.py- 데이터 저장 및 처리 - 뷰:
views.py- HTTP 요청 처리 - 컨트롤러: URL 매핑 및 요청 처리 로직
작업 흐름
- URL 요청 → 2. URL 매핑 → 3. 뷰 함수 호출 →
- 모델 데이터 조작 → 5. 템플릿 렌더링 → 6. 응답 전송
주요 특징
- ORM: SQL 대신 Python 객체로 데이터 조작
- 자동 관리자: 내장 관리 인터페이스 제공
- 템플릿 시스템: HTML과 로직 분리
- 보안 기능: CSRF 보호, SQL 인젝션 방지 등
이 예제는 Django의 핵심 기능을 보여주는 기본 구조입니다.