Django 프로젝트 환경 설정 완벽 가이드
1. 프로젝트 구조
1.1 기본 디렉토리 구조
my_project/
├── config/
│ ├── __init__.py
│ ├── settings/
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── local.py
│ │ └── production.py
│ ├── urls.py
│ ├── wsgi.py
│ └── asgi.py
├── scripts/
│ ├── start_dev.sh
│ └── start_prod.sh
├── .env
├── .env.example
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
2. 환경 변수 설정
2.1 django-environ 설정
# config/settings/base.py
from pathlib import Path
import environ
# env 초기화
env = environ.Env(
DEBUG=(bool, False),
ALLOWED_HOSTS=(list, []),
CORS_ORIGIN_WHITELIST=(list, []),
)
# Build paths
BASE_DIR = Path(__file__).resolve().parent.parent.parent
# Take environment variables from .env file
environ.Env.read_env(BASE_DIR / '.env')
# 기본 설정
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env('ALLOWED_HOSTS')
CORS_ORIGIN_WHITELIST = env('CORS_ORIGIN_WHITELIST')
# 데이터베이스 설정
DATABASES = {
'default': env.db(),
}
# 이메일 설정
EMAIL_CONFIG = env.email_url('EMAIL_URL', default='smtp://user:password@localhost:25')
vars().update(EMAIL_CONFIG)2.2 환경변수 파일
# .env
DEBUG=True
SECRET_KEY=your-secret-key
DJANGO_SETTINGS_MODULE=config.settings.local
# 호스트 설정
ALLOWED_HOSTS=example.com,api.example.com,localhost,127.0.0.1
CORS_ORIGIN_WHITELIST=http://127.0.0.1:5173,http://localhost:5173
# 데이터베이스 URL
DATABASE_URL=postgres://user:password@db:5432/dbname
# 이메일 URL
EMAIL_URL=smtp://user:password@smtp.gmail.com:587
# Redis URL (캐싱용)
REDIS_URL=redis://redis:6379/13. 실행 스크립트
3.1 개발 환경 스크립트
#!/bin/sh
# scripts/start_dev.sh
echo "Running Development Server"
# 데이터베이스 마이그레이션
echo "Making migrations..."
python manage.py makemigrations
echo "Applying migrations..."
python manage.py migrate --no-input
# 개발 서버 실행
echo "Starting development server..."
python manage.py runserver 0.0.0.0:80003.2 프로덕션 환경 스크립트
#!/bin/sh
# scripts/start_prod.sh
echo "Running Production Server"
# 정적 파일 수집
echo "Collecting static files..."
python manage.py collectstatic --no-input
# 데이터베이스 마이그레이션
echo "Making migrations..."
python manage.py makemigrations
echo "Applying migrations..."
python manage.py migrate
# Gunicorn 실행
echo "Starting Gunicorn..."
gunicorn config.wsgi:application -b 0.0.0.0:80004. Docker 설정
4.1 Dockerfile
FROM python:3.12-slim
# 환경 변수 설정
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
# 작업 디렉토리 설정
WORKDIR /app
# 시스템 패키지 설치
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
postgresql-client \
build-essential \
python3-dev \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
# 프로젝트 의존성 설치
COPY requirements.txt /tmp/requirements.txt
COPY ./scripts /scripts
# Python 가상환경 설정 및 패키지 설치
RUN python -m venv /py && \
/py/bin/pip install --upgrade pip && \
/py/bin/pip install -r /tmp/requirements.txt && \
rm -rf /tmp && \
adduser --disabled-password --no-create-home django-user && \
mkdir -p /app/static && \
chown -R django-user:django-user /app && \
chmod -R +x /scripts
# 프로젝트 파일 복사
COPY . .
# 정적 파일 디렉토리 권한 설정
RUN chown -R django-user:django-user /app/static
# 사용자 전환
USER django-user
# 환경 변수 PATH 설정
ENV PATH="/scripts:/py/bin:$PATH"
# 포트 노출
EXPOSE 80004.2 Docker Compose
version: "3.9"
services:
db:
container_name: ${PROJECT_NAME}_db
image: postgres:14-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
interval: 5s
timeout: 5s
retries: 5
backend:
container_name: ${PROJECT_NAME}_backend
build:
context: .
dockerfile: Dockerfile
command: /scripts/start_dev.sh # 개발환경
# command: /scripts/start_prod.sh # 프로덕션 환경
volumes:
- .:/app
- static_volume:/app/static
env_file:
- .env
ports:
- "8000:8000"
depends_on:
db:
condition: service_healthy
volumes:
postgres_data:
static_volume:5. requirements.txt
# 기본 의존성
Django>=4.2.0,<5.0.0
django-environ>=0.11.2
django-cors-headers>=4.3.0
djangorestframework>=3.14.0
# 데이터베이스
psycopg2-binary>=2.9.9
# 서버
gunicorn>=21.2.06. 배포 전 체크리스트
6.1 환경 변수 확인
- DATABASE_URL 설정이 올바른가?
- ALLOWED_HOSTS가 프로덕션 도메인을 포함하는가?
- CORS_ORIGIN_WHITELIST가 올바르게 설정되었는가?
- SECRET_KEY가 안전한 값으로 설정되었는가?
- DEBUG가 프로덕션에서 False로 설정되었는가?
6.2 보안 설정
# config/settings/production.py
from .base import *
DEBUG = False
# HTTPS 설정
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True
# 세션 설정
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True6.3 성능 설정
# config/settings/production.py
# 캐시 설정
CACHES = {
'default': env.cache('REDIS_URL')
}
# 정적 파일 설정
STATIC_ROOT = BASE_DIR / 'static'
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'7. 자주 발생하는 문제 해결
7.1 데이터베이스 연결 문제
# 데이터베이스 연결 상태 확인
docker-compose exec db psql -U $DB_USER -d $DB_NAME -c "\l"
# Django 데이터베이스 상태 확인
docker-compose exec backend python manage.py dbshell7.2 정적 파일 문제
# 정적 파일 수집 강제 실행
docker-compose exec backend python manage.py collectstatic --no-input --clear
# 정적 파일 권한 확인
docker-compose exec backend ls -la /app/static7.3 마이그레이션 문제
# 마이그레이션 상태 확인
docker-compose exec backend python manage.py showmigrations
# 마이그레이션 초기화 (주의: 데이터 손실 가능)
docker-compose exec backend python manage.py migrate app_name zero8. 결론
이 가이드는 Django 프로젝트의 기본적인 설정부터 배포까지의 전체 과정을 다룹니다. 환경 변수 관리를 위해 django-environ을 사용하고, Docker를 통한 컨테이너화로 일관된 개발/배포 환경을 구성합니다. 각 환경(개발/프로덕션)에 맞는 설정을 분리하고, 보안과 성능을 고려한 설정을 포함하고 있습니다.
주의할 점은 프로젝트의 요구사항에 따라 이 설정들을 적절히 수정해야 한다는 것입니다. 특히 보안 설정과 성능 최적화는 프로젝트의 특성에 맞게 조정되어야 합니다.