[Python] FastAPI 프레임워크를 이용한 비동기 REST API 개발

Python 언어를 이용하여 REST API 서버를 만들 수 있는 방법은 여러 방법이 있습니다. 국내 혹은 많은 개발자들의 사랑을 받고 있는 Django, 그리고 가벼운 프레임워크로써 많이 사용하고 있는 Flask 등 여러가지가 있는데요.

 

이번 글에서는 Jetbrains의 IDE 도구인 PyCharm과 FastAPI 프레임워크를 이용해서 REST API 서버를 개발하는 시간을 가져보도록 하겠습니다.

 

 

 

 

What is FastAPI?

Python에서는 웹 서버와 연동하기 위해 WSGI라는 인터페이스를 사용합니다. 그러나 WSGI는 동기 방식으로 프로그램을 처리하기 때문에 미리 들어온 요청을 처리할 때까지 다음 사람이 계속 기다려야 하는 단점을 감수해야 합니다. 

 

FastAPI는 Starlette이라는 비동기 프레임워크를 기반으로 만들어졌고, 비동기 처리로 uvloop이라는 Cython으로 만들어진 libuv 라이브러리를 사용합니다. 순수 C 기반으로 만들어진다면 더욱 좋았겠지만 Cython으로 만들어졌기 때문에 libuv가 가지고 있는 성능적인 장점을 전부 이용할 수는 없어도 Python에서 만큼은 빠른 퍼포먼스를 보여주고 있습니다.

 

 

FastAPI

FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https://github.com/tiangolo/fastapi FastAPI is a modern, fast (high-performance), web framework for buil

fastapi.tiangolo.com

FastAPI에 대해서 더 알아보고 싶으신 분들은 위 링크를 한 번 보시는 걸 추천드립니다.

 

 

 

 

Recommended Developer

FastAPI는 Flask를 사용했던 개발자에게 추천드리는 프레임워크입니다. 무엇보다도 Flask에서 개발 문서를 자동화 하기 위해 사용했던 프레임워크로 Flask Rest Plus가 있었고, 이 프레임워크는 별도의 Swagger 등을 사용하지 않아도 자동으로 API 문서를 만들어주는 장점을 가지고 있는데요.

 

FastAPI는 다음과 같은 Flask-like한 특징을 가지고 있습니다.

 

  • Decorator와 함수 조합의 API 개발

    Flask와 동일하게 Decorator를 기반으로 API를 개발합니다.

  • 개발 문서 자동화

    Flask에서 개발 문서를 자동화 하기 위해 Flask Rest Plus 디펜던시를 별도로 설치하는 것처럼 FastAPI에서도 쉽게 개발 문서를 만들 수 있는 자동화 기능을 제공합니다.
  • 컨텍스트 생명주기 제공

    Flask와 마찬가지로 Application 생명주기 함수를 제공합니다.

이러한 Flask의 특징들을 담은 상태로 비동기 처리를 지원하기 때문에 Flask에서 비동기 구현을 망설이고 계신 분들에게는 최고의 선택이라고 생각합니다. 

 

 

 

 

Start in PyCharm

그러면 PyCharm을 이용해서 간단하게 API를 만들어보는 시간을 가져보도록 하겠습니다.

[tool.poetry]
name = "starletteexample"
version = "0.1.0"
description = ""
authors = ["Neon K.I.D <contact@neonkid.xyz>"]

[tool.poetry.dependencies]
python = "^3.8.5"
uvicorn = "^0.13.2"
fastapi = "^0.63.0"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Poetry를 이용하여 프로젝트 환경을 구성해줍니다. 잘 모르시겠다면 아래의 링크를 사용하여 Poetry 환경을 구성해주세요.

 

 

[Python] PyCharm에서 Poetry를 이용한 디펜던시 관리

소프트웨어 개발시 디펜던시의 관리는 이제 선택이 아닌 필수가 되었습니다. 여태까지 Python 언어를 이용해 소프트웨어 개발을 하였을 때는 requirement를 이용하여 환경별로 디펜던시 관리를 했었

blog.neonkid.xyz

기본적으로 FastAPI는 Python 3.6 이상이 필요하며 서버 실행을 위해 uvicorn 웹 서버와 FastAPI 프레임워크를 설치해줍니다.

import uvicorn
from fastapi import FastAPI
from fastapi.requests import Request
from starlette.responses import JSONResponse

app = FastAPI()


@app.route('/')
async def homepage(req: Request):
    return JSONResponse({
        'hello': 'world'
    })


if __name__ == '__main__':
    uvicorn.run(app, port=8000)

app.py 파일에 위의 코드를 입력해주고, 서버를 실행합니다.

 

 

 

 

Test

위에서 만든 API를 간단히 테스트 해보도록 하겠습니다. 서버에서 나온 메시지대로 http://127.0.0.1:8000 주소에 접속합니다.

Chrome 창이 나오면서 코드에서 주어진대로 hello world가 출력되는 것을 확인할 수 있습니다.

 

위에서 설명드린 것처럼 기본적으로 FastAPI는 문서 자동화를 제공합니다. 문서 종류는 2가지의 웹 종류와 OpenAPI JSON 파일을 제공하며 웹 종류는 Swagger UI와 Redoc을 제공합니다. 보시다시피 docs URI로 접속하면 Swagger UI가 제공됩니다.

 

redoc의 경우는 redoc URI로 접속하시면 됩니다. 지금은 보다시피 만든 API가 많지 않기 때문에 문서에서 아무런 내용이 나오지 않습니다. 차후 다른 글에서 FastAPI를 가지고 어떻게 문서를 자동화 할 수 있는지 알아보도록 하겠습니다.

 

 

 

 

 

마치며..

FastAPI에 대해서 간단하게 알아봤습니다. Python은 다소 퍼포먼스가 낮은 프로그래밍 언어이기 때문에 성능을 높게 요구하는 애플리케이션에 대해서는 많은 고민이 필요합니다. 그 동안은 Python 계열에서 웹 개발시 비동기 처리가 매우 어려운 요소였지만 이러한 좋은 프레임워크가 나옴으로 인해서 한결 고민을 덜어준 것 같네요.

 

FastAPI는 위에서 언급한대로 Flask와 거의 비슷한 스타일의 프로그래밍 문법을 가지고 구현하기 때문에 Flask를 한 번 쯤 사용해보신 분이라면 쉽게 배워보실 수 있습니다. 비동기 처리에 대해 한 번 쯤 고민하고 계셨거나 Java의 Spring처럼 서비스 레이어 구현 형태로 웹을 구현해보시는 분들에게 추천 드려봅니다.

 

 

comments powered by Disqus

Tistory Comments 0