FastAPI 공식문서 따라하기[26] - Dependencies - First Steps
https://fastapi.tiangolo.com/tutorial/dependencies/ 공식문서 따라하는 글
☑️ Dependencies - FirstSteps
FastAPI
에서 제공하는 의존성 주입은 사용하기 편하고 다른 컴포넌트들을 통합하기 쉽게 만들어준다고 합니다.
☑️ What is “Dependency Injection”
- 의존성 주입이란, 코드를 선언할때는 동작하고 사용하기 위해서는 ‘의존성’이 필요합니다. 프레임워크나 시스템들은 의존성이 필요한 코드들에 자동으로 의존성을 넣어줍니다. 이것을 의존성 주입이라고 합니다.
공식문서에서는 이렇게 설명하고 있지만, 개념적으로 다른 부분이 많이 있습니다. DIP를 검색해보는걸 추천합니다.
의존성 주입을 통해 얻을 수 있는 강점으로는
- 로직을 공유할 수 있고
- 데이터베이스 커넥션을 공유할 수 있고
- 보안강화, 인증, 업무규칙 등에 사용할 수 있고
- 등..
을 가지고 있습니다.
☑️ First Steps
간단한 예제를 주는데 공식문서에서는 사용하기에 좋지 않은 쓸모없는 예제라고 합니다. 그냥 어떻게 동작하는지 알기 위해 넣어놨다고 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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: dict = Depends(common_parameters)):
return commons
@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
return commons
common_parametes
함수를 보면 skip
의 디폴트값은 0, limit
의 디폴트값은 100입니다.
Body
,Query
등과 같이 파라미터에 넣어줄 수 있는데, 이것들과 Depends
는 다르게 동작합니다.
이렇게 함수를 넣어줘도 경로 함수랑 똑같이 작동합니다.
즉, 해당 컨트롤러들은 q, skip, limit을 인자값으로 받아야합니다.
만약 q: str | None = None
에서 q: str
로 바꿔 필수로 인자로 받게 설정하고 요청을 보내면
이렇게 에러가 뜹니다.
즉, common: dict = Depends(common_parameters)
는 common_parameters
에 있는 인자값을 컨트롤러에서 받도록 합니다.
위 코드에서 새로운 요청이 들어오면 FastAPI
는 다음과 같은 처리를 합니다.
- 설정한
dependency
를 부르고 파라미터가 맞게 설정되었는지 확인합니다. - 해당 함수에서 설정한 리턴값을 가져옵니다.
- 그 리턴값을 인자로 설정한 값(
commons
)에 주입합니다.
이렇듯 items
나 users
컨트롤러는 common_parameters
에 의존하게 됩니다. 함수가 바뀌면 두 컨트롤러도 바뀌게 됩니다. 그리고 컨트롤러는 본인이 의존성을 주입하는 것이 아닌 함수가 의존성을 주입하게 되므로, 이를 DIP
의존성역전법칙을 만족하게 됩니다.
☑️ To async
or not to async
의존성 함수를 정의할 때 async def
나 def
를 사용할 수 있습니다.
async def
의 의존성함수로 def
를 지정할 수도 있고, def
의 의존성함수로 async def
를 지정할 수도 있습니다.
FastAPI
는 이를 감지하여 알아서 처리해줍니다.
공식문서에서는 자신들이 만든 시스템에 대해서 굉장히 자랑을 하고 있는데 궁금하면 읽어보시길 바랍니다.