Post

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는 다음과 같은 처리를 합니다.

  1. 설정한 dependency를 부르고 파라미터가 맞게 설정되었는지 확인합니다.
  2. 해당 함수에서 설정한 리턴값을 가져옵니다.
  3. 그 리턴값을 인자로 설정한 값(commons)에 주입합니다.

이렇듯 itemsusers컨트롤러는 common_parameters의존하게 됩니다. 함수가 바뀌면 두 컨트롤러도 바뀌게 됩니다. 그리고 컨트롤러는 본인이 의존성을 주입하는 것이 아닌 함수가 의존성을 주입하게 되므로, 이를 DIP의존성역전법칙을 만족하게 됩니다.

☑️ To async or not to async

의존성 함수를 정의할 때 async defdef를 사용할 수 있습니다.

async def의 의존성함수로 def를 지정할 수도 있고, def의 의존성함수로 async def를 지정할 수도 있습니다.

FastAPI는 이를 감지하여 알아서 처리해줍니다.


공식문서에서는 자신들이 만든 시스템에 대해서 굉장히 자랑을 하고 있는데 궁금하면 읽어보시길 바랍니다.

This post is licensed under CC BY 4.0 by the author.