궁금한게 많은 개발자 노트

[ Python ] FastAPI에 대한 이해 본문

Back End

[ Python ] FastAPI에 대한 이해

궁금한게 많은 개발자 2023. 7. 17. 12:21

우선 기본 코어 서버를 Django로 구축하여 사용 중에 수 많은 모듈들이 하나의 서버에 무겁게 구축되어 있는 상황에서 점점 더 코드 복잡도가 높아져 성능 개선 및 응집도 분산을 위해서 MSA로 넘어가면서, FastAPI라는 API 서버 웹 프레임 워크를 도입했습니다.

 

FastAPI란 python 3.6이상에서 동작하는 표준 python type hint를 바탕으로한 현대적이고 빠른 API 서버 웹 프레임 워크입니다.

Flask와 비슷한 구조를 가지고 있으며, 기본적으로 비동기식으로 작성되어 있어 I/O 병목현상이 자주 일어나는 웹 서버에서 빠른 성능을 보여주고 있어 python API서버로 적합하다고 생각됩니다.

 

FastAPI의 장점은 아래와 같습니다.

기존 Django는 웹 서비스를 만들기 위해 사용한다면, FastAPI는 이름에 맞게 API서버를 만드는데 보다 집중한 프레임워크입니다.

API서버에 적합한 이유로는 빠르게 작성할 수 있고, 빠른 성능/속도를 보장합니다.

빠르게 작성할 수 있는 이유로는 입출력을 정의하고 입출력값의 검증을 Pydantic이라는 라이브러리르 사용하여 빠르고 안전하게 할 수 있기 때문입니다. (Pydnatic은 python validator중에 가장 빠른 성능을 자랑하며, 복잡한 벨리데이션 코드 없이 편하게 사용이 가능합니다.) 또한 작성한 API는 Swagger를 통해 자동으로 문서가 생성되며 손쉽게 테스트도 가능합니다.

 

또한, 이름에서 유추할 수 있듯 파이썬 웹 프레임워크 중 가장 빠르다고 알려져있습니다. NodeJS 및 Go와 대등할 정도로 높은 성능을 자랑할 수 있는 이유는 FastAPI가 내부적으로 Starlette라는 비동기 프레임워크를 사용하기 때문입니다.

FastAPI는 Starlette을 사용함으로써 WSGI 및 비동기 ASGI를 완벽하게 지원합니다. 기존 Django는 기본적으로 동기 통신을 기반으로 하기 때문에, 요청마다 thread를 구동하여 처리한다고 해도 비동기식보다는 낮은 효율을 보일 것입니다.

python은 nodejs/golang과 같이 web server를 내장하고 있지 않기 때문에 web server가 필요하고 해당 언어로 만들어진 interface(CGI)가 필요합니다. 이 때 WSGI는 CGI의 python version개념으로 web server(nginx, apache)와 server(fastapi)가 서로 통신하기 위한 인터페이스입니다. (python으로 된 web app의 스크립트를 실행시키고, http데이터와 python데이터의 변환을 도와줍니다) interface이므로 구현체가 필요한데 이것이 gunicorn입니다. 

WSGI의 단점은 동기적으로 동작하기 때문에 한번에 하나의 요청만 처리. FastAPI는 비동기라이브러리(asyncio)를 완벽하게 지원하는 ASGI를 사용함으로써 요청에 있어 훨씬 효율적으로 처리할 수 있습니다. 이러한 ASGI의 구현체는 unvicorn입니다.

# Request → 웹서버(Apachi, GWS등) → WSGI 미들웨어 → WSGI를 지원하는 앱어플리케이션 프레임워크 (Django 등)

WSGI, ASGI가 필요한 이유
Web Server(NginX, Apache)와 프레임워크(Django, FastAPI), 애플리케이션을 연결해주는 Python 표준 API.
즉, 이 3가지 컴포넌트를 연결해주는 표준 인터페이스. Web Server와 Python계열의 프레임워크가 통신할 수 있게 해주는 미들웨어(인터페이스)가 필요하므로 WSGI/ASGI가 필요합니다.
(웹서버가 애플리케이션을 이해하기 위해 필요한 미들웨어 역할)

 

 

FastAPI의 특징으로는  Django에서 지원하는 ORM을 FastAPI에서는 지원하지 않습니다. 하지만 ORM의 장점도 있지만 단점도 존재하듯, ORM이 없어서 생기는 장점도 있다고 생각합니다. 또한, FastAPI에서 DBMS와의 손쉬운 연동을 지원하기 위해 SQLAlchemy라는 라이브러리를 사용하여 ORM을 사용할 수 있습니다.

SQLAlchemy란 python에서 사용할 수 있는 ORM중 하나이며, 대개 ORM 라이브러리와 다른 점 중 하나로는 자체적으로 스키마를 생성하지 않는다는 것입니다. 그렇기 때문에 애플리케이션 코드나 데이터베이스 시스템에 간섭하지 않는 다는 특징이 있습니다.

 

위에서 말했던 장점들 이외에 단점들도 존재합니다.

DJango가 풀스택 프레임워크라는 것과 역사를 감안하더라도 Django의 서드파티 라이브러리 양은 압도적으로 많고 커뮤티니도 단단합니다. 대부부의 유지보수가 잘 되고 있는 python 라이브러리 Redis, Celery, Pytest등은 django 서드 파티가 존재합니다.

하지만, FastAPI는 역사가 짧아 이러한 서드파티 라이브러리를 직접 작성해야할 수도 있습니다.

위에서 말한 라이브러리의 문제와 같이 레퍼런스가 부족하여 참고할 만한 코드가 부족할 수 있습니다.

하지만 이러한 단점들은 자유도가 높다는 점에서 장점으로 승화될 수 있다고 생각합니다. Django가 가지는 종속성에서 벗어나 다른 서비스나 프레임워크에 쉽게 결합될 수 있고 성능이 좋은 API서버로써의 역할은 충분하다고 생각합니다.

 

'Back End' 카테고리의 다른 글

[ Database ] Elasticsearch vs RDBMS  (0) 2023.07.22
[ Architecture ] Microservice와 Monolithic  (0) 2023.07.22
[ Python ] Django에 대한 이해  (0) 2023.07.17
[ Django ] psycopg2 psycopg2-binary 차이  (0) 2023.05.16
RDBMS와 NoSQL의 차이  (0) 2023.05.09
Comments