서버(Server)/장고 (Django)

Django 환경 변수 관리기

Wibaek 2025. 4. 6. 21:40
728x90

AS-IS

기존에는 django-environ을 이용하여 .env파일 하나로 환경변수를 관리했다.

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# 환경 변수 설정
env = environ.Env(DEBUG=(bool, True))
environ.Env.read_env(env_file=os.path.join(BASE_DIR, ".env"))

SECRET_KEY = env("DJANGO_SECRET_KEY")

django-environ

django-environ은 .env를 읽는것을 도와주고, 여러 부가적인 기능을 가지고 있지만, 동시에 여러 환경변수 파일을 읽는것이 어려웠다.

TO-DO

목표는 Next.js에서의 환경변수 처리처럼, .env, .env.local, .env.production, .env.production.local 등 다양한 파일을 통해서 개발/배포 환경을 분리하고, .local의 여부를 통해 공개해도 되는 변수와 secret 변수를 나누어 관리할 수 있게 하는 것이 목표이다.

이때 가능하면 코드 수정없이 서버 실행시 파라미터로 환경을 전달할 수 있게 하거나, 기본적으로 개발 환경으로 실행되고, 서버 실행시에는 Docker로 개발 환경임을 전달할 수 있게 하려한다.

python-dotenv

dotenv 라이브러리를 찾아보던중 우선 python-dotenv를 찾게 되었다. Github 스타수도 7.4k로 적지 않고, 유지보수도 최근(24년 7월)까지 잘 되는것으로 보였다.

python-dotenv

 

python-dotenv

python-dotenv python-dotenv reads key-value pairs from a .env file and can set them as environment variables. It helps in the development of applications following the 12-factor principles. Getting Started pip install python-dotenv If your application take

saurabh-kumar.com

GitHub - theskumar/python-dotenv: Reads key-value pairs from a .env file and can set them as environment variables. It helps in developing applications following the 12-factor principles.

 

GitHub - theskumar/python-dotenv: Reads key-value pairs from a .env file and can set them as environment variables. It helps in

Reads key-value pairs from a .env file and can set them as environment variables. It helps in developing applications following the 12-factor principles. - theskumar/python-dotenv

github.com

공식 문서 초반부에서 다음과 같이 여러 파일을 불러올 수 있는 예시를 보여준다.

import os
from dotenv import dotenv_values

config = {
    **dotenv_values(".env.shared"),  # load shared development variables
    **dotenv_values(".env.secret"),  # load sensitive variables
    **os.environ,  # override loaded values with environment variables
}

구현

ENVIRONMENT = os.environ.get("ENVIRONMENT", "development")

env = {
    **dotenv_values(".env"),
    **dotenv_values(".env.local"),
}

if ENVIRONMENT == "production":
    env.update(dotenv_values(".env.production"))
    env.update(dotenv_values(".env.production.local"))
else:
    env.update(dotenv_values(".env.development"))
    env.update(dotenv_values(".env.development.local"))

위와 같이 os 환경변수로 ENVIORNMENT 값을 받아 현재 환경을 알 수 있게 했고, 기본적으로 개발모드, 외에는 Docker에서 환경변수를 전해줄 수 있게 구현했다.

추가적으로 .env와 .env.local은 공통적으로 불러오고, 각 환경에 맞는 환경변수를 추가적으로 가져오게 했다.

이때 .local을 더 늦게 가져와 더 우선순위를 높게 했는데, 이는 더 세부적인것에 우선순위를 높게 하기 위함으로, Next.js의 환경변수 로드 순서와 같은 방식으로 환경변수 값을 적용할 수 있다.

Next.js env(환경 변수) 정리

 

Next.js env(환경 변수) 정리

환경 변수

velog.io

 

이렇게 가져온 값을 다음과 같이 불러온다.

DEBUG = env.get("DJANGO_DEBUG", "False") == "True"
SECRET_KEY = env.get("DJANGO_SECRET_KEY", "")

또한 배포시 사용하는 도커파일에 프로덕션 환경임을 알려주는 값을 전달해준다. 값을 전달해주지 않으면 기본값으로 개발환경으로 설정된다.

ENV ENVIRONMENT=production

완성

이런 방식으로 환경변수 파일을 분리하여 관리할 수 있게 되었다.

아래는 12 Factor App이라는 문서로, 하나의 코드베이스에서 환경변수 분리를 통해 개발, 테스트, 배포등 다양하게 환경을 구성하는 방법론을 설명한다.

The 12-Factor App

The Twelve-Factor App (한국어)

 

The Twelve-Factor App (한국어)

배경 이 문서에 기여한 사람들은 수백개 앱의 개발과 배포에 직접 참여했으며, Heroku 플랫폼을 통해서 방대한 앱의 개발, 운영, 확장을 간접적으로 관찰했다. 이 문서는 실제로 쓰이는 다양한 SaaS

www.12factor.net

 

728x90