기존 상태
기존에는
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
를 읽는것을 도와주고, 여러 부가적인 기능을 가지고 있지만, 동시에 여러 환경변수 파일을 읽는것이 어려웠다.목표
목표는 Next.js에서의 환경변수 처리처럼,
.env
, .env.local
, .env.production
, .env.production.local
등 다양한 파일을 통해서 개발/배포 환경을 분리하고, .local
의 여부를 통해 공개해도 되는 변수와 secret 변수를 나누어 관리할 수 있게 하는 것이 목표이다.이때 가능하면 코드 수정없이 서버 실행시 파라미터로 환경을 전달할 수 있게 하거나, 기본적으로 개발 환경으로 실행되고, 서버 실행시에는 Docker로 개발 환경임을 전달할 수 있게 하려한다.
python-dotenv
dotenv 라이브러리를 찾아보던중 우선
python-dotenv
를 찾게 되었다. Github 스타수도 7.4k로 적지 않고, 유지보수도 최근(24년 7월)까지 잘 되는것으로 보였다.공식 문서 초반부에서 다음과 같이 여러 파일을 불러올 수 있는 예시를 보여준다.
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의 환경변수 로드 순서와 같은 방식으로 환경변수 값을 적용할 수 있다.이렇게 가져온 값을 다음과 같이 불러온다.
DEBUG = env.get("DJANGO_DEBUG", "False") == "True" SECRET_KEY = env.get("DJANGO_SECRET_KEY", "")
또한 배포시 사용하는 도커파일에 프로덕션 환경임을 알려주는 값을 전달해준다. 값을 전달해주지 않으면 기본값으로 개발환경으로 설정된다.
ENV ENVIRONMENT=production
완성
이런 방식으로 환경변수 파일을 분리하여 관리할 수 있게 되었다.
아래는 12 Factor App이라는 문서로, 하나의 코드베이스에서 환경변수 분리를 통해 개발, 테스트, 배포등 다양하게 환경을 구성하는 방법론을 설명한다.