본문 바로가기

FastAPI

앱 개발을 위한 설정파일 만들기

 

필요한 파일 생성(프로젝트 루트 폴더 = Svelte_0.0.2)

     1. Svelte_0.0.2/.env 

     2. Svelte_0.0.2/app/core/settings.py

 

I. .env 파일 작성

개발환경과 배포환경에 따른 환경변수들을 저장한다. 우선 데이터베이스 연결을 위한 것들을 작성한다. 추후에 개발 과정에 추가되는 환경변수들을 저장하면 된다. 

# Svelte_0.0.2/.env (main.py와 같은 위치)

# 배포시에 주석해제
#APP_ENV = production

APP_NAME = Deployed APP
APP_VERSION = Deployed V_0
APP_DESCRIPTION = FastAPI_Svelte를 이용해 개발한 프로젝트에 대한 배포판

DEBUG_TRUE = true
DEBUG_FALSE = false
# production시 DEBUG_FALSE = false

DB_TYPE = mysql
DB_DRIVER = aiomysql

DEV_DB_NAME = advanced_db
DEV_DB_HOST = localhost
DEV_DB_PORT = 3306
DEV_DB_USER = root
DEV_DB_PASSWORD = <비빌번호>


PROD_APP_NAME = Deployed APP
PROD_APP_VERSION = Deployed V_0
PROD_APP_DESCRIPTION = FastAPI_Svelte를 이용해 개발한 프로젝트에 대한 배포판

PROD_DB_NAME = advanced_db
PROD_DB_HOST = <Mysql서버 IP>
PROD_DB_PORT = <Mysql서버 port>
PROD_DB_USER = root
PROD_DB_PASSWORD = <비밀번호>

SECRET_KEY = 7b6b057992ae6b79d3fecc6d3ebe40626ef4e2ed8221303202e60fdff204d2a7d334b0

 

SECRET_KEY는 python shell에서 secrets 라이브러리를 사용하여 아래와 같이 생성하면 된다.

(.venv) PS D:\Python_FastAPI\JumpToFastAPI_Svelte\Svelte_0.0.1> python
Python 3.13.5 (tags/v3.13.5:6cb20a2, Jun 11 2025, 16:15:46) [MSC v.1943 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import secrets
>>> secrets.token_hex(35)
'7b6b057992ae6b79d3fecc6d3ebe40626ef4e2ed8221303202e60fdff204d2a7d334b0'

 

II. settings.py 작성

기본 세팅에 필요한 설정들을 담아 놓는 파일이다. 개발과정에 계속 추가 될 수 있다. Pydantic BaseSettings + lru_cache로 한 번만 로드/재사용되도록 정리했고, initialize_app()에서 get_settings()를 한 번만 호출하도록 하였다.

 

.env파일에 저장하는 환경변수 이외의 보안을 위해 숨길 필요가 없는 변수들을 저장하거나, .env파일에서 가져오는 값들을 가져올 수 있도록 python-dotenv 라이브러리를 설치했다.

# .env파일을 읽어들일 때 필요한 라이브러리
pip install python-dotenv

# settings.py 파일에 BaseSettings를 상속받기 위해 필요하다.
pip install pydantic-settings
# Svelte_0.0.2/app/core/settings.py

import os
from functools import lru_cache
from typing import List, Optional

from pydantic import Field, model_validator
from pydantic_settings import BaseSettings, SettingsConfigDict

class Settings(BaseSettings):
"""여기에서 값이 비어있는 것은 .env 파일에서 채워진다.
    그 값은 override 되지 않는다. 흐름상 그럴것 같기는 한데...???
    최종적으로 .env에 설정된 값으로 채워져 버리는 것인것 같다."""
    APP_ENV: str = "development"
    APP_NAME: str = "Svelte_FastAPI"
    APP_VERSION: str = "0.0.2"
    APP_DESCRIPTION: str = "FastAPI_Svelte을 이용한 프로젝트 개발"

    DEBUG: bool = False

    # 기본값은 두지 않고 .env에서 읽히도록 둡니다.
    DB_TYPE: str
    DB_DRIVER: str

    SECRET_KEY: Optional[str] = None

    model_config = SettingsConfigDict(
        env_file=".env",
        env_file_encoding="utf-8",
        extra="ignore",
        case_sensitive=False,
    )


class DevSettings(Settings):
    DEBUG: bool = Field(..., validation_alias="DEBUG_TRUE")

    DB_NAME: str = Field(..., validation_alias="DEV_DB_NAME")
    DB_HOST: str = Field(..., validation_alias="DEV_DB_HOST")
    DB_PORT: str = Field(..., validation_alias="DEV_DB_PORT")
    DB_USER: str = Field(..., validation_alias="DEV_DB_USER")
    DB_PASSWORD: str = Field(..., validation_alias="DEV_DB_PASSWORD")


class ProdSettings(Settings):
    APP_NAME: str = Field(..., validation_alias="PROD_APP_NAME")
    APP_VERSION: str = Field(..., validation_alias="PROD_APP_VERSION")
    APP_DESCRIPTION: str = Field(..., validation_alias="PROD_APP_DESCRIPTION")

    DB_NAME: str = Field(..., validation_alias="PROD_DB_NAME")
    DB_HOST: str = Field(..., validation_alias="PROD_DB_HOST")
    DB_PORT: str = Field(..., validation_alias="PROD_DB_PORT")
    DB_USER: str = Field(..., validation_alias="PROD_DB_USER")
    DB_PASSWORD: str = Field(..., validation_alias="PROD_DB_PASSWORD")

    # 운영에서는 SECRET_KEY 필수
    @model_validator(mode="after")
    def ensure_secret_key(self):
        if not self.SECRET_KEY or len(self.SECRET_KEY) < 16:
            raise ValueError("In production, SECRET_KEY must be set and sufficiently long.")
        return self


@lru_cache(maxsize=1)
def get_settings() -> Settings:
    print("1. get_settings... Only One")
    # model_config의 env_file 설정만으로도 충분하지만, 아래 호출이 있어도 문제는 없습니다.
    try:
        from dotenv import load_dotenv
        load_dotenv(".env", override=False, encoding="utf-8")
    except Exception as e:
        print(f"load_dotenv error: {e}")
        # python-dotenv 미설치 등인 경우에도 설정 로딩은 pydantic-settings가 처리하므로 무시 가능
        pass

    app_env = os.getenv("APP_ENV", "development").strip().lower()
    if app_env == "production":
        return ProdSettings()
    return DevSettings()

CONFIG = get_settings()