Django는 settings.py 파일 하나에 모든 설정이 들어있습니다.
하지만 프로젝트를 진행하다 보면 필연적으로 이런 상황을 마주하게 됩니다.
"로컬에서는 SQLite 쓰고 싶은데, 배포 서버에서는 PostgreSQL 써야 해."
"실수로 DEBUG = True인 상태로 배포해버렸네? 큰일 났다"
"GitHub에 API 키가 그대로 올라갔어.."
이런 치명적인 실수를 방지하기 위해 실무에서는 설정 파일을 환경(Local/Prod) 별로 분리하고, 민감한 정보는 환경변수(.env)로 숨기는 전략을 사용합니다.
🚀 1단계: 파일 쪼개기 (Module Separation)
가장 먼저 해야 할 일은 거대한 settings.py를 역할에 따라 물리적으로 나누는 것입니다.
1. 폴더 구조 변경
기존 settings.py를 삭제하고, settings 라는 폴더(패키지) 를 만듭니다.
config/
├── settings/ # 폴더 생성
│ ├── __init__.py # 패키지 인식용 (빈 파일)
│ ├── base.py # [공통] 모든 환경에서 똑같이 쓰는 설정
│ ├── local.py # [개발] 내 컴퓨터에서만 쓰는 설정
│ └── prod.py # [배포] 실제 서버에서만 쓰는 설정
2. 파일별 역할 정의
- base.py: 기존 settings.py의 모든 내용을 여기에 붙여넣습니다. (INSTALLED_APPS, MIDDLEWARE 등)
- local.py: 개발할 때 덮어쓸 내용만 적습니다.
from .base import * # 공통 설정 다 가져오기
# 개발 환경에서는 디버그 모드 켜기
DEBUG = True
ALLOWED_HOSTS = ["*"]
# 로컬은 가벼운 SQLite 사용
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
- prod.py: 배포 시 보안이 필요한 설정을 적습니다. (DEBUG = False 필수!)
3. 실행 방법
이제 장고를 실행할 때 "어떤 설정을 쓸지" 알려줘야 합니다. manage.py 파일을 열어서 기본값을 수정해 주면 매번 타이핑하지 않아도 돼서 편합니다.
# manage.py
def main():
# [수정] 기본값을 local 설정파일로 변경 (개발 편의성)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')
🔐 2단계: 환경변수로 비밀 숨기기 (.env)
설정 파일을 나눴다고 해도, SECRET_KEY나 API_KEY 같은 비밀번호가 코드에 적혀있으면 깃허브를 통해 유출될 수 있습니다. 이를 막기 위해 환경변수를 사용합니다.
1. 라이브러리 설치
pip install python-dotenv
2. .env 파일 생성 (프로젝트 루트)
이 파일은 절대 Git에 올리면 안 됩니다. (.gitignore에 추가 필수)
Ini, TOML
# .env 파일 내용
SECRET_KEY=django-insecure-v&...
OPENAI_API_KEY=sk-proj-1234...
DB_PASSWORD=mypassword1234
3. 설정 파일에서 불러오기
이제 파이썬 코드(base.py 등)에서 값을 직접 적는 대신, .env를 읽어오도록 수정합니다.
# config/settings/base.py
import os
from dotenv import load_dotenv
# .env 파일 로드
load_dotenv()
# 코드가 아니라 환경변수에서 가져옴 (유출 방지)
SECRET_KEY = os.getenv('SECRET_KEY')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
🛠️ 3단계: django-environ으로 더 스마트하게 (Advanced)
os.getenv는 모든 값을 문자열(String) 로 가져옵니다.
그래서 DEBUG=True라고 적어도, 파이썬은 문자열 "True"로 인식해서 불리언 변환 처리가 귀찮아집니다.
이때 django-environ 라이브러리를 쓰면 훨씬 편해집니다.
import environ
env = environ.Env(
# 환경변수가 없을 때 사용할 기본값 설정 가능
DEBUG=(bool, False)
)
# .env 파일 읽기
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
# 자동으로 Boolean 타입으로 변환됨!
DEBUG = env('DEBUG')
# DB URL 스키마도 자동 파싱 (엄청 편함)
# .env에 DATABASE_URL=postgres://user:pw@localhost:5432/db 라고 적으면 됨
DATABASES = {
'default': env.db(),
}
📝 결론
처음엔 귀찮아 보일 수 있지만, 이렇게 한 번 세팅해 두면 얻는 이점이 큽니다.
- 안전함: 실수로 운영 서버 DB를 날리거나, API 키가 유출될 일이 사라집니다.
- 편리함: 개발할 땐 로컬 설정, 배포할 땐 배포 설정이 알아서 적용됩니다.
- 협업: 팀원마다 다른 설정을 .env나 local.py로 관리하기 쉬워집니다.
'장고' 카테고리의 다른 글
| [Django/DRF] 장고의 DRF 설계 튜토리얼 (0) | 2025.12.08 |
|---|---|
| [Django] 성능 최적화 : N + 1 문제를 prefetch_related로 해결하기 (0) | 2025.12.07 |