FastAPI์ "Dependency Injection"์ FastAPI ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค. Dependency Injection์ ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ์ด๋ ์ฝ๋์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์ ์ง๋ณด์์ ํ ์คํธ๊ฐ ์ฉ์ดํ๋๋ก ๋์์ฃผ๋ ์ค๊ณ ํจํด์ ๋๋ค. FastAPI์์๋ ์ด๋ฅผ ํตํด ๋์ฑ ๊น๋ํ๊ณ ํจ์จ์ ์ผ๋ก API๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.(์ฌ์ฌ์ฉ์ฑ, ํจ์จ์ฑ ์ฆ๊ฐ์ ํจ๊ณผ)
Dependency Injection์ ๊ธฐ๋ณธ ์๋ฆฌ
FastAPI์์ Dependency Injection์ ์ฌ์ฉํ๋ฉด, ํจ์๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ , FastAPI๊ฐ ์คํ ์๊ฐ(runtime)์ ์์กด์ฑ์ ์ฃผ์ ํด์ค๋๋ค. ์ด๋ก์จ, ํ์ํ ๊ฐ์ฒด๋ ์ค์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฆ, ํ์ํ ๊ธฐ๋ฅ์ ์ง์ ์ ์ธํ์ฌ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์ ์ ์์ฑ๊ณผ ๋ฐํ(close)์ ์๋ํ
์ฌ์ฉ ๋ฐฉ๋ฒ
- ์์กด์ฑ ์์ฑ: ์์กด์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ํจ์๋ก ์ ์๋ฉ๋๋ค. ์ด ํจ์๋ ํ์ํ ๊ฐ์ฒด๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.
- contextlib๋ณด๋ค๋ Depends๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ๊ฒฐํ๋ค.
from fastapi import Depends, FastAPI
def get_db():
db = "DB Connection"
try:
yield db
finally:
db.close()
- ๊ฒฝ๋ก ์์ ์ ์์กด์ฑ ์ฃผ์ : Depends๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก ์์ ํจ์์ ์์กด์ฑ์ ์ฃผ์ ํฉ๋๋ค. FastAPI๋ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ด ์์กด์ฑ ํจ์๋ฅผ ํธ์ถํ๊ณ , ํจ์์์ ๋ฐํํ ๊ฐ์ ๊ฒฝ๋ก ์์ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค.
@app.get("/items/")
async def read_items(db = Depends(get_db)):
return {"db": db}
- ํ์ ์์กด์ฑ: ์์กด์ฑ ํจ์ ๋ด์์ ๋ค๋ฅธ ์์กด์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ๊ณ์ธต์ ์์กด์ฑ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ์์กด์ฑ์ ์ฌ์ฌ์ฉ๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ: FastAPI๋ ์์กด์ฑ์ด ์ฌ๋ฌ ๊ฒฝ๋ก์์ ์ฌ์ฌ์ฉ๋ ๋ ๋ง๋ค ๋งค๋ฒ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ํ์ํ๋ค๋ฉด, ํน์ ๊ฒฝ๋ก์์๋ง ์์กด์ฑ์ ๋์์ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค.
- ์๋์ผ๋ก ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์์กด์ฑ: ์์กด์ฑ ํจ์์์ ์ง์ ์์ฒญ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฑฐ๋, Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๊ฒ์ฆํ๊ณ ๋ณํํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ํ์ฉ ๋ฐฉ๋ฒ
https://fastapi.tiangolo.com/tutorial/dependencies/