환경별로 여러 개의 .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-dotenvload_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 애플리케이션에서 사용할 수 있습니다.