-
Notifications
You must be signed in to change notification settings - Fork 0
FastAPI
FastAPI는 Python의 타입 힌트를 기반으로 API를 구축하기 위해 설계된 모던하고 빠른 고성능 웹 프레임워크
-
문제
과거 파이썬은 데이터 분석과 머신러닝 생태계에서 압도적이었으나, 대규모 트래픽을 감당하는 웹 서버로서는 타 언어(Node.js, Go 등)에 비해 아쉬웠음-
비동기(Async) 처리 부재:
기존의 Django와 Flask는 태생적으로 동기식(WSGI) 아키텍처 기반이라, 동시 요청시 I/O 병목 현상 발생 -
AI/ML 모델 서빙 수요 확산:
기존의 Java(Spring)나 Node.js의 경우 Python 기반의 AI 모델과의 호환을 위해 API 브릿지를 두는 등 비효율이 초래되었음.
기존 파이썬 웹 프레임워크(Django, Flask)를 쓰자니 모델이 무거운 추론 작업을 하는 동안 서버 전체가 멈추는 문제 발생
-
비동기(Async) 처리 부재:
-
해결책
-
고성능 비동기 처리:
구형 WSGI 대신 최신 비동기 표준(ASGI)를 채택하여 이벤트 루프 기반으로 동시 트래픽 처리 성능을 높임. -
타입 힌트:
Pydantic(Rust 코어) 엔진을 활용해서 타입 안정성을 높임 -> Swagger 동적 렌더링
-
고성능 비동기 처리:
ORM, 인증, Admin 등 필수 기능이 내장된 풀스택 프레임워크
빠른 초기 개발
RDB 기반의 콘텐츠 중심 서비스, 빠른 MVP(최소 기능 제품) 개발시
검증된 엔터프라이즈 생태계, 강력한 트랜잭션 관리, 엄격한 객체지향(OOP) 및 디자인 패턴 컨벤션
견고함안정성성숙한 생태계
복잡한 도메인 로직, 대규모 다인원 협업 및 장기 유지보수가 필수적인 엔터프라이즈급 코어 시스템 개발시
비동기 서버 성능
실시간통신
채팅, 스트리밍 등 실시간 양방향 통신(WebSockets) 위주의 서비스나 프론트/백엔드 개발 언어를 단일화하여 리소스를 효율적으로 운영하고자 할 때
코드를 작성하고 서버를 실행한 뒤
/docs경로에 Swagger UI가 자동 생성!
메커니즘:
- 런타임에 표준 타입 힌트 분석(Pydantic 덕분)
- JSON Schema 동적으로 자동 생성
- 화면에 렌더링
코드를 수정하고 저장하면, 서버를 수동으로 재시작할 필요 없이 즉시 최신 상태가 반영(Spring과 달라서 놀랐습니다)
메커니즘:
- ASGI 서버(
Uvicorn)의--reload옵션으로 내부적으로 파일 시스템 변경 이벤트(I/O 감지) 추적 - 소스코드 변경 감지시 프로세스 재시작(인터프리터 언어라 재시작 과정이 빠름)
클라이언트가 보낸 데이터(JSON)의 유효성을 검사 및 직렬화/역직렬화 자동화
데이터 타입 불일치시422 Unprocessable Entity에러를 클라이언트에게 반환
-
문제: 기존 WSGI의 한계 (Blocking I/O)
하나의 요청이 DB 응답을 기다리는 동안, 해당 스레드는 멈춰 있는 블로킹되어 동시 접속 처리가 힘듦
* 왜 웹 프레임워크를 만들면서 동기처리로 했을까?
-> 옛날에는 동기식으로 충분했다고 한다.. python에 async가 추가된 것도 2014년이라 그 전에 만들어진 Django와 Flask는 동기 기반으로 작성됐다고 -
해결책: ASGI(이벤트 루프 기반)
이벤트 루프를 통해 하나의 요청이 DB 응답을 기다리는 동안(I/O 작업) 즉시 다른 유저의 요청을 비동기 처리 -
구현체:
UvicornASGI는 단지 '표준 규약(문서)', 이에 맞춰 실제 트래픽을 받고 파이썬 코드를 실행해 주는 웹 서버가Uvicorn
JS, Python 같은 싱글 스레드 기반 언어에서 비동기 처리를 하기 위한 아키텍처 패턴
운영체제 interrupt 패러다임을 언어차원에서 구현한 것 같습니다.
스케줄링을 커널 차원이 아니라 언어 차원에 적용해서 운영체제 멀티스레드 대비 메모리 효율이 좋다고 합니다. 멀티 스레드는 OS 스레드 할당시 고정으로 1~2MB의 스택을 미리 할당하기 때문에 유저수가 많아지면 과하게 메모리를 잡아먹는 문제가 있다고...