FastAPI 프로젝트에 Pydantic BaseSettings로 환경 변수 관리 개선하기

문제 상황

사내 FastAPI 프로젝트에서 환경 변수를 python-dotenv로 관리하고 있었다. 코드 곳곳에서 os.getenv()로 값을 가져오다 보니 타입 체크가 불가능하고, 필수 값 누락을 런타임에 발견하는 일이 잦았다.

# 기존 방식
DATABASE_URL = os.getenv("DATABASE_URL")
MAX_CONNECTIONS = int(os.getenv("MAX_CONNECTIONS", "10"))

Pydantic BaseSettings 도입

Pydantic v1.8부터 제공하는 BaseSettings를 활용해 환경 변수를 클래스로 관리하도록 변경했다.

from pydantic import BaseSettings, PostgresDsn

class Settings(BaseSettings):
    database_url: PostgresDsn
    max_connections: int = 10
    redis_host: str
    debug: bool = False
    
    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"

settings = Settings()

개선 효과

타입 안정성 확보
환경 변수가 자동으로 선언된 타입으로 변환된다. int, bool 등의 변환을 직접 할 필요가 없다.

필수 값 검증
기본값이 없는 필드는 자동으로 필수가 된다. 앱 시작 시 누락된 환경 변수가 있으면 명확한 에러 메시지와 함께 실행이 중단된다.

IDE 자동완성
settings.database_url처럼 접근하면 IDE에서 자동완성이 되고, 오타를 사전에 잡을 수 있다.

주의점

.env 파일은 개발 환경에서만 사용하고, 프로덕션에서는 실제 환경 변수로 주입해야 한다. Docker나 k8s ConfigMap을 통해 관리하는 것을 권장한다.

환경 변수가 많아지면 Settings 클래스를 용도별로 분리하는 것도 고려할 만하다.

FastAPI 프로젝트에 Pydantic BaseSettings로 환경 변수 관리 개선하기