Skip to main content

급성장 중 Fast Api

Untitled

배경

위의 그래프에서 보듯이 fastapi의 관심도는 꾸준히 성장했고 2022년 현재 flask를 거의 따라잡았습니다. 물론 django가 production에서 신뢰도 있게 사용되고 있지만 nodejs에서 expressjs를 좋아하던 것처럼 python에서 flask를 좀 더 선호했었기 때문에 flask처럼 간단하게 web framework을 구현할 수 있는 fastapi가 왜 이렇게 관심도가 높은지 직접 사용해 볼 계획입니다.

주요 특징

고성능과 빠른 개발 속도: FastAPI는 이름부터 빠르다고 하고 공식문서에도 빠른 것을 주요 특징으로 두었습니다. Starlette, Pydantic 덕분에 NodeJS 및 Go 와도 대등할 정도로 빠른 성능이라고 합니다. 또한 개발 시에도 약 200% ~ 300% 빠른 개발 속도를 자랑합니다. 또한 개발 시의 버그를 40%나 감소시켜주고 러닝커브가 낮고 견고하며 문서까지 기본으로 지원합니다.

  1. 성능은 왜 빠를까?

    • flask 보다 빠르고 NodeJS, Go 와 대등할 정도로 빠른 이유는 WSGI 가 아닌 ASGI 방식을 사용하기 때문.

    FastAPI 웹 서비스 아키텍쳐

    FastAPI 웹 서비스 아키텍쳐

    • **WSGI(Web Server Gateway Interface)**는 python application(python script)이 웹 서버와 통신하기 위한 표준 인터페이스이며, 파이썬 프레임워크이다. 프로토콜과 비슷하게 웹서버와 파이썬 애플리케이션이 통신하기 위한 규약이고 **ASGI(Asynchronous Server Gateway Interface)**는 비동기 가능 Python 웹 서버, 프레임 워크 및 애플리케이션 간의 표준 인터페이스를 제공을 위해 만들어진 것.
    • 위 그림과 같이 gunicorn(WSGI)를 마스터 프로세스로 하고 uvicorn(ASGI)을 Worker 프로세스로 띄워 단일 프로세스로 실행하여 여러 개의 프로세스가 요청을 처리하는 구조.
  2. 개발 속도는 왜 빠를까?

    • fastapi 설치시 자동으로 함께 설치되는 starlette, pydantic 라이브러리가 있는데 starlette 은 가볍게 ASGI 컨셉에 맞춰 비동기 웹 서비스 개발 시 필요한 툴킷들을 모아놓은 라이브러리이고 pydantic 은 명시해 놓은 데이터 타입에 따라 유효성을 체크해 주는 라이브러리인데 이 2개를 이용하면 개발 시 버그를 많은 부분 감소시켜 주고 프로덕션에 필요한 대부분의 툴킷을 간편하게 사용할 수 있기 때문에 개발 속도업!
  3. 게다가 문서도 잘 되어 있어 보고 따라하기도 간편.

개발 준비(공식문서 기반)

  • INSTALLATION
pip install fastapi
pip install "uvicorn[standard]"
  • 서버
from typing import Union

from fastapi import FastAPI

from models.Item import Item

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "World"}

fake_items_db = [
{"name": "Foo", "price": 20000, "is_offer": True},
{"name": "Bar", "price": 30000, "is_offer": True},
{"name": "Baz", "price": 10000, "is_offer": True}
]

@app.post("/items/")
async def add_item(item: Item):
fake_items_db.append(item)
return fake_items_db[len(fake_items_db) - 1]

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
return fake_items_db[skip: skip + limit]

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return fake_items_db[item_id]

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
fake_items_db[item_id] = item
return fake_items_db[item_id]
from typing import Union

from pydantic import BaseModel

class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None

위처럼 expressjs, flask 와 비슷하게 app = FastAPI() 를 통해 앱을 생성하고 간단한 annotation 을 통해 path를 설정함.

요청 시 path, queries, body 를 얻는 방식도 간단한데 를 통해 path 값을 가져오고 queries, body 같은 경우 위처럼 선언만 해두면 가져다 쓸 수 있다.

그리고 위의 요청 값의 타입 선언은 단순한 타입 선언이 아닌 잘못된 타입에 대해 타입 가드 역할 도 하고 타입 제한도 할 수 있으며 심지어는 swagger, redoc 문서까지 알아서 생성해준다.

아래와 같이 swagger를 이용하면 되기 때문에 api 요청을 위한 postman 도 사용하지 않을 수 있는 편리한 구성임.

스크린샷 2022-05-20 오후 5.44.21.png

결론

인기가 많아지면서 커뮤니티도 커지고 있고 성능적으로 우수하고 사용법도 간편하고 개발하기에 버그 잡기도 수월하고 문서까지 타입 설정만으로 완성해 주는 개인적으로 python 웹 프레임워크 중 사용해 본 것들 중 사용 경험이 가장 좋았던 프레임워크다.

앞으로의 python 프로젝트에서 적극적으로 도입해 사용할 듯 함.

참조문서

  1. FastAPI
  2. Why FastAPI?