๐ฏ ์ธ์ 3 ์ฃผ์ : ํ๊ฒฝ๋ณ์์ ์ค์ ๊ด๋ฆฌ
๐ ํต์ฌ ๊ฐ๋
ํ์ต
1๏ธโฃ ํ๊ฒฝ๋ณ์ (Environment Variables)
์ ์: ์ด์์ฒด์ ์ ์ ์ฅ๋๋ ์ค์ ๊ฐ
๋ชฉ์ : ์ฝ๋์ ์ค์ ๋ถ๋ฆฌ๋ก ๋ณด์์ฑ ํฅ์
์ค์ํ ๋น์ : ์ง ์ด์ ๋ฅผ ์์ ํ ์๋์ ๋ณด๊ดํ๋ ๊ฒ
๋ณด์ ๋ ๋ฒจ๋ณ ๋ถ๋ฅ:
๐ด ๋์ ๋ณด์: API ํค, ๋น๋ฐ๋ฒํธ โ ์ ๋ ์ฝ๋์ ์ฐ์ง ์์
๐ก ์ค๊ฐ ๋ณด์: ํธ์คํธ, ํฌํธ โ ๊ธฐ๋ณธ๊ฐ ์ ๊ณตํ๋ ํ๊ฒฝ๋ณ์๋ก ๋ฎ์ด์ฐ๊ธฐ ๊ฐ๋ฅ
2๏ธโฃ Pydantic & BaseSettings
Pydantic: ๋ฐ์ดํฐ ๊ฒ์ฆ ์๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
BaseSettings: ํ๊ฒฝ๋ณ์ ์๋ ๋งคํ + ํ์
๊ฒ์ฆ
๋์์๋ฆฌ: db_password โ DB_PASSWORD ํ๊ฒฝ๋ณ์ ์๋ ์ฐพ๊ธฐ
๐ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌํ ๋ถ์
pathlib
์ฉ๋: ํ๋์ ํ์ผ ๊ฒฝ๋ก ์ฒ๋ฆฌ
ํต์ฌ ๊ธฐ๋ฅ: Path(file).parent.parent.resolve() - ํ๋ก์ ํธ ๋ฃจํธ ์ฐพ๊ธฐ
์ฅ์ : ์ง๊ด์ ์ธ / ์ฐ์ฐ์ ์ฌ์ฉ
typing
์ฉ๋: ํ์
ํํธ ์ ๊ณต
Optional[str]: str ๋๋ None ๊ฐ๋ฅ
์ฅ์ : IDE ์๋์์ฑ, ํ์
์๋ฌ ์ฌ์ ๋ฐ๊ฒฌ
pydantic_settings
์ฉ๋: ํ๊ฒฝ๋ณ์ ์๋ ๋ก๋ฉ + ๋ฐ์ดํฐ ๊ฒ์ฆ
BaseSettings ํน์ง:
ํ๊ฒฝ๋ณ์ ์ด๋ฆ ์๋ ๋ณํ (snake_case โ UPPER_CASE)
ํ์
์๋ ๋ณํ ("3306" โ 3306)
.env ํ์ผ ์๋ ๋ก๋ฉ
๐ก ์ค๋ฌด ์ธ์ฌ์ดํธ
ํ์
์ ํ ๊ฐ์ด๋๋ผ์ธ
str: ํธ์คํธ๋ช
, ๋น๋ฐ๋ฒํธ, ๊ฒฝ๋ก
int: ํฌํธ๋ฒํธ, ํ์์์, ๊ฐ์ (์ซ์ ๊ณ์ฐ ํ์)
bool: ๋๋ฒ๊ทธ ๋ชจ๋, ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ
๋ณด์ ๋ฒ ์คํธ ํ๋ํฐ์ค
python# โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ์
db_host: str = "localhost" # ๊ณต๊ฐ ์ ๋ณด โ ๊ธฐ๋ณธ๊ฐ ์ ๊ณต
db_password: str # ๋ฏผ๊ฐ ์ ๋ณด โ ๊ธฐ๋ณธ๊ฐ ์์
Pydantic ์ฐ์ ์์
ํ๊ฒฝ๋ณ์ ๊ฐ (์ต์ฐ์ )
.env ํ์ผ ๊ฐ
์ฝ๋์ ๊ธฐ๋ณธ๊ฐ (๋ฐฑ์
)