Fastapi 설정관리

seongmin0302·2025년 5월 4일

plango 프로젝트

목록 보기
6/10

나는 아래와 같이 코드를 작성했다.

# 환경 설정값을 중앙에서 관리하기 위한 파일
# .env 환경변수 파일과 연동되어, 설정값을 안전하고 효율적으로 다룰 수 있도록 한다.

from pydantic import BaseSettings, Field
from functools import lru_cache


class Settings(BaseSettings):
    # 기본 설정
    app_name: str = "Plango"
    debug: bool = True # FastAPI 실행 시 디버깅 정보 출력

    # TourAPI 설정
    tourapi_key: str = Field(..., env="TOURAPI_KEY") # .env 파일에 정의된 TOURAPI_KEY 값을 로드. 해당 키는 반드시 있어야 되며 없으면 에러 발생.
    tourapi_base_url: str = "https://apis.data.go.kr/B551011"

    # 외부 통신 설정
    timeout: int = 30  # 외부 API 호출시 타임아웃 시간

    class Config:
        env_file = ".env" # .env 파일에서 값을 로드하도록 지정
        env_file_encoding = "utf-8" # UTF-8로 인코딩된 파일을 읽게 설정.

# 매번 Settings()를 새로 만들면 비효율적이므로, lru_cache()로 1회 생성 후 재사용
# 다른 모듈에서 get_settings()를 호출하면 캐시된 동일한 설정 인스턴스를 받게 된다.
@lru_cache()
def get_settings():
    return Settings()

아래와 같이 사용 할 수 있다.

from config.settings import get_settings

settings = get_settings()
print(settings.tourapi_key)

서비스나 라우터 파일에서 get_settings()만 호출하면 .env에서 불러온 설정을 안전하게 사용할 수 있다.

BaseSettings

대부분의 웹 개발은 웹앱에 필요한 구성(Configuration)정보를 필요로 합니다. FastAPI에서는 내부적으로 pydantic 패키지를 사용하는데 이 패키지가 제공하는 모듈로 환경 변수를 읽어 settings를 관리합니다.

서브 클래스:
Settings는 BaseSettings를 상속한 하위 클래스(서브 클래스)

type hint:
APP_ENV: str에서 str은 타입 힌트

default 값:
= 'dev'는 APP_ENV의 기본값이 'dev'라는 뜻

클래스 속성:
APP_ENV는 Settings 클래스 안에 정의된 속성.

Settings()를 인스턴스화 한다
Settings()를 실행하면 하나의 객체(instance) 가 만들어진다.

Dotenv (.env)
Dotenv은 환경변수를 파일로 관리하여 쉽게 사용할 수 있게 하는 일반적인 패턴입니다. 이를 활용하면 환경별로 Config를 관리할 수 있습니다.

개발 서버에서는 APP_ENV=dev, 테스트에서는 APP_ENV=test, 실제 배포에서는 APP_ENV=prod 처럼 .env 파일만 바꾸면 코드 수정 없이 설정을 바꿀 수 있다.

.env 파일을 통해 개발용, 테스트용, 운영용 환경에 따라
설정값을 쉽게 바꿔가며 관리할 수 있다

Settings의 inner class로 Config를 선언하고 .env 파일이 위치한 값으로 env_file을 정의합니다.

Field

위에서 내가 작성한 코드에서
...tourapi_key가 필수필드라는 뜻이며
env="TOURAPI_KEY".env 파일에 정의된 TOURAPI_KEY 값을 로드한다는 의미이다

따라서 합치면 .env 파일에 정의된 TOURAPI_KEY 값을 로드. 해당 키는 반드시 있어야 되며 없으면 에러 발생.

profile
컴튜터공학과 재학중

0개의 댓글