๐ ์ฝ 2๋ถ ์ฝ๋ ๋ฐ ์์๋ฉ๋๋ค
์ด์ ๊ธ ๋ณด๊ธฐ(FastAPI์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์๋ฒฝ ์ดํด)
โ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ถํฐ Depends
ํ์ฉ๊น์ง, ์ค์ ์ฌ๋ก ์ค์ฌ ์ค๋ช
โ์ฝ๋๊ฐ ์ปค์ง์๋ก ์์กด์ฑ์ ๊ด๋ฆฌ๊ฐ ์๋๋ผ ํต์ ์ ๋์์ด๋ค.โ
FastAPI๋ ์๊ท๋ชจ ์ค์ต๋ถํฐ ๋ํ ์๋น์ค ์ํคํ ์ฒ๊น์ง ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค. ๊ทธ ํต์ฌ์ด ๋ฐ๋ก **์ํ ๊ด๋ฆฌ(State Management)**์ **์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)**์ด๋ค.
โ ์ ์ญ ์ํ ๊ด๋ฆฌ๋?
FastAPI๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํธ๋ฅผ ์ ์ํ๋ค. ์ด ๊ตฌ์กฐ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅด์ง๋ง, ๋๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ฌ์ฉํ ์ ์๋ ๊ณตํต ์์, ์๋ฅผ ๋ค์ด DB ์ฐ๊ฒฐ์ด๋ ์ค์ ๊ฐ์ฒด ๊ฐ์ ๊ฒ์ ์ ์ฅํด๋ ํ์๊ฐ ์๋ค.
1. ์: ์ ์ญ ๋ณ์ ์ฌ์ฉ
from fastapi import FastAPI
app = FastAPI()
counter = 0 # ์ ์ญ ๋ณ์
@app.get("/increase")
def increase():
global counter
counter += 1
return {"counter": counter}
counter
๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๋์ ์ ์ง๋๋ค.- ํ์ง๋ง ์ด ๋ฐฉ์์ ๋ฉํฐ์ค๋ ๋/๋ฉํฐํ๋ก์ธ์ค ํ๊ฒฝ์์๋ ์์ ์ ์ด์ง ์๋ค.
2. FastAPI ๋ด๋ถ ์ํ ์ ์ฅ์ ํ์ฉ
FastAPI์ app.state
์์ฑ์ ์ฌ์ฉํ๋ฉด ์ ์ญ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ ์ ์๋ค.
@app.on_event("startup")
def startup_event():
app.state.message = "Hello, FastAPI!"
@app.get("/message")
def read_message():
return {"message": app.state.message}
startup_event
๋ ์๋ฒ ์คํ ์ ํ ๋ฒ๋ง ํธ์ถ๋จapp.state
๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ ๊ทผ ๊ฐ๋ฅํจ- ์ด๋ฐ ๋ฐฉ์์ผ๋ก DB ์ฐ๊ฒฐ ๊ฐ์ฒด๋ ์ ์ฅํ ์ ์์
๐งฉ ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ๊ฐ๋
Dependency Injection์ด๋, ํ์ํ ์์(๊ฐ์ฒด, ํจ์, ํด๋์ค ๋ฑ)์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋ ์์กด์ฑ์ ์ค์ด๋ ํจํด์ด๋ค.
FastAPI๋ Depends()
๋ฅผ ํตํด ์ด ๊ธฐ๋ฅ์ ์์ฃผ ๊น๋ํ๊ฒ ๊ตฌํํ๋ค.
๐ง Depends
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
Depends
๋ ํ๋ผ๋ฏธํฐ์ฒ๋ผ ๋ณด์ด์ง๋ง, FastAPI๊ฐ ์๋์ผ๋ก ํด๋น ํจ์๋ฅผ ํธ์ถํด์ ๋ฐํ๊ฐ์ ์ฃผ์
ํด์ค๋ค.
1. ์์: ๊ณตํต ์ธ์ฆ ๋ก์ง ์ฌ์ฌ์ฉ
from fastapi import Depends, HTTPException
def verify_token(token: str = "my-token"):
if token != "my-token":
raise HTTPException(status_code=401, detail="Unauthorized")
return token
@app.get("/secure-data")
def read_secure_data(token: str = Depends(verify_token)):
return {"data": "This is secured"}
verify_token()
ํจ์๊ฐ ๋จผ์ ์คํ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐtoken
ํ๋ผ๋ฏธํฐ๋ก ์ฃผ์ ๋จ- ์คํจ ์ ์์ธ๋ฅผ ๋ฐ์์์ผ ๋ผ์ฐํธ ์ ๊ทผ์ ์ฐจ๋จํจ
- ์ด ๊ตฌ์กฐ๋ ์ธ์ฆ/๊ถํ ๊ฒ์ฌ, ๋ก๊ทธ ์ฒ๋ฆฌ, DB ์ฐ๊ฒฐ ์ฃผ์ ๋ฑ์ ํ์ฉ ๊ฐ๋ฅ
๐ ๋ค์ํ DI ์์
2. ํ๋ผ๋ฏธํฐ ์๋ ์์กด์ฑ
def get_settings(env: str = "dev"):
return {"env": env}
@app.get("/settings")
def read_settings(settings: dict = Depends(get_settings)):
return settings
- ์์กด์ฑ ํจ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ์ ์๊ณ , FastAPI๋ ์์์ ๊ฐ์ ๋ฐ์ธ๋ฉํด์ค๋ค.
3. ํด๋์ค ๊ธฐ๋ฐ ์์กด์ฑ
ํด๋์ค๋ฅผ ์ด์ฉํ๋ฉด ๋ ๊ฐ๋ ฅํ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
class Config:
def __init__(self):
self.db_url = "sqlite:///./test.db"
self.debug = True
def get_config():
return Config()
@app.get("/config")
def read_config(config: Config = Depends(get_config)):
return {"db_url": config.db_url, "debug": config.debug}
- ๊ฐ์ฒด๋ฅผ ํ ๋ฒ ์์ฑํ๊ณ ์ฌ์ฌ์ฉํ๊ฑฐ๋, ํ์ ์ ์๋ก ๋ง๋ค์ด ์ค ์๋ ์๋ค.
- ๋ณดํต ์ด ํจํด์ ์ค์ , DB ์ปค๋ฅ์ , ์๋น์ค ๊ฐ์ฒด ๋ฑ์์ ์ฌ์ฉํ๋ค.
๐ ์์กด์ฑ์ ์ค์ฒฉ๊ณผ ์ฌ๊ท ํธ์ถ
์์กด์ฑ์ ์ค์ฒฉ ํธ์ถ๋ ๊ฐ๋ฅํ๋ค. ์ด๊ฑด ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๋งค์ฐ ์ ์ฉํ ํจํด์ด๋ค.
def get_db():
db = "DB ์ปค๋ฅ์
๊ฐ์ฒด" # ์์
return db
def get_user(db = Depends(get_db)):
return {"user_id": 123, "db": db}
@app.get("/me")
def read_me(user = Depends(get_user)):
return user
read_me()
๋get_user()
๋ฅผ ๋จผ์ ํธ์ถํ๊ณ , ๊ทธ ๋ด๋ถ์์get_db()
๋ฅผ ํธ์ถํ๋ค.- FastAPI๊ฐ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์๋ ๋ถ์ํด์ ์คํ ์์๋ฅผ ์ ํด์ค๋ค.
- ์ด๋ฐ ๊ธฐ๋ฅ์ ํ ํ๋ ์์ํฌ์์ ์ง์ ๊ตฌํํ๊ธฐ ๊ฝค ๋ฒ๊ฑฐ๋กญ๋ค.
๐พ ์ ์ญ DI๋ก ์ ํํ๋ ํ
๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ Depends
๋ฅผ ์ ์ญ ๋ชจ๋์ฒ๋ผ ์ ๋ฆฌํด ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
dependencies.py
ํ์ผ ์์ฑ- ๊ณตํต ์์กด์ฑ ํจ์๋ฅผ ์ ์
- ๊ฐ ๋ผ์ฐํธ์์ import ํ
Depends
๋ก ์ฃผ์
# dependencies.py
def get_logger():
return {"log": "Logging object"}
# main.py
from dependencies import get_logger
@app.get("/log")
def read_log(log = Depends(get_logger)):
return log
์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ์ฌ๋ผ๊ฐ๊ณ , ํ ์คํธ๋ ํจ์ฌ ์ฌ์์ง๋ค.
๐งพ ๋ง๋ฌด๋ฆฌ ์์ฝ
FastAPI์ ์ํ ๊ด๋ฆฌ์ ์์กด์ฑ ์ฃผ์ ์ ๊ท๋ชจ ์๋ API ์๋ฒ ๊ฐ๋ฐ์ ํ์์ ์ธ ์์๋ค. ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฑธ ๋์ด์, ๊ณตํต ๋ก์ง์ ์์ ํ๊ณ ๊น๋ํ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํด์ค๋ค.
๊ธฐ๋ฅ | ์ค๋ช | ์ค์ ์ |
---|---|---|
์ ์ญ ์ํ ๊ด๋ฆฌ | ์ฑ ์ ์ฒด์์ ๊ณต์ ํ๋ ๋ฐ์ดํฐ ์ ์ฅ | DB ์ฐ๊ฒฐ, ์ค์ ๊ฐ์ฒด ๋ฑ |
Depends() | ํจ์/๊ฐ์ฒด ์ฃผ์ ์ ์๋ ์ฒ๋ฆฌ | ์ธ์ฆ, ๋ก๊น , ์๋น์ค ๊ณ์ธต |
์ค์ฒฉ DI | ์์กด์ฑ์ ๋ ๋ค๋ฅธ ์์กด์ฑ์กด์ฑ์ ๋ ๋ค๋ฅธ ์์กด์ฑ์ผ๋ก ์ฌ๊ท์ ๊ตฌ์ฑ | get_user(Depends(get_db)) |
์ด์ ์ด ๊ตฌ์กฐ๋ฅผ ์ตํ๋ฉด, ์ค๋ฌด์์ ์์ญ ๊ฐ ๋ผ์ฐํธ๋ฅผ ๊ตฌ์ฑํ๋ฉด์๋ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๋ฆฌ์์ค๋ฅผ ์ฃผ์ ํ๊ณ ์ ์ง๋ณด์๋ฅผ ํธํ๊ฒ ํ ์ ์๋ค.
FastAPI ๊ณต์ ๋ฌธ์ : https://fastapi.tiangolo.com/ko/
