목차 LIST
FastAPI
공식문서에는 FastAPI에 대한 설명이 아래와 같이 적혀있습니다.
FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한
Python3.6+의 API를 빌드하기 위한 웹 프레임워크입니다.
- 현대적 : FastAPI는 최신 프로그래밍 기법을 사용하여 설계되었음
- 빠름 : 우수한 성능
- 파이썬 표준 타입 힌트에 기초 : Python 3.6 이상 버전에서 도입된 타입 힌트 기능을 활용
* 타입힌트 : 변수나 함수의 입력 및 반환 값의 타입을 명시하는 것 - Python3.6 이상 버전을 사용하여 API를 개발하기 위한 도구이다.
즉, FastAPI는 최신 파이썬 기술을 활용하여 고성능의 API를 효율적으로 개발할 수 있게 해주는 현대적인 웹 프레임워크입니다.
FastAPI는 속도가 빠르다는 대표적인 특징을 가집니다. Starlette와 Pydantic 덕분에 NodeJS 및 GO와 대등할 정도로 매우 높은 성능을 가진다고 명시되어 있는데, 하나씩 살펴보겠습니다.
Starlette
starlette(스탈렛) 공식 사이트에는 "Starlette은 가벼운 ASGI 프레임워크/툴킷으로, Python에서 비동기 웹 서비스를 구축하기에 이상적입니다." 라고 안내하고 있습니다. 즉, starlette은 ASGI라는 규격을 따르는 웹 프레임워크입니다.
- 라우팅, 요청/응답 처리, 웹소켓 지원 등 웹 애플리케이션을 구축하기 위한 기본적인 기능을 제공합니다.
- Starlette의 주요 장점 중 하나는 지비동기 지원으로 데이터베이스 쿼리와 같은 I/O 바운드 작업에서 효율성을 높여줍니다.
- FastAPI는 Starlette 기반 구조와 비동기 지원을 활용합니다. 즉, FastAPI는 Starlette의 핵심 기능 위에 추가 기능을 덧붙여 사용자에게 풍부한 기능을 제공하면서 Starlette의 성능 이점을 유지합니다.
그럼 이제 ASGI에 대해 알아보겠습니다.
ASGI란?
ASGI를 이해하기 위해서는 먼저 웹 서버 게이트웨이 인터페이스(WSGI:Web Server Gateway Interface)를 알아야 합니다. 오래전부터 파이썬 웹 애플리케이션은 웹 서버와 통신할 때 웹 서버 게이트웨이 인터페이스(WSGI) 표준을 따라왔습니다. 이는 2003년에 처음 도입됐으며, 파이썬을 사용한 웹 개발의 초석이 되었습니다.
시간이 흘러 파이썬에는 비동기 작업을 처리하기 위한 기본 구문이 생겼는데, WSGI는 기본적으로 동기 동작을 전제하는 표준이기 때문에 비동기의 성능이나 효율성이 떨어진다는 단점이 있습니다.
그래서 나온 것이 ASGI(Asynchronous Server Gateway Interface)라는 비동기 서버 게이트웨이 인터페이스 입니다. ASGI는 WSGI와 마찬가지로 파이썬 웹 애플리케이션과 웹 서버 간의 공통적인 인터페이스를 기술합니다. ASGI는 여러 개의 비동기 이벤트를 허용하며, 동기 앱과 비동기 앱을 모두 지원합니다. 즉, ASGI를 사용해 새로운 비동기 웹 앱을 구축할 수도 있고 오래된 동기 WSGI 웹 앱을 마이그레이션 할 수도 있습니다.
WSGI의 작동 방식
WSGI를 통해 웹 서버가 파이썬 애플리케이션의 특정 함수(application or app)을 호출하여 웹 요청을 처리하고 응답을 생성할 수 있게 합니다. WSGI의 application 함수는 두 개의 매개변수를 받습니다.
- environ : WSGI에서 웹 서버가 제공하는 환경 변수와 현재 HTTP 요청에 대한 정보가 포함된 사전형태의 데이터
ex) REQUEST_METHOD, PATH_INFO, SERVER_NAME, SERVER_PORT, ... - start_response : WSGI에서 HTTP 응답의 상태 코드와 헤더를 설정하여 응답 전송 과정을 시작하는 함수
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b'Greetings universe']
Flask와 같은 WSGI 호환 웹 프레임워크는 자체적으로 appliction 함수를 제공하여 이 함수의 모든 구성요소가 자동으로 연결됩니다.
WSGI의 단점
- 한 번에 하나의 요청과 응답만 처리하며, 응답이 즉시 반환된다고 전제한다.
따라서, 장시간 지속되는 연결을 처리할 방법이 없다. - WSGI는 동기 전용이다. 멀티스레드를 사용하더라도 응답이 반환될 때까지 연결이 차단된다.
참고) 웹 서버 : 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 수신하고, 요청에 대해 여러 형태로 응답하는 소프트웨어로 예시로는 Apache HTTP Server, Nginx, Apache Tomcat, IIs 등이 있습니다.
ASGI의 작동 방식
WSGI와 비슷하게 application 함수를 정의하지만, async 함수이며 매개변수는 3개를 사용합니다.
- scope : 현재 요청에 대한 정보가 포함된 사전으로, WSGI의 environ과 비슷하다.
- send : 애플리케이션이 클라이언트로 메시지를 돌려보내는데 사용되는 비동기 함수로 이 함수를 통해 애플리케이션은 HTTP 응답의 시작, 헤더, 본문 등을 클라이언트에게 전송할 수 있다.
- receive : 애플리케이션이 클라이언트로부터 메시지를 수신하는데 사용된다. 예를 들어, WebSocket 연결에서 클라이언트로부터 오는 데이터를 받는데 사용할 수 있다.
async def application(scope, receive, send):
# HTTP 응답의 시작을 나타냄
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'content-type', b'text/plain'],
],
})
# HTTP 응답의 본문
await send({
'type': 'http.response.body',
'body': b'Hello, world!',
})
ASGI 의 가장 큰 특징은 함수 전반에서 비동기를 사용한다는 것입니다. 함수는 async이며 HTTP 헤더와 응답을 별도의 두 가지 await send() 명령으로 보내기 때문에 send 명령은 아무것도 차단하지 않습니다.
Pydantic
FastAPI의 고성능의 두 번째 특징인 pydantic에 대해 알아보겠습니다.
공식문서를 살펴보면, "Pydantic은 Python에서 가장 널리 사용되는 데이터 유효성 검증 라이브러리" 라고 소개합니다.
왜 데이터 유효성 검증하는 라이브러리가 빠른 성능에 기여하는지 알아보겠습니다.
- 데이터 검증 및 직렬화 최적화 : Pydantic은 데이터 검증 및 직렬화(데이터 구조를 문자열 형태로 변환) 과정을 효율적으로 처리합니다. 이는 FastAPI가 요청을 빠르게 분석하고 응답 데이터를 신속하게 생성하는데 도움을 줍니다.
- 타입 힌트와 통합 : Pydantic은 Python의 타입 힌트와 밀접하게 통합되어 있어 명확한 타입 정의를 사용할 수 있게 합니다. 이를 통해 런타임 오류를 줄이고 성능을 개선합니다.
- 오류 처리 : Pydantic은 유효성 검증을 통해 발생할 수 있는 오류를 잡아내고, 에러 메시지로 반환하여 안정적인 성능을 유지하는데 기여합니다.
- 코드의 간결성과 유지보수성 : Pydantic을 사용하면 데이터 모델을 쉽게 유지보수 할 수 있습니다.
예시)
from datetime import datetime
from typing import Tuple
from pydantic import BaseModel
class Delivery(BaseModel):
timestamp: datetime
dimensions: Tuple[int, int]
@validator("timestamp", pre=True, always=True)
def parse_timestamp(cls, value):
if isinstance(value, str):
return datetime.fromisoformat(value)
return value
m = Delivery(timestamp='2020-01-02T03:04:05Z', dimensions=['10', '20'])
print(repr(m.timestamp))
#> datetime.datetime(2020, 1, 2, 3, 4, 5, tzinfo=TzInfo(UTC))
print(m.dimensions)
#> (10, 20)
Uvicorn
공식 홈페이지에 따르면, Uvicorn은 파이썬을 위한 ASGI 웹 서버 구현체(implementation)라고 합니다.
최근까지 파이썬은 비동기 프레임워크를 위한 최소한의 저수준 서버/애플리케이션 인터페이스가 부족했지만, ASGI의 등장으로 파이썬의 여러 비동기 웹 프레임워크들이 서로 호환 가능한 도구와 라이브러리를 공유하고 개발할 수 있게 되었습니다.
ASGI(Asynchronous Server Gateway Interface) 사양을 구현한 가벼운 고성능 ASGI 서버입니다.
- Uvicorn은 웹 프레임워크가 아니며, ASGI 애플리케이션을 실행하기 위한 서버 역할을 합니다.
- 예를 들어, FastAPI나 Starlette과 같은 ASGI 호환 웹 프레임워크를 Uvicorn을 사용하여 실행할 수 있습니다.
참고) Gunicorn
공식 홈페이지에 따르면, Gunicorn은 'Green Unicorn'으로 UNIX용 Python WSGI HTTP 서버라고 합니다. Gunicorn 서버는 다양한 웹 프레임워크와 광범위하게 호환됩니다.
Conclusion
FastAPI의 가장 큰 특징은 빠르다는 것이고, 이를 위해 Starlette(ASGI)와 Pydantic을 사용합니다.
References
👍 "파이썬 웹 개발의 미래" ASGI의 개념과 활용 방법 - IT WORLD
'프로그래밍 언어' 카테고리의 다른 글
빈약한 도메인 모델(Anemic Domain Model) (0) | 2023.09.10 |
---|---|
단위 테스트(Pytest, Mock)란 무엇인가? (0) | 2023.09.04 |
Python - SQLAlchemy 간단 정리 (0) | 2023.08.22 |
Python Thread는 블로킹I/O에 사용한다. GIL이란? (0) | 2023.08.20 |
Python subprocess 모듈 (0) | 2023.08.20 |
댓글