티스토리 뷰
Django 프로젝트를 진행하면서 가장 흔히 겪는 고민 중 하나는 개발 환경(로컬) 과 운영 환경(프로덕션) 의 설정을 어떻게 분리하고 관리할 것인가 입니다.
개발 단계에서는 디버그 모드, 간단한 데이터베이스(SQLite) 등을 사용하고, 운영 단계에서는 보안과 성능을 고려해 PostgreSQL, Redis, AWS S3 등의 외부 서비스와 연동하는 경우가 많습니다.
이번 포스트에서는 Django의 settings.py 파일을 로컬과 프로덕션 환경에 맞게 관리하는 몇 가지 방법과 모범 사례를 소개해 보겠습니다.
1. 왜 환경별 분리가 필요한가?
프로젝트가 커지거나 배포 환경이 달라지면 다음과 같은 이유로 설정을 분리하는 것이 필요합니다.
- 보안: 운영 환경에서는 DEBUG 모드를 반드시 False로 설정해야 하며, 비밀키(SECRET_KEY)나 데이터베이스 접속 정보 등 민감한 정보가 외부에 노출되지 않아야 합니다.
- 유연성: 로컬에서는 빠른 개발과 디버깅을 위해 간단한 설정(예, SQLite, 로컬 이메일 백엔드)을 사용하지만, 운영 환경에서는 고성능, 확장성, 로깅 등 다양한 요소를 고려해야 합니다.
- 유지보수성: 환경별로 설정을 분리하면 각 환경의 변경사항을 독립적으로 관리할 수 있어 코드의 복잡도를 낮출 수 있습니다.
2. 분리된 settings 모듈 구성하기
방법 1: settings 파일을 여러 개로 분리하기
가장 일반적인 방법은 Django의 기본 settings.py 파일을 여러 파일로 쪼개어 관리하는 것입니다.
예를 들어, 프로젝트 디렉토리 구조를 다음과 같이 구성할 수 있습니다.
├── manage.py
└── myproject/
├── __init__.py
├── settings/
│ ├── __init__.py
│ ├── base.py
│ ├── local.py
│ └── production.py
├── urls.py
└── wsgi.py
- base.py: 로컬과 프로덕션 모두에서 공통으로 사용하는 설정을 포함합니다.
- local.py: base.py를 상속받아 로컬 개발에 특화된 설정(예, DEBUG = True, SQLite 등)을 정의합니다.
- production.py: base.py를 상속받아 프로덕션 환경에 맞는 설정(예, DEBUG = False, 외부 데이터베이스, 보안 설정)을 정의합니다.
예제 코드
base.py
# myproject/settings/base.py
import os
from pathlib import Path
# 프로젝트의 루트 디렉토리 설정
BASE_DIR = Path(__file__).resolve().parent.parent
# 보안을 위해 SECRET_KEY는 환경 변수에서 읽어오거나 기본값을 설정합니다.
SECRET_KEY = os.environ.get('SECRET_KEY', 'your-default-secret-key')
# 기본적으로 DEBUG는 False로 설정합니다.
DEBUG = False
# 공통으로 사용하는 앱 및 미들웨어 등
ALLOWED_HOSTS = [] # production.py에서 수정
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 기타 공통 앱들
]
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',
]
ROOT_URLCONF = 'myproject.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
},
},
]
WSGI_APPLICATION = 'myproject.wsgi.application'
# 기본 데이터베이스 설정은 production.py 또는 local.py에서 오버라이드 하도록 합니다.
DATABASES = {}
# 기타 공통 설정 (언어, 타임존, 정적 파일 경로 등)
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
local.py
# myproject/settings/local.py
from .base import *
DEBUG = True
# 로컬 개발용으로 ALLOWED_HOSTS를 설정합니다.
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# SQLite3를 로컬 데이터베이스로 사용
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 이메일 백엔드를 콘솔로 출력 (개발 시 테스트용)
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
production.py
# myproject/settings/production.py
from .base import *
DEBUG = False
# 프로덕션 환경의 도메인 또는 IP 주소 설정
ALLOWED_HOSTS = ['yourdomain.com']
# 환경 변수에서 민감 정보 읽어오기
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('DB_NAME', 'prod_db_name'),
'USER': os.environ.get('DB_USER', 'prod_db_user'),
'PASSWORD': os.environ.get('DB_PASSWORD', 'prod_db_password'),
'HOST': os.environ.get('DB_HOST', 'localhost'),
'PORT': os.environ.get('DB_PORT', '5432'),
}
}
# 정적 파일 및 미디어 파일 경로, S3와 같은 외부 스토리지 설정 등
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_ROOT = BASE_DIR / 'media'
# 이메일 백엔드 예제 (실제 메일 전송)
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = os.environ.get('EMAIL_HOST', 'smtp.gmail.com')
EMAIL_PORT = os.environ.get('EMAIL_PORT', 587)
EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER', '')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD', '')
EMAIL_USE_TLS = True
3. 환경 변수와 DJANGO_SETTINGS_MODULE 활용하기
위와 같이 settings 파일을 분리한 후, Django가 어떤 설정 파일을 사용할지 지정하는 방법은 환경 변수 DJANGO_SETTINGS_MODULE 을 사용하는 것입니다.
예시
- 로컬 개발:
터미널이나 IDE 설정에서 환경 변수를 아래와 같이 설정합니다export DJANGO_SETTINGS_MODULE=myproject.settings.local
또는, manage.py 상단에 임시로 설정할 수도 있습니다.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.local')
- 프로덕션 환경:
배포 시 환경 변수 DJANGO_SETTINGS_MODULE 을 myproject.settings.production 으로 지정합니다.
예를 들어, Gunicorn이나 uWSGI의 설정 파일, 또는 클라우드 플랫폼의 환경 변수 설정을 통해 지정할 수 있습니다.
이렇게 하면 같은 코드베이스 내에서 서로 다른 설정 파일을 손쉽게 불러올 수 있게 되어 개발과 배포 환경을 깔끔하게 분리할 수 있습니다.
4. 추가 도구 활용: django-environ 과 python-decouple
직접 환경 변수를 관리하는 것도 좋지만, 보다 체계적으로 관리하고 싶다면 다음과 같은 패키지를 활용할 수 있습니다.
- django-environ: .env 파일을 프로젝트 루트에 두고, 그 파일에서 환경 변수를 로드할 수 있습니다.
- python-decouple: 설정 파일과 민감 정보를 분리해 관리할 수 있도록 도와줍니다.
django-environ 예시
- 패키지 설치:
pip install django-environ
- base.py 에서 사용:
# myproject/settings/base.py
import environ
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env(
DEBUG=(bool, False)
)
# .env 파일 읽기
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[])
- .env 파일 예시 (로컬 개발용)
SECRET_KEY=your-very-secret-key
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
이처럼 django-environ을 활용하면 각 환경에 맞는 .env 파일을 별도로 관리할 수 있고, 민감한 정보가 소스코드에 포함되지 않도록 할 수 있습니다.
5. 마무리하며
Django에서 로컬과 프로덕션 환경에 맞게 설정을 분리해 관리하는 것은 안정적인 배포와 효율적인 개발을 위한 필수 조건입니다.
이번 포스트에서는 settings 파일을 여러 개로 분리하는 방법과, 환경 변수를 활용해 어떤 설정 파일을 불러올지 제어하는 방법을 소개했습니다.
또한, django-environ 같은 외부 패키지를 사용하여 환경 변수를 보다 체계적으로 관리하는 방법도 살펴보았습니다.
팁:
- 비밀 정보는 절대 소스 코드에 포함하지 말고, 환경 변수나 별도 .env 파일을 사용하세요.
- 배포 전에 프로덕션 설정이 올바른지 꼼꼼히 확인하는 습관을 들이세요.
- 버전 관리 시스템(git 등)에 .env 파일은 포함시키지 않고, 별도의 방법으로 관리하는 것이 좋습니다.
이 방법들을 통해 여러분의 Django 프로젝트를 보다 안정적이고 효율적으로 관리해보시길 바랍니다!
이상으로 Django settings를 로컬과 프로덕션 환경에 맞게 분리하여 관리하는 방법에 대해 알아보았습니다.
여러분의 프로젝트에 도움이 되길 바라며, 질문이나 추가적인 의견은 댓글로 남겨주세요. Happy coding!
'Python > Django Framework (DRF)' 카테고리의 다른 글
| Gunicorn과 Nginx를 이용한 Django 애플리케이션 배포 및 자동화 (가상환경 적용) (0) | 2025.02.18 |
|---|---|
| manage.py migrate 오류 해결 (0) | 2025.02.18 |
| Django REST Framework에서 Basic Token 인증 방식 사용하기 (1) | 2025.02.06 |
| Django REST Framework에서 JWT Token 설정 및 API 호출하기 (1) | 2025.02.05 |
| [CentOS] MySql 설치 오류 (2) | 2025.01.09 |
- Total
- Today
- Yesterday
- 로또 1164회 당첨
- 장고 orm sql문 비교
- 티스토리챌린지
- 로또 ai
- Python
- 주식공부
- chat gpt api 비용 계산
- 골든크로스
- 토치비전
- 1165회 로또
- 자동매매
- 기술적분석
- 차트분석
- 퀀트투자
- chat gpt 모델 api 가격 예측
- 클래스형 뷰
- chat gpt 가격 예상
- 주린이탈출
- 재테크
- chat gpt 모델 별 가격
- 1164회 로또
- 주식투자
- chat gpt 모델별 예산
- 자동매매로직
- 케라스
- chat gpt 4o 예산
- chat gpt 한국어 가격
- 인공지능 로또 예측
- Numpy
- 오블완
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |