1. 데이터베이스 연결 설정
Django 프로젝트 초기화 후 가장 먼저 해야 할 작업 중 하나는 데이터베이스 연결을 위한 settings.py 수정입니다. 기본적으로 MySQL 사용 시 다음과 같은 구조로 설정합니다.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject_db',
'USER': 'dbuser',
'PASSWORD': 'securepassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
연결 풀(Connection Pool) 활용하기
고성능 웹 애플리케이션에서는 동시 요청 처리를 위해 데이터베이스 연결 풀을 도입하는 것이 중요합니다. 각 데이터베이스 드라이버에 따라 설정 방식이 다릅니다.
MySQL (mysqlclient 기반)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject_db',
'USER': 'dbuser',
'PASSWORD': 'securepassword',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'charset': 'utf8mb4',
'pool_size': 10,
'max_overflow': 5,
},
}
}
PostgreSQL (psycopg2 기반)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myproject_pg',
'USER': 'pguser',
'PASSWORD': 'pgpass',
'HOST': 'localhost',
'PORT': '5432',
'OPTIONS': {
'client_encoding': 'UTF8',
'pool_size': 8,
'max_overflow': 10,
},
}
}
외부 라이브러리: django-db-pool 사용
특정 장고 확장 모듈을 통해 보다 정교한 연결 관리를 수행할 수 있습니다.
pip install django-db-pool
설정 예시:
DATABASES = {
'default': {
'ENGINE': 'django_db_pool',
'POOL_OPTIONS': {
'POOL_SIZE': 12,
'MAX_OVERFLOW': 6,
'RECYCLE': 1800,
'TIMEOUT': 20,
},
'NAME': 'myproject_db',
'USER': 'dbuser',
'PASSWORD': 'securepassword',
'HOST': 'localhost',
'PORT': '3306',
}
}
2. 쿼리 로그 활성화
개발 과정에서 SQL 쿼리가 어떻게 생성되고 실행되는지 확인하려면 로깅 설정을 추가하세요.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
},
}
}
3. PyMySQL로 MySQL 연결 지원
Python 3 환경에서 MySQL 접속 시 MySQLdb 대신 PyMySQL을 사용해야 합니다. 프로젝트 최상위 __init__.py 파일에 다음 코드를 삽입하세요.
import pymysql
pymysql.install_as_MySQLdb()
# 호환성 문제 해결 (Django 버전에 따라 필요)
pymysql.version_info = (1, 4, 6, 'final', 0)
4. 마이그레이션 명령어
모델 변경 사항을 데이터베이스에 반영하기 위한 표준 절차입니다.
python manage.py makemigrations
python manage.py migrate
5. 커스텀 유저 모델 지정
기본 User 모델 대신 확장된 필드를 포함한 사용자 정의 모델을 사용하려면 설정 파일에 등록해야 합니다.
# settings.py
AUTH_USER_MODEL = 'accounts.CustomUser'
여기서 accounts는 앱 이름이며, CustomUser는 해당 앱 내에서 AbstractUser 또는 AbstractBaseUser를 상속받은 클래스입니다.
6. 앱 등록 및 미들웨어 추가
새로운 앱을 생성한 후에는 반드시 INSTALLED_APPS에 추가해야 합니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
...
'accounts',
'blog',
'api',
]
커스텀 미들웨어도 동일하게 등록합니다.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
...
'middleware.logging_middleware.RequestLogger',
]
7. 정적 파일과 미디어 파일 분리
프론트엔드 자산과 업로드된 파일을 철저히 분리하여 유지보수성을 높입니다.
정적 파일 경로
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'shared_static',
]
STATIC_ROOT = BASE_DIR / 'collected_static'
미디어 파일 경로
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'user_uploads'
URL 패턴에도 미디어 서비스 라우트를 포함시켜야 외부 접근이 가능합니다.
# urls.py (메인)
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
# 기타 URL
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
8. 이메일 전송(SMTP) 설정
비밀번호 재설정, 인증 메일 등에 필요한 SMTP 서버 정보를 구성합니다.
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your_email@gmail.com'
EMAIL_HOST_PASSWORD = 'your_app_password'
DEFAULT_FROM_EMAIL = 'no-reply@yoursite.com'
9. 인증 리디렉션 경로 설정
@login_required 데코레이터가 적용된 뷰에 비로그인 상태로 접근 시 리디렉션될 URL을 지정합니다.
LOGIN_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/dashboard/'
LOGOUT_REDIRECT_URL = '/home/'
10. X-Frame-Options 보안 설정
Iframe 내에서 페이지 로딩을 제어하여 클릭재킹 공격을 방지합니다.
X_FRAME_OPTIONS = 'SAMEORIGIN' # 동일 출처만 허용
# 또는 전체 허용 (주의 필요): X_FRAME_OPTIONS = 'ALLOWALL'
11. 다국어 및 시간대 설정
관리자 인터페이스를 한국어로 사용하려면 언어 코드를 조정합니다.
LANGUAGE_CODE = 'ko-kr'
USE_I18N = True
USE_TZ = False # 타임존 무시 (UTC 기반 저장 비활성화)
TIME_ZONE = 'Asia/Seoul'
USE_L10N = True # 지역 형식 자동 적용 활성화
12. 자주 사용되는 Django 임포트 모음
뷰 개발 시 자주 사용되는 컴포넌트들을 미리 확인해 두면 생산성이 향상됩니다.
from django.conf import settings
from django.shortcuts import render, redirect, get_object_or_404
from django.http import JsonResponse, HttpResponse
from django.urls import reverse
from django.contrib import messages, auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import View
from django.db.models import Q, F, Count, Avg, Max, Min
from django.db import transaction
from django.forms import ModelForm, widgets
from django.utils.safestring import mark_safe
from django.views.static import serve
from django.template import Library
13. 템플릿 태그 및 필터 커스터마이제이션
커스텀 템플릿 태그를 등록하려면 앱 내 templatetags 디렉터리와 함께 아래와 같이 작성합니다.
# templatetags/extras.py
from django import template
register = template.Library()
@register.simple_tag
def current_year():
return timezone.now().year