나는 아래와 같이 코드를 작성했다.
# 환경 설정값을 중앙에서 관리하기 위한 파일
# .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에서 불러온 설정을 안전하게 사용할 수 있다.
대부분의 웹 개발은 웹앱에 필요한 구성(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을 정의합니다.

위에서 내가 작성한 코드에서
...은 tourapi_key가 필수필드라는 뜻이며
env="TOURAPI_KEY"은 .env 파일에 정의된 TOURAPI_KEY 값을 로드한다는 의미이다
따라서 합치면 .env 파일에 정의된 TOURAPI_KEY 값을 로드. 해당 키는 반드시 있어야 되며 없으면 에러 발생.