728x90
반응형

FastAPI는 매우 강력하지만 직관적인 의존성 주입 시스템을 갖고 있습니다.

 

이것은 사용하기 매우 단순하게, 그리고 어떤 개발자라도 FastAPI를 사용하는 다른 컴포넌트와 이것을 쉽게 통합할 수 있게 설계되어 있습니다.

 

"의존성 주입"이란 무엇인가

"의존성 주입"은, 프로그래밍에서, 작동을 위해 필요로 하는 걸 코드 (이 경우, 경로 동작 함수) 에 선언하거나 "의존성"을 사용하는 방법을 의미합니다.

 

그리고, 그 시스템 (이 경우 FastAPI) 은 (의존성을 "주입"하여) 코드에 필요한 의존성을 제공하는 데 필요한 모든 일을 처리합니다.

 

이것은 다음과 같은 상황에 유용합니다:

 

  • 로직 공유 (동일한 코드 로직의 반복).
  • 데이터베이스 연결 공유.
  • 보안, 인증, 역할 요구 사항, 기타 등등 강요.
  • 그리고 기타 등등...

 

코드 반복을 최소화하는 동시에, 이 모든 상황에 사용될 수 있습니다.

 

첫 단계

매우 간단한 예제를 한 번 살펴봅시다. 지금 당장은, 유용하지 않을 정도로 간단합니다.

 

그러나 이 방법을 통해 의존성 주입 시스템이 어떻게 동작하는 지 살펴볼 수 있습니다.

 

의존성 또는, "의존 가능한 것" 생성

의존성에 집중해봅시다.

 

이것은 단지 경로 동작 함수가 가질 수 있는 것과 동일한 모든 매개변수를 가질 수 있는 함수일 뿐입니다:

 

 

이게 전부입니다.

 

두 줄이 끝입니다.

 

그리고 이것은 경로 동작 함수와 동일한 모양과 구조를 가집니다.

 

이것은 "데코레이터"가 없는 ( @app.get("/some-path") 가 없는) 경로 동작 함수를 떠올리면 됩니다.

 

그리고 원하는 모든 걸 반환할 수 있습니다.

 

이번 사례에서, 의존성은 다음과 같은 매개변수를 예상합니다:

 

  • str 인 선택적 쿼리 매개변수 q .
  • 기본 값이 0 이고, int 인 선택적 쿼리 매개변수 skip .
  • 기본 값이 100 이고, int 인 선택적 쿼리 매개변수 limit .

 

그리고 이 값을 포함한 dict 을 반환할 뿐입니다.

 

Depends 임포트

 

"의존적인 것" 내부에, 의존성 선언

경로 동작 함수 매개변수와 함께 Body , Query , 기타 등등을 사용한 것과 동일한 방법으로, 새로운 매개변수와 함께 Depends 를 사용합니다:

 

 

Body , Query , 기타 등등을 사용한 것과 동일한 방법으로 함수의 매개변수에 Depends 를 사용했음에도 Depends 는 조금 다른 방식으로 동작합니다.

 

단일 매개변수에만 Depends 를 사용할 수 있습니다.

 

이 매개변수는 반드시 함수와 유사한 것이어야 합니다.

 

그리고 그 함수는 경로 동작 함수가 그런 것처럼 동일하게 매개변수를 가집니다.

 



다음 챕터에서 함수 외에도, 의존성으로 사용되는, 다른 "것"을 확인할 수 있습니다.

 

새로운 요청이 도착했을 때, FastAPI는 다음과 같이 처리합니다:

 

  • 알맞은 매개변수와 함께 의존성 ("의존 가능한") 함수 호출.
  • 함수로부터 결과 획득.
  • 경로 동작 함수 내 매개변수에 해당 결과를 할당.

 

 

공유된 코드를 단 한 번만 이러한 방법으로 작성하면 FastAPI경로 동작에 이것을 호출하는 걸 처리하게 됩니다.

 

확인

특별한 클래스를 생성하거나 FastAPI 어딘가에 등록하기 위해 또는 다른 비슷한 어떠한 것에도 전달할 필요가 없다는 걸 명심하기 바랍니다.

단지 Depends 에 전달하면 FastAPI는 나머지를 어떻게 해야하는 지 알고 있습니다.

 

aysnc 를 사용하는 경우 또는 async 를 사용하지 않는 경우

의존성이 (경로 동작 함수와 동일한 방법으로) FastAPI에 의해 호출되기 때문에, 함수를 정의하는 것과 동일한 규칙이 적용됩니다.

 

async def 또는 평범한 def 를 사용할 수 있습니다.

 

그리고 평범한 def 경로 동작 함수 내부에 async def 를 사용한 의존성을 선언, 또는 async def 경로 동작 함수 내부에 def 를 사용한 의존성을 선언, 기타 등등의 선언이 가능합니다.

 

무엇이든 상관 없습니다. FastAPI는 무엇을 해야할지 알고 있습니다.

 

참고

만약 이에 관해 모른다면, 비동기: "간략하게?" 문서 내부 asyncawait 섹션을 확인하기 바랍니다.

 

OpenAPI와의 통합

모든 의존성 (그리고 서브-의존성) 의 요청 선언, 유효성 검사 그리고 요구사항은 동일한 OpenAPI 스키마에 통합됩니다.

 

따라서, 대화형 문서는 이 의존성들로부터 마찬가지로 모든 정보를 받게 됩니다:

 

 

간단한 사용

살펴보면, 경로동작이 일치할 때마다 사용되도록 경로 동작 함수가 선언되고, FastAPI는 요청으로부터 데이터를 추출하여, 올바른 매개변수를 사용하여 함수를 호출하게 처리합니다.

 

사실, 모든 (또는 거의 대부분) 의 웹 프레임워크가 이것과 동일한 방법으로 동작합니다.

 

절대 이 함수들을 직접 호출하지 않습니다. 프레임워크 (이 경우, FastAPI) 에 의해 호출됩니다.

 

의존성 주입 시스템을 사용하면, 경로 동작 함수경로 동작 함수보다 먼저 실행되어야 할 다른 것에 "의존"한다는 것을 FastAPI에 알릴 수 있으며, FastAPI는 이를 실행하고 결과를 "주입"합니다.

 

"의존성 주입"이라는 동일한 개념에 대한 다른 일반적인 용어는 다음과 같습니다:

 

  • 자원 (resources)
  • 제공자 (providers)
  • 서비스 (services)
  • 주입가능한 (injectables)
  • 컴포넌트 (components)

 

FastAPI 플러그-인

의존성 주입 시스템을 사용하여 통합 및 "플러그-인"이 구축될 수 있습니다. 그러나 사실, "플러그-인"을 설치할 필요 없이, 의존성을 사용하여 경로 동작 함수에 사용 가능한 무한히 많은 통합 및 상호작용을 선언할 수 있습니다.

 

그리고 의존성은 매우 단순하고 직관적인 방법으로 생성될 수 있으므로 단시 필요한 파이썬 패키지를 임포트하고, 문자 그대로 몇 줄의 코드로 API 함수와 통합할 수 있습니다.

 

다음 챕터에서 이것과 관련된, 관계형 및 NoSQL 데이터베이스, 보안, 기타 등등의 예시를 볼 수 있습니다.

 

FastAPI 호환성

의존성 주입 시스템의 단순함은 FastAPI가 다음 요소들과 호환될 수 있게 만듭니다:

 

  • 모든 관계형 데이터베이스
  • NoSQL 데이터베이스
  • 외부 패키지
  • 외부 API
  • 인증 및 인가 시스템
  • API 사용 모니터링 시스템
  • 응답 데이터 주입 시스템
  • 기타 등등.

 

단순함과 강력함

계층적 의존성 주입 시스템이 정의하고 사용하는 데 매우 단순함에도 불구하고, 여전히 매우 강력합니다.

 

의존성 자체를 정의할 수 있는 의존성을 정의할 수 있습니다.

 

결국에는, 계층적 의존성 트리가 구축되고, 의존성 주입 시스템은 이러한 모든 의존성 (그리고 그들의 서브-의존성) 을 해결하고 각 단계에서 결과를 제공 (주입) 합니다.

 

예를 들어, 4개의 API 엔드포인트 (경로 동작) 이 있다고 가정해봅시다:

 

  • /items/public/
  • /items/private/
  • /users/{user_id}/activate
  • /items/pro/

 

그러면 단지 의존성 및 서브-의존성을 사용하여 각각에 대해 서로 다른 권한 요구 사항을 추가할 수 있습니다:

 

 

OpenAPI와의 통합

이 모든 의존성들은, 요구사항을 선언하면서, 매개변수, 유효성 검사, 기타 등등을 경로 동작에 추가합니다.

 

FastAPI는 이 모든 것을 OpenAPI 스키마에 추가하기 때문에, 대화형 문서 시스템에 보여집니다.

 


원문

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

 

Dependencies - First Steps - FastAPI

Dependencies - First Steps FastAPI has a very powerful but intuitive Dependency Injection system. It is designed to be very simple to use, and to make it very easy for any developer to integrate other components with FastAPI. What is "Dependency Injection"

fastapi.tiangolo.com

728x90
반응형

'FastAPI > Tutorial - User Guide' 카테고리의 다른 글

[ FastAPI ] 하위-의존성  (0) 2021.10.20
[ FastAPI ] 의존성으로서의 클래스  (0) 2021.10.19
[ FastAPI ] 바디 - 수정  (0) 2021.10.03
[ FastAPI ] JSON 호환 부호화  (0) 2021.10.03
[ FastAPI ] 경로 동작 구성  (0) 2021.10.01