
필요한 파일 생성(프로젝트 루트 폴더 = 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()'FastAPI' 카테고리의 다른 글
| User model 생성 및 첫 DB migrations (0) | 2025.11.06 |
|---|---|
| DB 서버와 Redis 서버 설정 및 연결/프론트엔드 렌더링 (0) | 2025.11.05 |
| main.py 수정 및 Swagger 커스터마이징 (0) | 2025.11.05 |
| FastAPI 백엔드 개발 순서(Google AI Mode) (0) | 2025.11.05 |
| FastAPI+Svelte 시작 (0) | 2025.11.04 |