> For the complete documentation index, see [llms.txt](https://lswkim322.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lswkim322.gitbook.io/til/til-ml/boostcamp/p-stage-product-serving/part-3/3.1.2-fast-api.md).

# 3.1.2 Fast API

## 1. FastAPI 기본지식

### 1.1. Path Parameter, Query Parameter

* Path Parameter

  * /users/402
  * 경로가 없을 경우 404
  * ex) 하위 게시물

  ![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FCU9v3iJpxhuPdzU7gl7c%2Fimage.png?alt=media\&token=41effed1-62b4-49b6-80d5-ee516c498907)
* Query Parameter

  * /users?id=402
  * 경로가 없을 경우 빈 값 &#x20;
  * ex) 로그인 id, pw전송&#x20;

  ![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FEy7MpA3PnPBbhfDu8J1Z%2Fimage.png?alt=media\&token=094b2bb7-e930-4a39-aee0-f4140774e876)
* Optional Parameter

```python
def read_item(item_id: str, q: Optional[str] = None)
```

### 1.2. Request Body

Client에서 API 요청시에 Request Body를 사용한다.

* Content Type: 전송할 데이터의 Type을 명시해준다.  &#x20;
  * application/x-www-form-urlencoded : BODY에 Key, Value 사용. & 구분자 사용
  * text/plain : 단순 txt 파일
  * multipartform-data : 데이터를 바이너리 데이터로 전송

\[Swagger로 테스트하기]

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F6avo7aaZWn0Knc6FWskf%2Fimage.png?alt=media\&token=86eec39c-2447-4870-9451-f34f16363232)

### 1.3. Response Body

서버에서 Client에게 데이터를 담아서 주는 Response Body

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FbYQ4GKGEZIzjwdWwtuIN%2Fimage.png?alt=media\&token=dd6b20c0-e779-4834-b00e-628762733ff4)

### 1.4. Form

Form을사용하기 앞서 설치가 필요하다.

```
pip install python-multipart
pip install Jinja2
```

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2Fv7SSkA4kQUAsy9YZYLc3%2Fimage.png?alt=media\&token=7bc3ae5e-ba8e-4093-80b5-c3c1e08ffff4)

### 1.5. File

파일업로드

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FcrP9PVpooVIJh3aHFXuy%2Fimage.png?alt=media\&token=98fb1f0f-4117-46e2-8fa1-bc49610cd9dc)&#x20;

## 2. Pydantic

* FastAPI에서 Class 사용할 때 보이던 Pydantic
* Data Validation / Settings Management 라이브러리
* Type Hint를 런타임에서 강제해 안전하게 데이터 핸들링
* 파이썬 기본 타입(String, Int 등) + List, Dict, Tuple에 대한 Validation 지원
* 기존 Validation 라이브러리보다 빠름 (Benchmark)
* Config를 효과적으로 관리하도록 도와줌
* 머신러닝 Feature Data Validation으로도 활용 가능

### 2.1. Validation

예시 과정을 통해 살펴보기로 한다.&#x20;

Validation Check Logic

* 조건 1: 올바른 url을 입력 받음 (url)

* 조건 2: 1-10 사이의 정수 입력 받음 (rate)

* 조건 3: 올바른 폴더 이름을 입력 받음(target\_dir) 사용할 수 있는 방법

* 일반 Python Class를 활용한 Input Definition 및 Validation

* Dataclass를(python 3.7 이상 필요) 활용한 Input Definition 및 Validation

* Pydantic을 활용한 Input Definition 및 Validation

#### Python Class 사용시

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FEkG8ay05qUozznKPg2zA%2Fimage.png?alt=media\&token=d74b1925-901b-4501-b9c1-f3e37fe8e44a)

* Python Class로 Input Definition 및 Validation => 의미 없는 코드가 많아짐
* 복잡한 검증 로직엔 Class Method가 복잡해지기 쉬움
* Exception Handling을 어떻게 할지 등 커스텀하게 제어할 수 있는 있지만 메인 로직(Input을 받아서 Inference를 수행하는)에 집중하기 어려워짐

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FLB1XMwgVR0NzsURuEzcx%2Fimage.png?alt=media\&token=25e5c1f9-0c4e-4778-a663-ed5ea3227b1e)

#### DataClass 사용시

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F4HpgJi2f3mxF5b3PXBDn%2Fimage.png?alt=media\&token=c91b8340-bf5e-4c32-aacb-127e4e82061e)

* 인스턴스 생성 시점에서 Validation을 수행하기 쉬움
* 여전히 Validation 로직들을 직접 작성해야 함
* Validation 로직을 따로 작성하지 않으면, 런타임에서 type checking을 지원하지 않음

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F5TXBCXAC2QCw8gHV03V5%2Fimage.png?alt=media\&token=02628288-b927-400b-8fef-d2d2615c5a83)

#### Pydantic 사용 시&#x20;

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F3ij5HvuZN3UqGOenmTrz%2Fimage.png?alt=media\&token=493b3d81-cda1-4444-b8a1-0777cfc42f2b)

* 훨씬 간결해진 코드 (6라인)(vs 52라인 Python Class, vs 50라인 dataclass)
* 주로 쓰이는 타입들(http url, db url, enum 등)에 대한 Validation이 만들어져 있음
* 런타임에서 Type Hint에 따라서 Validation Error 발생
* Custom Type에 대한 Validation도 쉽게 사용 가능

### 2.2. Config 관리

* 애플리케이션은 종종 설정을 상수로 코드에 저장함
* 이것은 Twelve-Factor를 위반
* Twelve-Factor는 설정을 코드에서 엄격하게 분리하는 것을 요구함
* Twelve-Factor App은 설정을 환경 변수(envvars나 env라고도 불림)에 저장함
* 환경 변수는 코드 변경 없이 쉽게 배포 때마다 쉽게 변경할 수 있음
* The Twelve-Factor App이라는 SaaS(Software as a Service)를 만들기 위한 방법론을 정리한 규칙들에 따르면, 환경 설정은 애플리케이션 코드에서 분리되어 관리되어야 함

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F7kvFFPz7X6Y14zkiSvST%2Fimage.png?alt=media\&token=e2cf3fe3-ab2e-40d4-9b2c-3fe94d424e55)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2Fo3NRsG2xWqomHgsyAk7Y%2Fimage.png?alt=media\&token=032b5816-a4f5-41ca-99f1-6cc1866307c4)

#### Pydantic base settings

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2Ft1MFLcYeNoctErsf71H7%2Fimage.png?alt=media\&token=993f8d1d-ab20-4c1c-a19c-5782231d564c)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FhTGmgzKqLkgBIncIPMoQ%2Fimage.png?alt=media\&token=83e15f17-d5f6-40e4-b91d-c3b339b1062e)
