개요
최근 새로 API 개발 업무를 맡게 되었는데…… 기존에 공부를 했었던 Flask, Tornado가 아니라 FastAPI라는 웹 프레임워크를 사용하게 되었다. 기본적인 설치나 실행 방법에 대해서 알아보자.
FastAPI
Python 타입 힌트(타입 어노테이션)를 기반으로 API 개발에 초점을 둔 Python 웹 프레임워크.
공식 문서에 의하면 다음과 같은 특징을 갖고 있다.
- 내부적으로 Starlette라는 비동기 프레임워크를 사용하며 가장 빠른 Python 프레임워크 중 하나이다.
- Pydantic을 사용해 입출력 항목을 빠르게 정의하고 값을 검증할 수 있으며, Swagger를 사용하여 빠르게 API 문서를 작성할 수 있다.
- 내부 테스트에 의하면 개발자에 의한 오류를 40% 정도 감소시키는 것으로 측정되었다.
- 거의 모든 부분에서 자동완성을 지원한다.
- 쉽게 배우고 사용할 수 있도록 설계되었다.
- 코드 중복을 최소화하여 간결한 코드를 작성할 수 있다.
- 견고하다.
- API에 대한 개방형 표준을 기반으로 하며 완벽하게 호환된다.
이 글에서는 FastAPI를 이용해 간단한 웹 서버를 만들어보려고 한다.
설치
FastAPI는 다른 라이브러리와 동일하게 pip를 이용해 간단히 설치할 수 있다.
pip install fastapi
# 모든 의존성과 기능을 함께 설치
pip install "fastapi[all]"
서비스 실행을 위해 ASGI 서버도 설치해야 한다. uvicorn, hypercorn을 많이 사용하는 것 같다.
🤔 WSGI; Web Server Gateway Interface
동기적인 프로그래밍 모델을 따르는 Python 웹 애플리케이션과 웹 서버 간의 인터페이스
Flask나 Django와 같안 웹 프레임워크가 지원한다.
🤔 ASGI; Asynchronous Server Gateway Interface
비동기 웹 애플리케이션을 위한 파이썬 웹 서버와 웹 프레임워크 간의 인터페이스
비동기 처리와 동시 처리를 지원한다.
🤔 uvicorn
Python을 위한 ASGI 웹 서버 구현
HTTP/1.1과 WebSockets을 지원한다.
🤔 hypercorn
sans-io hyper, h11, h2, wsproto libraries을 기반으로 하고 Gunicorn에서 영감을 받은 ASGI 및 WSGI 웹 서버
HTTP/1, HTTP/2, WebSockets을 지원한다.
이 글에서는 uvicorn을 설치하여 사용한다.
pip install uvicorn
# Cython 기반 종속성 및 선택적 기능 포함 설치
pip install "uvicorn[standard]"
기본 구조
공식 문서에서 확인할 수 있는 기본적인 FastAPI 애플리케이션은 다음과 같은 모습이다.
# main.py
# FastAPI 임포트
from fastapi import FastAPI
# FastAPI 객체 생성
# API를 생성하기 위한 상호작용의 주요 지점이 된다.
app = FastAPI()
# URL 및 HTTP 메서드 지정
# 지정한 요청이 들어오면 함수가 실행된다.
@app.get("/")
async def root():
return {"message": "Hello World"}
예시에서는 비동기 함수로 정의했는데, 일반적인 동기 함수로 정의할 수도 있다.
@app.get("/")
def root():
return {"message": "Hello World"}
실행
작성한 FastAPI 애플리케이션은 다음과 같이 실행시킬 수 있다.
uvicorn <MODULE>:<FAST_API 객체>
# --reload : 코드 변경 시 서버 자동 재시작
# 예시
uvicorn main:app --reload
실행시키면 로그에 어느 주소의 어느 포트에서 실행되는지 확인할 수 있다.
접속해 보면 아래와 같이 동작함을 확인할 수 있다.
API 문서 확인
FastAPI를 실행하면 /docs 라는 경로로 Swagger 기번욿 자동 생성된 API 문서를 확인할 수 있다.
/redocs로 접근하면 Redoc 기반 API 문서도 확인할 수 있다.
참고 문서
https://fastapi.tiangolo.com/ko/
https://asgi.readthedocs.io/en/latest/