Django 프로젝트 생성 및 구조 이해

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 매핑 및 요청 처리 로직

작업 흐름

  1. URL 요청 → 2. URL 매핑 → 3. 뷰 함수 호출 →
  2. 모델 데이터 조작 → 5. 템플릿 렌더링 → 6. 응답 전송

주요 특징

  • ORM: SQL 대신 Python 객체로 데이터 조작
  • 자동 관리자: 내장 관리 인터페이스 제공
  • 템플릿 시스템: HTML과 로직 분리
  • 보안 기능: CSRF 보호, SQL 인젝션 방지 등

이 예제는 Django의 핵심 기능을 보여주는 기본 구조입니다.

태그: Django python web-development ORM url-routing

7월 8일 04:28에 게시됨