환경별로 여러 개의 .env
파일을 사용하여 설정을 관리하는 방법.
예를 들어 .env.product
, .env.dev
, .env.dev.local
등 상황에 따라 다른 .env
파일을 로드하도록 설정할 수 있습니다.
이를 구현하기 위해 다음과 같은 방법을 사용할 수 있습니다:
1. 환경 변수를 통해 현재 환경 설정하기
먼저, 애플리케이션 실행 시 현재 환경을 지정하는 환경 변수를 설정합니다. 흔히 ENV
또는 APP_ENV
라는 이름을 사용합니다.
# 개발 환경에서 실행
export ENV=dev
uvicorn main:app
# 프로덕션 환경에서 실행
export ENV=product
uvicorn main:app
또는 ENV
변수를 명령과 함께 지정할 수도 있습니다:
ENV=dev uvicorn main:app
2. 환경에 따라 적절한 .env
파일 로드하기
python-dotenv
의 load_dotenv()
함수에 로드할 .env
파일의 경로를 지정하여, 환경별로 다른 설정을 로드할 수 있습니다.
import os
from dotenv import load_dotenv
from fastapi import FastAPI
# ENV 환경 변수에서 현재 환경을 가져옵니다. 기본값은 'dev'로 설정합니다.
ENV = os.getenv('ENV', 'dev')
# 로드할 .env 파일의 경로를 설정합니다.
dotenv_path = f'.env.{ENV}'
# 해당 .env 파일을 로드합니다.
load_dotenv(dotenv_path)
app = FastAPI()
@app.get("/")
async def read_root():
secret_key = os.getenv("SECRET_KEY")
return {"SECRET_KEY": secret_key}
이렇게 하면 ENV
변수에 따라 .env.dev
, .env.product
등의 파일을 로드하게 됩니다.
3. 로컬 설정 파일 지원하기
만약 환경별 설정에 추가로 로컬에서만 사용하고 싶은 설정이 있다면, 로컬 .env
파일을 추가로 로드할 수 있습니다. 예를 들어, 개발 환경에서만 사용하는 .env.dev.local
파일을 로드하려면:
import os
from dotenv import load_dotenv
from fastapi import FastAPI
ENV = os.getenv('ENV', 'dev')
dotenv_path = f'.env.{ENV}'
# 기본 환경 설정 로드
load_dotenv(dotenv_path)
# 로컬 환경 설정 로드 (파일이 존재하는 경우에만)
dotenv_local_path = f'.env.{ENV}.local'
if os.path.exists(dotenv_local_path):
load_dotenv(dotenv_local_path, override=True)
app = FastAPI()
여기서 override=True
옵션을 사용하여 이전에 로드된 변수들을 덮어쓰도록 합니다.
4. .env
파일 구성하기
각 환경별로 필요한 설정을 .env
파일에 작성합니다.
-
.env.dev
SECRET_KEY=dev_secret_key DATABASE_URL=sqlite:///./dev.db DEBUG=True
-
.env.product
SECRET_KEY=prod_secret_key DATABASE_URL=postgresql://user:password@host:port/dbname DEBUG=False
-
.env.dev.local
DATABASE_URL=sqlite:///./dev_local.db
DATABASE_URL
과 같은 설정은 로컬 개발 환경에 따라 다를 수 있으므로 .env.dev.local
에서 오버라이드할 수 있습니다.
5. .gitignore
에 로컬 .env
파일 추가하기
로컬 설정 파일은 버전 관리에서 제외하여 개인별 설정이 공유되지 않도록 합니다.
# .gitignore
.env.*.local
6. 실행 방법 정리
-
개발 환경에서 기본 설정으로 실행
ENV=dev uvicorn main:app
-
개발 환경에서 로컬 설정을 포함하여 실행 (로컬
.env
파일이 존재해야 함)ENV=dev uvicorn main:app
-
프로덕션 환경에서 실행
ENV=product uvicorn main:app
이러한 방식으로 환경별로 분리된 여러 개의 .env
파일을 관리하고, 상황에 따라 적절한 설정을 로드하여 FastAPI 애플리케이션에서 사용할 수 있습니다.