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은 .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 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
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(환경 변수) 정리
환경 변수
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 (한국어)
배경 이 문서에 기여한 사람들은 수백개 앱의 개발과 배포에 직접 참여했으며, Heroku 플랫폼을 통해서 방대한 앱의 개발, 운영, 확장을 간접적으로 관찰했다. 이 문서는 실제로 쓰이는 다양한 SaaS
www.12factor.net
'서버(Server) > 장고 (Django)' 카테고리의 다른 글
Django 관련 읽어볼만한 글 (0) | 2025.04.10 |
---|---|
Django 테스트 개선기(의존성 벗어나기) (0) | 2024.03.24 |
Django에 redis 캐싱 적용하기 (0) | 2024.02.09 |
장고 필드의 null, blank에 대한 정리 (0) | 2023.08.18 |
[Django Basic] 4. Template (0) | 2023.08.03 |