팀 ProFit에서 진행하는 Arcadia에서 AI서비스와 연동하여 사용할 FastAPI에 대해서 조사하였다. 해당 본문에서는 FastAPI의 개념과 간단한 동작, 그리고 MongoDB와 연동 등에 대해서 서술한다.
“그래서 FastAPI가 뭐야?”라고 묻는다면, 말 그대로 Fast한 API가 가능한 프레임워크라고 생각한다. 물론 GO가 FastAPI보다 빠르지만, 파이썬 산업 표준 프레임워크에서는 일반적으로 가장 빠르다.
FastAPI가 대단한 이유는 Python3.6부터 지원이 되어서, 낮은 수준에서의 빠른 성능을 가진 경량 파이썬 API 서버 웹 프레임워크이기 때문이다. (수식어가 참 많다….)
Flask와 비슷한 구조를 가지고 있으며, 기본적으로 비동기식으로 작성되어 있어 I/O 병목현상이 자주 일어나는 웹 서버에서 빠른 성능을 보여주고 있어 python API서버로 적합하다고 생각됩니다.

Starlette을 쓰기 때문이고, Starlette이 빠른 이유는Uvicorn을 쓰기 때문이고,
Uvicorn이 빠른 이유는Uvloop을 쓰기 때문이고,
Uvloop이 빠른 이유는 (설명과 표에는 나와있지 않지만)
Node.js 비동기IO의 핵심인 libuv를 기반으로 Cython으로 작성되었기 때문이다.
FastAPI를 조사하면서 느낀 것 중 하나는 API를 빠르게 보내기 위해 모든 것에 목숨을 걸었다.
Starlette(가볍고 고성능의 파이썬 비동기 웹 프레임워크)을 사용하여 비동기를 지원하면서, 경량화하여 최소한의 오버헤드를 만들어 API통신으로 I/O바운드의 속도를 높였다.


uvicorn은 Python 웹 애플리케이션을 실행하도록 설계된 ASGI(Asynchronous Server Gateway Interface) 서버이다. (Uvicorn은 live reload 기능을 제공한다.)
| FastAPI 만 설치했을 때 | Starlette 만 설치했을 때 |
|---|---|
![]() | ![]() |
FastAPI를 설치했을 때와 Starlette을 설치했을 때 Uvicorn이 목록에서 보이지 않는다. 즉 FastAPI 설치 후 따로 설치해야 한다는 의미다.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
#데이터를 받을 모델
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
#async는 추가사항 비동기라는 것을 그냥 명시해주는 것이다. FastAPI자체가 비동기로 실행되기 때문에 굳이 넣지 않아도 괜찮다.
#Get Header
@app.get("/Header")
async def get_header_values(user_agent: str = Header(None), authorization: str = Header(None)):
return {"User-Agent": user_agent, "Authorization": authorization}
#Get
@app.get("/request")
async def 이름():
return 'response'
#Post
@app.post("/items/")
async def create_item(item: Item):
return {"name": item.name, "description": item.description, "price": item.price, "tax": item.tax}
#Put
@app.put("/items/{item_id}")
async def update_item(item_id: int, name: str):
return {"item_id": item_id, "name": name}
#Delete
@app.delete("/items/{item_id}")
async def delete_item(item_id: int):
return {"item_id": item_id, "message": "Item deleted successfully"}
솔직히 FastAPI의 사용법은 매우 단순하다. FastAPI객체를 만든 후에 해당 객체가 받을 API를 알려주고 함수를 실행하면 된다. 원하는 프로세스에 맞게 받을 값에 맞는 모델을 만들어서 넣어주고 실행해주면 된다.
이건 나중에 하기
https://velog.io/@thovy/FastAPI-MongoDB-와-연결해-CRUD-api-만들기
fastapi 개요
https://velog.io/@cho876/요즘-뜨고있다는-FastAPI
https://parkjh7764.tistory.com/153
https://velog.io/@hslim8888/FastAPI는-왜-fast한가요-FastAPI-개발자에게-물어봤습니다
IO 바운드, CPU 바운드 (Flask vs FastAPI)
https://amazelimi.tistory.com/entry/Python-Flask와-FastAPI로-테스트-해본-Python-동시성-테스트
FastAPI사용법