FastAPI

dyeon-dev·2023년 6월 1일
0

FastAPI란?

FastAPI는 파이썬으로 API를 빌드하기 위한 web framework이다.
최근 FastAPI에 대한 인기가 많이 높아졌다. FastAPI는 나온지 얼마되지도 않았을 때부터도 인기가 굉장했다.
인기가 많은 이유로는
첫번째로 기존 파이썬 웹 프레임워크들 대비에 성능이 훨씬 더 좋다. 비동기 통신을 기반으로 하기 때문에 FastAPI로 서버를 만들면 비동기적인 연산을 쉽게 할 수 있다. flask나 django는 기본적으로 동기 통신을 기반으로 하기 때문에 아무리 서버 내부에서 요청마다의 스레드를 구동하고 처리한다해도 효율이 나지 않는다.
diango처럼 크게 개발하는 것보다 서비스를 작은 단위로 분할해서 개발하는 '마이크로 서비스'가 트렌드이기도 하다.

두번째로 '파이썬'이라서 이다. 아주 단순한 이유지만, 매우 강력하다. 파이썬이기 때문에 ML모델도 쉽게 서빙할 수 있고, 다양한 파이썬 라이브러리들을 유연하게 사용할 수 있다. API들 끼리의 요청을 빠르게 처리할 수 있고, 가벼우며, 쉽고 빠르게 코드를 개발할 수 있기 때문에 MSA 구조와 딱 잘 맞는다.

👉 MSA(MicroService Architecture)
마이크로서비스 아키텍처에 대한 정확한 정의는 없다. 하지만 마이크로서비스란 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다. 마이크로서비스는 완전히 독립적으로 배포가 가능하고, 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점을 둔다.
MSA는 API를 통해서만 상호작용할 수 있다. 즉, 마이크로 서비스는 서비스의 end-point(접근점)을 API 형태로 외부에 노출하고, 실질적인 세부 사항은 모두 추상화한다. 내부의 구현 로직, 아키텍처와 프로그래밍 언어, 데이터베이스, 품질 유지 체계와 같은 기술적인 사항들은 서비스 API에 의해 철저하게 가려진다.

또한, python이기 때문에 생산성이 굉장히 빠르고, 쉽고 빠르게 코드를 만들 수 있다. 성능의 꼬리표를 달던 python 진영에 FastAPI는 가뭄의 단비이며, 새로운 구세주이다. 하지만 사실 FastAPI가 python 웹 프레임워크 중에서 성능이 좋다일 뿐이지, 절대적으로보면 엄청난 high performance를 보여준다고 할 수는 없다.
공식 블로그에 안내된 fastapi의 장점으로는

  • Node.js, Go와 비슷한 수준으로 빠른 성능을 자랑한다.
  • 개발 속도가 200%~300% 빨라진다.
  • 코드 버그가 40% 감소한다.
  • 쉽게 사용할 수 있다.

fastapi는 web micro framework인 Starlette를 사용하기 때문에 성능이 아주 좋다.

가상환경 설정

python3가 설치되었다는 것을 가정하고 시작한다. 파이썬 어플리케이션은 virtualenv을 사용해 개발된다. lobal하게 python 패키지들을 설치하기 보다는 프로젝트마다 local로 패키지를 설치해주는 것이 좋다. 이것을 가능하게 해주는 것이 바로 virtualenv이다. virtualenv를 통해서 해당 프로젝트의 의존성을 local로 관리할 수 있고, 모듈 버전 관리를 유연하게 할 수 있다.

프로젝트에서 다음 명령어를 치면 가상 환경이 설치된다. venv라는 모듈을 사용해서 venv라는 디렉터리를 만들겠다.

python3 -m venv venv


생성된 가상 환경 폴더 venv에는 파이썬 인터프리터가 설치된 lib폴더와 가상 환경 내에서 상호 작용(가상 환경 활성화/비활성화) 등이 필요한 파일을 저장하는 bin 폴더가 있다.

가상환경 시작해주기

source venv/bin/activate 

가상환경이 활성화되면 해당 환경 내에 있는 파이썬 인터프리터와 패키지를 기본으로 사용한다. 가상환경이 제대로 활성화되었다면, 스크립트 프롬포트 앞에 표시된다.

(venv) machine:/project

가상환경 비활성화 방법은 다음과 같다.

deactivate

스크립트 프롬프트 앞에 표시된 내용이 사라진 것을 볼 수 있다.

machine:/project

FastAPI 설치

pip3 install fastapi

설치가 잘 되었다면 다음 메세지가 출력된다.

현재 프로젝트에 설치된 모든 패키지 목록을 파일로 저장하려면 다음과 같이 freeze명령과 > 연산자를 사용하면 된다.

pip freeze > requirements.txt

'>'는 pip freeze의 결과를 requirements.txt 파일에 저장한다. requiremnets.txt를 보면 local에 설치된 패키지들을 볼 수 있다.
추후에 이 reuqirements.txt를 사용하여 local에 패키지를 설치할 수 있다. 해당 명령어를 사용하면 된다.

pip install -r requirements.txt


python web application은 WSGI라는 것을 사용한다. WSGI를 말하기 전에 CGI에 대해서 먼저 말해야하는데, CGI는 Common Gateway Interface로 web server과 application server 간의 데이터를 주고 받는 interface이다. web server는 단순한 static 처리(file, image, script, css를 던져주는 기능)을 하지만, 동적인 기능(form 처리, 인증, 인가 등)는 web application server에서 처리해야한다. java, python, golang, nodejs 등의 서버가 바로 web application server로 분류되며, golang과 nodejs는 web server를 기본적으로 내장하고 있어 따로 CGI를 설정해줄 필요가 없어, 기본 web 라이브러리만으로도 server가 동작한다. 물론, 내장된 web 라이브러리를 다 까보면 CGI를 구현하고 있는 것을 알 수 있다.
그러나, c,c++,java,python과 같이 web server를 내장하지 않은 언어들은 web server가 필요하고, web server와 해당 언어로 만들어진 코드 간의 interface가 필요하다.
이 interface가 바로 CGI이고, CGI는 어떤 코드를 일컫는게 아니라, 프로토콜, 즉 interface이다. 이에 대한 구현체는 언어마다 상이하고, 누가 만들었는가에 따라서도 상이하다. 중요한 것은 CGI와 web server를 연결하여 우리가 아는 backend server가 되는 것이다.

WSGI는 CGI의 python version 개념으로 web server(nginx, 아파치 등등)과 web application server(flask, django, fastapi)가 서로 통신하기 위한 인터페이스이다. python으로 된 web application server의 python 스크립트를 실행시켜주고, http 데이터를 python 데이터로, python 데이터를 http로 변환해준다고 생각하면 된다.


``
client <--HTTP--> web server <--HTTP--> WSGI(Protocol) <--Convert HTTP to Python object--> python web application server

인터페이스, 즉 추상적인 프로토콜이기 때문에 이를 구현한 구현체가 필요한데, 이것이 바로 gunicorn이다.
WSGI의 구현체가 바로 gunicorn으로 gunicorn을 통해 web application server를 동작시켜 web server와 통신하고, client의 요청을 처리할 수 있다. (물론, web server 없이 gunicorn으로 web application server를 동작시켜 client의 요청을 동적으로 처리할 수 있다.)

client <--HTTP--> web server <--HTTP--> Gunicorn <--Convert HTTP to Python object--> python web application server

이 WSGI을 사용한 프레임워크가 바로 flask와 django이다. WSGI의 가장 큰 단점은 WSGI가 동기적으로 동작하기 때문에 한 번에 하나의 요청만 처리하며, 응답이 즉시 반환된다는 전재를 한다. 이는 롱 풀링, 웹소켓과 같은 HTTP 연결이 장시간 연결되는 경우 처리할 방법이 없다. 또한, WSGI는 동기 전용이기 때문에 멀티스레드 연결 풀을 사용하더라도 응답이 반환될 때까지 각 연결이 차단된다.
WSGI가 나올 때까지만 해도 python2를 사용했으며, asyncio와 같은 비동기 라이브러리가 없었다. 이후 시간이 지나 비동기 처리 방식이 발달하고 fastapi가 등장하게 된다.
fastapi는 WSGI의 업그레이드 버전인 ASGI를 사용한다. ASGI는 WSGI의 방식에서 크게 다를 것은 없고, 비동기 방식인 asyncio를 사용한다는 것이다. 그렇기 때문에 요청에 있어 훨씬 효율적으로 처리할 수 있게 된 것이다.

client <--HTTP--> web server <--Async HTTP--> ASGI(Protocol) <--Async Convert HTTP to Python object--> python web application server

ASGI 또한 인터페이스이지 구현체는 아니다. 구현체가 바로 uvicorn이다. fastapi는 uvicorn을 사용하여 web application server를 구동하여 web server와 비동기 통신을 이루는 것이다.

client <--HTTP--> web server <--Async HTTP--> Uvicorn <--Async Convert HTTP to Python object--> python web application server

이제 fastapi와 uvicorn을 설치해보고 실행시켜보도록 하자.

pip install fastapi uvicorn

api.py라는 파일을 만들어 FastAPI에 새 인스턴스를 생성해보도록 하자.

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

다음의 api.py server를 실행하기 위해서 uvicorn을 실행해보도록 하자.

uvicorn api:app  --reload

uvicorn을 실행할 때 지정하는 인수는 다음과 같다.
1. file:instance: FastAPI 인스턴스가 존재하는 파이썬 파일과 FastAPI 인스턴스를 가지고 있는 변수를 지정한다.
2. --port: 어플리케이션에 접속할 수 있는 포트 번호를 지정
3. --reload: 파일이 변경될 때마다 어플리케이션을 재시작

실행시키면 다음과 같은 로그가 출력된다.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
해당 주소로 이동하면 헬로월드가 짜잔

/docs 주소로 들어가게 되면 해당 페이지가 나타나는데 openapi로 자동 스웨거가 나온다.

try it out을 클릭하고 item_id와 q을 입력하고 실행을 시키면


다음과 같은 결과들이 나오면서 빠르고 쉽게 웹서버 구축이 가능하다.

가장 기본적인 FastAPI 설명과 실행방법을 소개하였다.

0개의 댓글