Python/FastAPI

[FastAPI] FastAPI 튜토리얼 (1) - FastAPI 소개

ready-go 2023. 7. 12. 06:39

FastAPI란

FastAPI는 Python을 사용하는 웹 프레임워크이다. Python 버전 3.7 이상에서 사용가능하며, 타입 힌트를 이용해 입출력 데이터의 유효성을 검사하고 자동으로 API 문서를 생성해준다는 특징이 있다. Pydantic이라는 유효성 검사 라이브러리와 Starlette이라는 비동기 웹 프레임워크를 기반으로 만들어졌다.

 

장점

성능

공식 문서에 따르면 FastAPI는 Starlette, Uvicorn과 함께 사용했을 때 NodeJS와 Go와 비슷한 성능을 자랑한다고 한다. 참고로, Starlette은 FastAPI에 포함되고, Uvicorn은 포함되지 않는다. Uvicorn과 uvloop을 함께 사용해야 높은 성능을 얻을 수 있다고 한다. Uvicorn과 uvloop을 함께 설치하려면 pip install "uvicorn[standard]"라고 명시해야 한다. [참고]

 

Python 웹 프레임워크로 유명한 django, flask와 비교해 좋은 성능을 낸다고 알려져 있지만, 최근에는 flask와 비슷한 정도인 것 같다. 벤치마크 점수를 제공하는 TechEmpower에 따르면 round 20(2021-02-08) 기준으로는 flask보다 종합 점수가 훨씬 높았으나, round 21(2022-07-19) 기준으로는 flask보다 살짝 낮은 수준이다.

TechEmpower round21 Composite scores

 

사용성

Python을 사용해 직관적인 코드로 작성할 수 있으며, 유효성 검사 등의 편의기능을 제공한다. 유효성 검사는 사용자의 입력이 제대로 들어왔는지, 타입이 다른지를 검사해주는 기능이다. 이렇게 타입을 검사해주지 않으면 생각하지 못한 에러가 발생할 수 있다.

 

또한, API를 만들 때 생각보다 중요한 것이 API 문서를 만드는 것이다. FastAPI는 따로 설정할 필요 없이 swagger를 이용해 문서를 자동으로 만들어준다. 이것을 이용해 API 테스트도 매우 간단히 실행해볼 수 있다.

 

실행

가상 환경 설정

Python을 사용해 프로젝트를 시작할 때, 가상 환경을 만들면 프로젝트별로 패키지 의존성을 따로 관리할 수 있다. 이렇게 가상 환경을 사용해 의존성을 나누어서 관리해야 버전 충돌 등의 예기치 못한 상황을 방지할 수 있다.

 

먼저, venv 패키지가 설치되어있지 않다면 설치해줘야 한다.

pip install venv

이제, 가상 환경을 만들어준다. 가상 환경의 이름은 fastapi-test라고 정했다.

python -m venv fastapi-test

만들어준 가상 환경을 활성화해준다.

source fastapi-test/bin/activate

가상 환경을 비활성화하고 싶다면 아래와 같이 명령어를 실행한다.

deactivate

 

패키지 설치

이제 본격적으로 FastAPI를 시작해보자. 가상환경 내에 FastAPI와 Uvicorn 패키지를 설치한다.

pip install fastapi
pip install "uvicorn[standard]"

 

코드 작성

main.py 파일을 작성해주자. 참고로, 아래는 Python 3.10 버전이다.

from typing import Union

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: str | None = None):
	return {"item_id": item_id, "q": q}

코드는 굉장히 직관적이다. app은 FastAPI 인스턴스이고, 서버를 실행해주는 코드이다. 아래에서 app.get("/")으로 "/"에 GET 요청이 왔을 때 실행할 함수를 등록해준다. 마찬가지로, "/items/{item_id}"로 GET 요청이 오면 read_item을 실행한다.

 

서버 실행

작성한 FastAPI 서버를 실행해보자.

uvicorn main:app --reload

main은 실행할 파일의 이름이고, app은 FastAPI 인스턴스의 이름이다. 만약 run 디렉토리에 server.py가 있고, FastAPI 인스턴스의 이름이 my_app이라면 실행 명령어는 아래와 같이 달라진다.

uvicorn run.server:my_app --reload

reload 옵션은 소스코드의 변화를 탐지하는 옵션이다. 서버가 실행되고있는 상태에서 main.py 파일을 수정하면 자동으로 변화를 감지해 서버를 재실행한다. 따라서 개발 환경에서만 사용해야 안전하다.

 

서버를 실행하면 http://127.0.0.1:8000에 서버가 실행되었다는 메시지가 표시된다. 브라우저에서 127.0.0.1:8000으로 접속하면 JSON 형식의 응답을 받을 수 있다.

{"Hello":"World"}

 

API 문서

이제 127.0.0.1:8000/docs를 실행해보자.

Swagger UI

우리가 등록한 "/"와 "/items/{item_id}"으로 GET 요청을 보낼 수 있는 화면이 나온다.

 

3줄 요약

  1. FastAPI는 Python으로 어플리케이션 서버를 만들 수 있는 웹 프레임워크이다
  2. Go, NodeJS와 비교할만한 고성능이며, 만들기 쉽고 다양한 편의 기능을 제공한다
  3. Flask보다 빠르다는 건 2년전 기준이며, Django보다는 빠른 것 같다