본문 바로가기
장고

[Django] settings.py 리팩토링하기

by mangji12 2025. 12. 8.

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_KEYAPI_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(),
}

📝 결론

처음엔 귀찮아 보일 수 있지만, 이렇게 한 번 세팅해 두면 얻는 이점이 큽니다.

  1. 안전함: 실수로 운영 서버 DB를 날리거나, API 키가 유출될 일이 사라집니다.
  2. 편리함: 개발할 땐 로컬 설정, 배포할 땐 배포 설정이 알아서 적용됩니다.
  3. 협업: 팀원마다 다른 설정을 .env나 local.py로 관리하기 쉬워집니다.
반응형