본문 바로가기

웹 프레임워크/FastAPI

FastAPI - 14 (의존성 주입)

출처: https://fastapi.tiangolo.com/ko/tutorial/dependencies/
아래의 내용은 공식 사이트의 내용을 제 경험과 생각을 추가하여 다시 정리한 것 입니다.

의존성 주입(Dependency Injection)

의존성 주입은 객체가 필요로 하는 외부 리소스(의존성)를 객체 자체가 아닌 외부에서 제공하는 디자인 패턴입니다. FastAPI에서는 이 패턴을 사용하여 다양한 작업(예: 사용자 인증, 데이터베이스 연결, 설정 로드)을 처리합니다. 다시 말해 반복적인 작업을 정의하고 그것을 의존성 주입을 이용하여 사용하는 것 입니다.

Depends

FastAPI의 의존성 주입은 Depends를 사용합니다. 예시 코드를 통해 살펴 보겠습니다.

from typing import Union

# Depends는 의존성을 주입하는 데 사용됩니다.
from fastapi import Depends, FastAPI
from typing_extensions import Annotated

app = FastAPI()

# 의존할 수 있는 함수 정의
# 이 함수는 @app.get("/items/")과 같은 데코레이터를 사용하지 않습니다.
# 경로 매개변수 동일한 구조를 가집니다.
async def common_parameters(q: Union[str, None] = None, skip: int = 0, limit: int = 100):
    # 이곳에 로직 구현 

    # return 유형은 원하는 형태로 지정할 수 있습니다.
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
# Depends를 사용하여 common_parameters 함수를 의존성으로 주입합니다.
# Depends는 common_parameters 함수의 결과 값을 반환 되어 commons에 매핑 됩니다.
async def read_items(commons: Annotated[dict, Depends(common_parameters)]):
    return commons


@app.get("/users/")
# 한번 정의한 common_parameters 함수를 다시 사용할 수 있습니다.
async def read_users(commons: Annotated[dict, Depends(common_parameters)]):
    return commons

테스트

/items/ 테스트

http://localhost:8000/items/?q=foo&skip=1&limit=10

결과

{
  "q": "foo",
  "skip": 1,
  "limit": 10
}

/users/ 테스트

http://localhost:8000/users/?q=bar&skip=10&limit=20

결과

{
  "q": "bar",
  "skip": 10,
  "limit": 20
}

의존성이 주입 된 Annotated로 공유하기

코드를 보시면 이해 하실 수 있습니다. Depends를 사용하여 의존성을 주입하고, Annotated를 사용하여 공유합니다.

from typing import Union

from fastapi import Depends, FastAPI
from typing_extensions import Annotated

app = FastAPI()


async def common_parameters(
    q: Union[str, None] = None, skip: int = 0, limit: int = 100
):
    return {"q": q, "skip": skip, "limit": limit}


# 의존성이 주입 된 Annotated를 CommonsDep로 정의
CommonsDep = Annotated[dict, Depends(common_parameters)]


@app.get("/items/")
# CommonsDep를 사용하여 common_parameters 함수를 의존성으로 주입합니다.
async def read_items(commons: CommonsDep):
    return commons


@app.get("/users/")
# CommonsDep를 사용하여 common_parameters 함수를 의존성으로 주입합니다.
async def read_users(commons: CommonsDep):
    return commons

테스트 - 위와 동일

/items/ 테스트

http://localhost:8000/items/?q=foo&skip=1&limit=10

결과

{
  "q": "foo",
  "skip": 1,
  "limit": 10
}

/users/ 테스트

http://localhost:8000/users/?q=bar&skip=10&limit=20

결과

{
  "q": "bar",
  "skip": 10,
  "limit": 20
}

의존성으로 사용 가능 한 것

  • 호출 가능 해야 함
    • 함수
    • 클래스

 

추가

보다 많은 내용(클래스를 사용한 의존성 주입 등)이 있습니다. 추후 정리하여 내용을 추가하겠습니다. 우선 위의 공식 문서에서 더 많은 내용을 보실 수 있습니다.

https://fastapi.tiangolo.com/ko/tutorial/dependencies/