출처: 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
}
의존성으로 사용 가능 한 것
- 호출 가능 해야 함
- 함수
- 클래스
추가
보다 많은 내용(클래스를 사용한 의존성 주입 등)이 있습니다. 추후 정리하여 내용을 추가하겠습니다. 우선 위의 공식 문서에서 더 많은 내용을 보실 수 있습니다.
'웹 프레임워크 > FastAPI' 카테고리의 다른 글
FastAPI - 16 (보안2 - QAuth2, Bearer) (0) | 2023.12.24 |
---|---|
FastAPI - 15 (보안1 - QAuth2, Bearer) (0) | 2023.12.24 |
FastAPI - 13 (JSON 호환 인코더 / 본문 업데이트) (0) | 2023.12.19 |
FastAPI - 12 (파일 업로드 / 파일 다운로드) (0) | 2023.12.19 |
FastAPI - 11 (파일 요청 / 폼과 파일 요청) (0) | 2023.12.18 |