의존성 주입은 코드의 재사용성을 높여주고, 반환하는 객체의 사용을 쉽게한다는 장점이 있습니다.
반환하는 객체의 사용을 쉽게하는 것은 객체가 생성이 되는 과정은 관심이 없고, 그냥 사용만 하고 싶을 때 유용합니다.
아래 main.py로 코드를 작성해 봅시다.
import uvicorn
from typing import Any, Optional, Dict
from fastapi import FastAPI, Depends
app = FastAPI()
items = ({"name":"Foo"}, {"name":"Bar"}, {"name":"Baz"})
# 홈페이지의 모든 글을 보는 것이 아닌 일부만 볼때, 10개 보기 20개 보기 등등
# q: 키워드 검색
async def func_params(
q: Optional[str] = None, offset: int = 0, limit: int = 100
) -> Dict[str, Any]:
return {"q": q, "offset": offset, "limit": limit}
# func_params를 DI(Depends)를 통해서 받는다.
# -> 새로운 글이 올라올때마다 update해주어야 하기 때문에
@app.get("/items/func")
async def get_items_with_func(params: dict = Depends(func_params)):
response = {}
if params["q"]:
response.update({"q":params["q"]})
result = items[params["offset"]: params['offset'] + params['limit']] # slicing을 해서 가져온다.
response.update({"items":result})
return response
if __name__ == "__main__":
uvicorn.run("main:app", reload = True)
FastAPI에서 의존성주입을 사용하기 위해서 Depends를 클래스를 import 해주어야합니다.
그리고, Depends(func_params)와 같이 의존성 주입을 사용을합니다. Depends 인자로 func_params라는 함수를 입력으로 넣어줍니다.
func_params라는 함수는 게시판을 만들 때, 보이는 글의 수를 10개씩, 5개씩 보이게끔 설정할 수 있는데, 한 번에 페이지에 보이는 글의 목록의 개수를 지정하는 함수의 예시입니다.
func_params에 offset과 limit이라는 인수가 있습니다. 따라서 func_params를 사용하기 위해서는 클라이언트 쪽에서 offset과 limit에 대한 값을 받아야합니다. 여기서 q는 검색 키워드입니다.
func_params라는 함수는 게시판을 만들 때마다 자주 사용하게 되는데 이를 새로운 API를 만들 때 마다 작성하는 것이 아닌 Depends를 사용해서 API를 작성해줍니다. 이렇게 작성을하면 API마다 따로 func_params를 작성할 필요가 없게 됩니다.
그리고 우리가 만든 API는 offset과 limit을 받아서, 가상의 DB은 items를 출력해주는 함수입니다.
코드를 실행해서 FastAPI 문서에 접속을 해봅시다 !!
python main.py
문서에 접속을 하면, 우리의 API가 q, offset, limit을 정상적으로 입력을 받는 다는 것을 확인 할 수 있습니다.
func_params 함수에 보며, q: Optional[str] = None, offset: int = 0, limit: int = 100 과 같이 입력 받는 값의 기본 값을 설정했고, 위의 문서에서도 기본 값들이 잘 Default value로 나타난 것을 알 수 있습니다.
try it out를 클릭하고, 바로 Execute를 눌러서 Test를 해봅시다. 그러면 다음과 같이 가성 DB인 items에 있는 목록이 전부 보이는 것을 확인 할 수 있습니다.
limit을 1로해서 다음과 같이 Execute를 해보겠습니다.
그러면, 다음과 같이 Foo라는 1개의 item 목록만이 출력됨을 알 수 있습니다.
다시, 돌아와서
이렇게 작성하면, Foo를 제외한 나머지 item들을 출력이 되는 것을 알 수 있습니다.
보통 이런식으로 얻은 정보로 DB에 있는 정보를 가져와 페이징 구현을 많이 하게됩니다.