Seongwon Lim

Fast API란? 튜토리얼을 통해 이해하기 본문

Python

Fast API란? 튜토리얼을 통해 이해하기

limsw 2022. 5. 7. 15:19
반응형

What is Fast API?

FastAPI는 타입 힌트(Type hint)를 제공하는 파이썬 웹 프레임워크로 현대적이고 빠른(고성능) 개발을 지원한다.

 

Type hint 알고가기

def foo(a: int) -> int:
    b: int = 10
    return a*b

타입 힌트는 python 3.5 버전 이상에서 사용할 수 있으며, 코드 가독성 향상 및 사용자가 프로그래밍을 할 때 인자 및 변수에 대한 타입을 정의할 때 헷갈리지 않게 도와준다. 위처럼 변수에 타입 힌트를 정의할 수 있으며 언뜻 보면 타입스크립트와 비슷하다.

 

그러나, 파이썬은 정적 타입을 지향하는 것이 아니다.
타입 힌트는 언어 그대로 힌트를 제공하는 것이며 파이썬은 동적 타입을 지향하는 언어이다. 그래서 인자 a에 정수 값이 아닌 string, boolean 등의 타입이 들어와도 오류가 나지 않는다.

 

FastAPI가 최근에 빠르게 성장하고 있는 이유는 빠른 개발 지원 뿐만 아니라,

개발 속도를 효율적으로 높일 수 있으며 문서화가 매우 잘 되어있기 때문이다.

FastAPI 특징

  • 빠름 : NodeJS 및 Go 와 동등한 매우 높은 성능 (Starlette 및 Pydantic 덕분에). Python 프레임워크 중에서 가장 빠르다.
  • Fast to code : 기능 개발 속도를 약 200~300% 증가시킨다.
  • 버그 감소 : 인간(개발자)이 유발하는 오류의 약 40%를 줄인다.
  • 직관적 : 훌륭한 편집기를 지원하며 디버깅 시간이 적다.
  • Easy : 사용하고 배우기 쉽도록 설계되었다. 문서를 읽는 시간이 줄일 수 있다.
  • Short : 코드 중복을 최소화한다.
  • 표준 기반 : API에 대한 개방형 표준인 OpenAPI (이전에는 Swagger로 알려짐) 및 JSON Schema 를 기반으로 하고 완전히 호환된다.

이러한 이유로 FastAPI는 출시된 지 얼마 지나지 않았음에도 불구하고 개발자들 사이에서 빠르게 성장하고 있다.

위 사진은 파이썬 각 프레임워크의 Github Star 개수를 표현한 그래프이다. 그래프를 보면 출시된 지 얼마 지나지 않았지만 Star 개수가 벌써 3위를 차지하고 있다는 것을 알 수 있다.

또한, 외국의 여러 기업들이 FastAPI 프레임워크를 선택하는 사례가 많아지고 있는 것으로 보아 파이썬 웹 프레임워크의 신흥 강자로 떠오르고 있는 추세이다. 이제 FastAPI 사용 방법을 알아보도록 하자.

FastAPI 개발 환경 구성하기

STEP 1

pip install fastapi
pip install "uvicorn[standard]" // ASGI server가 필요한 경우 같이 설치한다.

필자는 두 개의 명령어를 차례대로 입력하여 필요한 모듈을 설치했다.

 

ASGI server 알고가기

ASGI ( Asynchronous Server Gateway Interface )는 비동기를 지원하는 파이썬 Web server, Framework 및 Application 간 표준 인터페이스를 제공하기위한 WSGI의 후속 제품이다. ASGI는 WSGI 이전 버전과의 호환성 구현, 여러 서버 및 애플리케이션 프레임 워크를 사용하여 비동기 및 동기 앱에 대한 표준을 제공한다.

STEP 2

테스트를 위한 코드를 작성한다. 파일명은 main.py로 생성했다.

먼저 Synchronized(동기화) 방식으로 구현한 코드는 다음과 같다.

# main.py
from typing import Optional

from fastapi import FastAPI

app = FastAPI()


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


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

비동기 함수로 구현하고 싶으면 다음과 같이 구현할 수 있다.

# main.py
from typing import Optional

from fastapi import FastAPI

app = FastAPI()


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


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

필자는 첫번째 코드인 동기화 함수를 기준으로 예제를 진행했다.

이제 서버 실행을 위한 모든 준비가 끝났다. 다음으로는 명령어를 통해 서버를 실행한다.

STEP 3

  • uvicorn main:app --reload 명령어를 입력한다. main 자리에는 사용자가 지정한 파이썬 파일 이름을 명시하면 된다.
  • app 은 코드에서 구현한 app = FastAPI() 부분에서 가져왔다. 만약에 해당 코드가 my_app = FastAPI() 인 경우 uvicorn main:my_app --reload으로 실행하면 된다.
  • --reload 명령어는 코드의 수정을 자동적으로 감지하여 수정된 코드를 서버에 반영하는 역할을 해준다. (Node.js에서 nodemon 역할을 수행한다고 보면 될 것 같다.)
$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

위와 같이 결과가 나왔다면 성공적으로 서버를 실행한 것이다. 이제 http://127.0.0.1:8000 링크로 접속하여 결과를 확인해보자.

우리가 리턴 메세지로 넣은 데이터가 화면에 잘 출력되는 것을 확인할 수 있다.

 

다음으로는 두번째로 정의한 경로인 http://127.0.0.1:8000/items/{item_id} 경로에 접속해보자. item_id 에는 정수를 입력하면 된다. 필자는 http://127.0.0.1:8000/items/5 경로로 요청을 보냈다. 결과는 다음과같다.

우리가 입력한 5값이 적절하게 나오는 것을 확인할 수 있다. 만약 item_id 값에 정수가 아닌 다른 타입의 문자가 들어오면 어떻게 될까?
결과를 확인하기 위해 http://127.0.0.1:8000/items/hello 경로로 요청을 보내보았다.

결과는 오류 메세지를 출력했다. item_id 에는 integer 타입이 와야하는데 다른 타입이 들어왔다는 에러를 출력하는 것 같다.

이처럼 FastAPI는 타입 힌트를 통해 타입이 잘못 들어오는 경우를 사전에 예방할 수 있다.

API 명세서 접근하기

FastAPI의 가장 큰 특징 중 하나는 바로 API 명세서를 내부 코드를 분석하여 자동으로 생성해준다는 것이다.
Django, Flask 혹은 node.js의 경우 API 명세서를 지원하는 기능이 없었다. 따라서 API를 설계한 후 개발자가 직접 명세서도 따로 작성해야 하는 번거로움이 존재했다.

 

그러나 FastAPI는 Swagger UI를 기반으로 자동 API 명세서를 제공하니 개발 시간도 훨씬 단축시킬 수 있고 개발자가 해야하는 부담도 많이 줄어들 것이다. 접속 방법은 간단하다. http://127.0.0.1:8000/docs 경로로 접속하면 끝이다.

위 화면처럼 나오면 알맞게 접속한 것이다. 우리가 정의한 API를 클릭해보면

입력해야 하는 Parameter, Body, Header 등이 무엇인지 확인할 수 있으며 요청에 대한 다양한 응답 결과들도 확인할 수 있다.

API 명세서 접근하기2

Swagger UI 기반의 명세서 뿐만 아니라 다른 대안 명세서에도 접근할 수 있다. http://127.0.0.1:8000/redoc 경로로 접속해보자.

제공하는 UI만 다를 뿐, 첫번째 방법에서 언급했던 내용들이 동일하게 들어있는 것을 확인할 수 있다.

JSON 형태로 API 명세서에 접근하기

마지막은 FastAPI에서 제공하는 openapi.json 에 접근하는 것이다.
openapi.json 파일만으로는 API 테스트를 할 수는 없지만 docs, redoc 경로에 직접 접근할 권한이 없는 사용자의 경우 openapi.json를 통해서 API 명세서를 확인하는 용도로 쓸 수 있다. openapi.json 파일 접근 방법은 총 3가지로 나뉜다.

 

  • http://127.0.0.1:8000/openapi.json 경로로 접속하여 직접 확인한다.
  • http://127.0.0.1:8000/docs 상단의 /openapi.json을 클릭한다.
  • http://127.0.0.1:8000/redoc 상단의 Download 버튼을 통해 직접 다운받는다.

openapi.json 파일은 이와 같이 구성되어 있다.

{
    "openapi": "3.0.2",
    "info": {
        "title": "FastAPI",
        "version": "0.1.0"
    },
    "paths": {
        "/items/": {
            "get": {
                "responses": {
                    "200": {
                        "description": "Successful Response",
                        "content": {
                            "application/json": {



...

우리가 구성한 API 경로, 메소드, 응답결과 등이 JSON 형태로 들어있는 것을 확인할 수 있다.


출처

Comments