> 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.1-fastapi.md).

# 3.1.1 FastAPI

> 백앤드로 사용되는 FastAPI에 대해 알아보고 구현하기

## 1. 백앤드 프로그래밍

### 1.1. Server 구성

* 웹, 앱 서버
* 머신러닝 서비스의 서버
* 모놀리식 아키텍처(Monolithic Architecture)
  * 통서버&#x20;
* 마이크로서비스 아키텍처(Mircroservice Architecture - MSA)
  * 분할서버

### 1.2. RestAPI

정보를 주고 받을때 널리 사용되는 형식 &#x20;

**HTTP(Hyper Text Transfer Protocol) : 정보를 주고 받을 때 지켜야 하는 통신 프로토콜(규약), 약속**

**REST(Representational State Transfer)란 형식의 API**

* 각 요청이 어떤 동작이나 정보를 위한 것을 요청 모습 자체로 추론할 수 있음
* 기본적인 데이터 처리 : 조회 작업, 새로 추가, 수정, 삭제
* CRUD : Create, Read, Update, Delete
* Resource, Method, Representation of Resource로 구성
  * Resource : Unique한 ID를 가지는 리소스, URI
    * URL : Uniform Resource Locator로 인터넷 상 자원의 위치&#x20;
    * URI : Uniform Resource Identifier로 인터넷 상의 자원을 식별하기 위한 문자열의 구성 URI는 URL을 포함하게 되며, URI가 더 포괄적인 범위
  * Method : 서버에 요청을 보내기 위한 방식 : GET, POST, PUT, PATCH, DELETE
    * GET : 정보를 요청하기 위해 사용(Read)&#x20;
    * POST : 정보를 입력하기 위해 사용(Create)&#x20;
    * PUT : 정보를 업데이트하기 위해 사용(Update)&#x20;
    * PATCH : 정보를 업데이트하기 위해 사용(Update)&#x20;
    * DELETE : 정보를 삭제하기 위해 사용(Delete)

### 1.3. **GET과 POST**

* GET
  * 어떤 정보를 가져와서 조회하기 위해 사용되는 방식
  * URL에 변수(데이터)를 포함시켜 요청함
  * 데이터를 Header(헤더)에 포함하여 전송함
  * URL에 데이터가 노출되어 보안에 취약
  * 캐싱할 수 있음
* POST
  * 데이터를 서버로 제출해 추가 또는 수정하기 위해 사용하는 방식
  * URL에 변수(데이터)를 노출하지 않고 요청
  * 데이터를 Body(바디)에 포함
  * URL에 데이터가 노출되지 않아 기본 보안은 되어 있음
  * 캐싱할 수 없음(다만 그 안에 아키텍처로 캐싱할 수 있음)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FW1IONgef4HfdoKUXkJcx%2Fimage.png?alt=media\&token=ace47843-d3c7-4fed-967d-b64d802f7951)

### 1.4. Header와 Body

http 통신은 패킷에 정보를 담아 Request/Response 하게 된다. 이 패킷의 구조가 Header/Body로 구성되어 있다.

* Header: 패킷에 대한 정보(보내는 주소, 받는 주소, 시간)
* Body: 실제 전달하려는 Data    &#x20;

### 1.5. Status Code

웹페이지를 보다보면 404 에러를 종종 볼수 있을 것이다. 이런 코드 값이 클라이언트 요청에 대한 서버의 Status Code 값이다.

* 1xx(정보) : 요청을 받았고, 프로세스를 계속 진행함
* 2xx(성공) : 요청을 성공적으로 받았고, 실행함&#x20;
* 3xx(리다이렉션) : 요청 완료를 위한 추가 작업이 필요&#x20;
* 4xx(클라이언트 오류) : 요청 문법이 잘못되었거나 요청을 처리할 수 없음&#x20;
* 5xx(서버 오류) 서버가 요청에 대해 실패함&#x20;

### 1.6. 동기와 비동기

* 동기(Sync) : 서버에서 요청을 보냈을 때, 응답이 돌아와야 다음 동작을 수행할 수 있음. A 작업이 모두 완료될 때까지 B 작업은 대기해야 함 (Java, Python)
* 비동기(Async) : 요청을 보낼 때 응답 상태와 상관없이 다음 동작을 수행함. A작업과 B 작업이 동시에 실행됨 (Javascript)

### 1.7. IP / Port

* **IP**
  * 네트워크에 연결된 특정 PC의 주소를 나타내는 체계
  * Internet Protocol의 줄임말, 인터넷상에서 사용하는 주소체계
  * 4덩이의 숫자로 구성된 IP 주소 체계를IPv4라고 함
  * 각 덩어리마다 0\~255로 나타낼 수 있음. 2^32 = 43억개의 IP 주소를 표현할 수 있음
  * 몇가지는 용도가 정해짐
  * localhost, 127.0.0.1 : 현재 사용 중인 Local PC
  * 0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소
  * 개인 PC 보급으로 누구나 PC를 사용해 IPv4로 할당할 수 있는 한계점 진입, IPv6이 나옴
* **Port**
  * IP 주소 뒤에 나오는 숫자
  * PC에 접속할 수 있는 통로(채널)
  * 사용 중인 포트는 중복할 수 없음
  * Jupyter Notebook은 8888
  * Port는 0 \~ 65535까지 존재
  * 그 중 0\~1024는 통신을 위한 규약에 정해짐
  * 22 : SSH
  * 80 : HTTP
  * 443 : HTTPS

## 2. Fast API

아직 Flask와 Django에 비해 활용 비중이 적지만, 점차 떠오르는 프레임워크이다.

### 2.1. 특징

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FBEOMLZll4vTX3k5KsHKt%2Fimage.png?alt=media\&token=01c8ee69-b5ff-4b1c-9149-019257adb898)

### FastAPI vs Flask

* **장점**
  * Flask보다 간결한 Router 문법
  * Asynchronous(비동기) 지원
  * Built-in API Documentation(Swagger)
  * Pydantic을 이용한 Serialization 및 Validation
* **아쉬운 점**
  * 아직까지는 Flask의 유저가 더 많음
  * ORM 등 Database와 관련된 라이브러리가 적음

## 3. 환경설정

### 3.1. 기본 프로젝트 구조

* 프로젝트의 코드가 들어갈 모듈 설정(app). 대안 : 프로젝트 이름, src 등
* **main**.py는 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할 (참고)
* Entrypoint : 프로그래밍 언어에서 최상위 코드가 실행되는 시작점 또는 프로그램 진입점
* main.py 또는 app.py : FastAPI의 애플리케이션과 Router 설정
* model.py는 ML model에 대한 클래스와 함수 정의

### 3.2. Poetry

* Dependency Resolver로 복잡한 의존성들의 버전 충돌을 방지
* Virtualenv를 생성해서 격리된 환경에서 빠르게 개발이 가능해짐
* 기존 파이썬 패키지 관리 도구에서 지원하지 않는 Build, Publish가 가능
* pyproject.toml을 기준으로 여러 툴들의 config를 명시적으로 관리
* 새로 만든 프로젝트라면 poetry를 사용해보고, virtualenv 등과 비교하는 것을 추천

{% content-ref url="/pages/ZUdnH77X2EB7HRql9mC0" %}
[Poetry로 dependency 관리](/til/til-ml/untitled-2/poetry-dependency.md)
{% endcontent-ref %}

## 4. FastAPI 샘플 프로젝트

```
fastapi = "^0.68.1"
uvicorn = "^0.15.0"
```

위 두개의 패키지를 설치

```python
from fastapi import FastAPI
import uvicorn

# FastAPI 객체 생성
app = FastAPI()

# "/" 로 접근하면 return 을 보여줌
@app.get("/")
def read_root():
    return {"Hello": "World"}

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)
```

```
python {file}.py
```

&#x20;

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F73hBz7UZEDrBCWu7t7DA%2Fimage.png?alt=media\&token=ee5e5296-407a-4969-abaf-9b93d8bc0022)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F5u49m0KUIZEduazX4Ch1%2Fimage.png?alt=media\&token=cc62d9ea-3ccb-4a47-809c-20b5884aa7e3)

### Swagger

* {주소}/docs
* {주소}/redoc

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FXIwf6ZAj4NO9mSrXmVUU%2Fimage.png?alt=media\&token=2a17faf7-a514-4cb4-9171-18ea8ebbc049)

API 패킷정보를 확인하고 , 명세서없이 파라미터 확인이 가능하다.    &#x20;
