๐Ÿงฉ BE

Depends

Date
2026/03/23
Category
Web
Tag
FastAPI
Detail

Dependency Injection

์˜์กด์„ฑ ์ฃผ์ž…์€ ํ”„๋กœ๊ทธ๋žจ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์„œ๋กœ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ๋ณดํ†ต ์„œ๋น„์Šค ๋กœ์ง์€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง๊ณผ ๊ฐ™์€ ํŠน์ • ๋ชจ๋“ˆ์— ์˜์กดํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ์„ ์ œํ•œํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์˜์กด์„ฑ ์ฃผ์ž…์€ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด ๋Œ€์‹  ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋„๋ก ํ•˜์—ฌ ์œ ์—ฐ์„ฑ์„ ๋†’์ธ๋‹ค.

Depends()

FastAPI์—์„œ๋Š” Depends() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด DIP๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
from typing import Annotated from fastapi import Depends, FastAPI app = FastAPI() async def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100): return {"q": q, "skip": skip, "limit": limit} @app.get("/items/") async def read_items(commons: Annotated[dict, Depends(common_parameters)]): return commons @app.get("/users/") async def read_users(commons: Annotated[dict, Depends(common_parameters)]): return commons
Python
๋ณต์‚ฌ
๋งŒ์•ฝ read_users ํ•จ์ˆ˜์—์„œ Depends ์—†์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๊ทธ๋Œ€๋กœ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด, common_parameters ๋‚ด๋ถ€์˜ ๋ฆฌํ„ด ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ read_usersํ•จ์ˆ˜์˜ ๋‚ด์šฉ๋„ ๋ฐ”๋€Œ์—ˆ์„ ๊ฒƒ์ด๋‹ค.
ํ•˜์ง€๋งŒ, ์ด๋ฅผ ๊ตฌํ˜„์ฒด์—๋งŒ ์˜์กดํ•˜๊ฒŒ๋” ์˜์กด์„ฑ์„ ์ฃผ์ž…์‹œ์ผฐ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต์ด ์ค„๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง„๋‹ค๋Š” ์žฅ์ ์ด ์ƒ๊ธด๋‹ค.

ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ

๊ธฐ์กด์— ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์ง€๋งŒ, Dependsํ•จ์ˆ˜ ๋‚ด์— ์ธ์ž๋กœ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.
from typing import Annotated from fastapi import Depends, FastAPI app = FastAPI() fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}] class CommonQueryParams: def __init__(self, q: str | None = None, skip: int = 0, limit: int = 100): self.q = q self.skip = skip self.limit = limit @app.get("/items/") async def read_items(commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]): response = {} if commons.q: response.update({"q": commons.q}) items = fake_items_db[commons.skip : commons.skip + commons.limit] response.update({"items": items}) return response
Python
๋ณต์‚ฌ
FastAPI ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ "์ธ์Šคํ„ด์Šค"๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ธ์Šคํ„ด์Šค๊ฐ€ commonsํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค.
์ด๋•Œ,ย commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]ย ์ด ๋ถ€๋ถ„์—์„œ CommonQueryParams ์˜์กด์„ฑ์ด ์ค‘๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ•์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
commons: Annotated[CommonQueryParams, Depends()]
โ†’ ์–ด๋…ธํ…Œ์ด์…˜ ์—†๋Š” ๋ฒ„์ „: commons: CommonQueryParams = Depends()
์˜์กด์„ฑ์„ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ๋‚ด๋ถ€์— ์ „์ฒด ํด๋ž˜์Šค๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ Depends()๋ฅผ ์“ฐ๋Š”๊ฑธ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference