프로그래밍/Python

Pydantic.BaseSetting을 사용한 환경변수 관리

코줍 2025. 1. 26. 20:14

.env 파일은 중요한 설정과 변수들을 정의한다. DB 정보, URL, API Key 등과 같은 민감한 정보를 코드에 하드코딩하지 않고 관리할 수 있어 필수적인 파일이다.

그러나 개발⸰테스트⸰배포 환경이나 국가별로 설정이 달라야 하는 경우 여러 개의 .env 파일을 사용하는 일이 빈번하며, 이 과정에서 환경 변수가 누락되거나 잘못된 타입으로 정의될 경우, 예기치 않은 예외가 발생한다. 

 

실제로 회사에서도 .env파일 관리가 번거로운 탓에 휴먼에러로 인해서 돌아야 할 배치가 돌지 않는다거나, 특정 로직이 실행되지 않는 버그가 발생하기도 했다. 

 

이럴 때, 파이썬 환경에서는 Pydantic에서 제공하는 BaseSettings를 상속받아서 설정관련 변수들을 정의하면 위에서 말한 예외를 어느 정도 방지할 수가 있다. 

 

1. 타입 검증 및 자동변환

Pydantic.Basesettings를 사용하면, .env 파일에 정의된 값들을 자동으로 파싱하여 타입을 검증한다.

예를 들어, .env에 문자열로 설정된 DATABASE_PORT 값이 int로 변환되어야 한다면 아래와 같이 BaseSettings를 상속받아 처리해주면 된다. ( 타입오류 방지 )

from pydantic import BaseSettings

class Config(BaseSettings):
    DATABASE_PORT: int

    class Config:
        env_file = ".env"

 

2. 기본값 설정

Pydantic.Basesettings에서는 환경변수 값이 없을 경우에 기본값을 지정할 수 있다. Config 클래스를 만들어 기본값을 설정한다.

class Config(BaseSettings):
    DEBUG: bool = False  # .env에 값이 없어도 기본값은 False

    class Config:
        env_file = ".env"

 

3. 환경설정 통합관리

서버, 국가마다 개별적으로 관리하는 환경변수도 있지만, 통합으로 관리해야하는 경우가 사실 대부분이다.

이 때, Config 클래스를 사용하면, 환경변수 뿐만 아니라 환경변수와 관련된 여러 설정들 까지 통합으로 관리할 수 있다. 

DB URL, 보안키, 로깅 레벨 등 

class Config(BaseSettings):
    DATABASE_URL: str
    SECRET_KEY: str
    LOG_LEVEL: str = "INFO"  # 기본값을 지정해줌

    class Config:
        env_file = ".env"

 

이렇게 사용했을 때, 한 파일에서 관리하니까 편하기도 하고, 코드상으로도 환경변수 접근할 때 꽤 직관적이다라는 느낌을 크게 받았다.

 

4. 유효성 검사

Pydantic.Basesettings 환경변수들이 올바른 형식인지 자동으로 유효성 검사를 해줄 수 있다.

사실 이거 하나 때문에 쓴다고 해도 과언이 아니다.

초기에 오류를 잡을 수 있기 때문에 두 번, 세 번 일할 상황을 줄여주어 안정성이 높아짐을 체감했던 부분이다.

from pydantic import BaseSettings, validator

class Config(BaseSettings):
    SECRET_KEY: str

    @validator("SECRET_KEY")
    def validate_secret_key(cls, v):
        if len(v) < 16:
            raise ValueError("SECRET_KEY must be at least 16 characters long")
        return v

    class Config:
        env_file = ".env"

 

 

Pydantic을 API 작업에서 요청데이터 검증 하거나 응답데이터 구조화 할때나 썼었는데, 

유효성 검증이라는 강점 덕분에 앞서 말했던 것처럼 환경변수 관리에도 용이하게 쓸 수 있다는 걸 알아보았다.