반응형
FastAPI와 Uvicorn
FastAPI란?
FastAPI는 ASGI(Application Server Gateway Interface) 표준을 기반으로 동작하며, 일반적으로 Uvicorn이나 Hypercorn 같은 ASGI 서버와 함께 사용됩니다.
FastAPI의 특징은 다음과 같습니다:
- ASGI 서버 의존성:
- FastAPI는 ASGI 표준에 맞춰 설계된 프레임워크입니다. Tomcat처럼 Java 기반의 웹 서버를 포함하는 것이 아니라, Python 생태계에서 널리 사용되는 Uvicorn 같은 경량 ASGI 서버를 통해 요청을 처리합니다.
- 비동기 처리 지원:
- FastAPI는 Python의 asyncio 기반으로 동작하며, 비동기 처리를 기본으로 지원합니다. Tomcat과는 달리, Python의 비동기 모델과 잘 통합됩니다.
- 간단한 설정:
- Tomcat처럼 복잡한 설정이 필요하지 않습니다. Uvicorn 같은 ASGI 서버를 설치하고 FastAPI 애플리케이션을 실행하면 됩니다.
- 확장 가능성:
- Tomcat은 Java 기반 애플리케이션 서버로 Java 서블릿과 JSP를 처리하지만, FastAPI는 Python 코드를 통해 REST API나 웹소켓 같은 현대적인 웹 애플리케이션을 쉽게 개발할 수 있도록 설계되었습니다.
FastAPI와 함께 사용하는 일반적인 설정은 다음과 같습니다:
pip install fastapi uvicorn
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello World"}
# Uvicorn ASGI 서버를 사용해 FastAPI 애플리케이션 실행
uvicorn main:app --host 0.0.0.0 --port 8000
FastAPI는 별도로 ASGI(Application Server Gateway Interface) 표준을 준수하는 웹 프레임워크이고, Uvicorn은 FastAPI와 같은 ASGI 애플리케이션을 실행하기 위한 독립적인 ASGI 서버입니다.
FastAPI와 Uvicorn의 관계
- FastAPI:
- FastAPI는 Python으로 작성된 ASGI 프레임워크로, RESTful API나 비동기 웹 애플리케이션을 쉽게 개발할 수 있게 해줍니다.
- 요청과 응답을 처리하는 로직과 애플리케이션을 개발하는 데 집중합니다.
- 자체적으로 요청을 실행하거나 네트워크 요청을 처리하는 기능(서버 기능)을 포함하지 않습니다.
- Uvicorn:
- Uvicorn은 Python으로 작성된 경량 ASGI 서버입니다.
- FastAPI와 같은 ASGI 프레임워크가 실제로 동작할 수 있도록 네트워크 요청을 처리하고 FastAPI 애플리케이션으로 전달합니다.
- HTTP 요청, WebSocket 지원, 이벤트 루프 관리 등 서버 역할을 수행합니다.
동작 구조
FastAPI와 Uvicorn이 협력하는 방식은 다음과 같습니다:
- FastAPI 애플리케이션 작성:
- 개발자는 FastAPI를 사용하여 API 엔드포인트를 정의합니다.
- 예: @app.get("/")로 엔드포인트를 정의.
- Uvicorn으로 실행:
- Uvicorn은 ASGI 서버 역할을 하며, FastAPI 애플리케이션을 실행합니다.
- 클라이언트 요청이 들어오면, Uvicorn이 요청을 받아 ASGI 표준에 따라 FastAPI 애플리케이션에 전달합니다.
- FastAPI가 요청 처리:
- FastAPI는 전달받은 요청을 처리하고 적절한 응답을 생성합니다.
- 생성된 응답은 Uvicorn을 통해 클라이언트에게 반환됩니다.
왜 분리되어 있을까?
FastAPI와 Uvicorn이 분리되어 있는 이유는 다음과 같습니다:
- 유연성:
- FastAPI는 특정 ASGI 서버(Uvicorn)에 의존하지 않고, 다른 ASGI 서버(Hypercorn, Daphne 등)와도 사용할 수 있습니다.
- 경량 설계:
- FastAPI는 프레임워크에 서버 기능을 포함하지 않으므로 경량화되고 단순합니다.
- 역할 분리:
- Uvicorn은 ASGI 서버의 역할에만 집중하고, FastAPI는 웹 애플리케이션 로직 구현에만 집중합니다.
- Uvicorn은 FastAPI 내부에 포함되어 있지 않습니다.
- Uvicorn은 FastAPI와 같은 ASGI 애플리케이션을 실행하기 위한 독립적인 ASGI 서버입니다.
- FastAPI와 Uvicorn은 각각 역할이 다르며 독립적으로 설계되어 협력하여 작동합니다.
Spring과 FastAPI의 요청 처리 비교
1. 기본 구조와 서버 동작 방식
Spring (Java 기반)
- Spring은 Servlet 기반으로 동작하며, 일반적으로 Tomcat 같은 서블릿 컨테이너를 통해 요청을 처리합니다.
- 요청 처리 흐름:
- 클라이언트 요청 → Tomcat(또는 다른 서블릿 컨테이너)이 요청 수신.
- 서블릿 컨테이너가 요청을 Spring DispatcherServlet에 전달.
- DispatcherServlet이 요청을 컨트롤러에 매핑하여 처리.
- 컨트롤러에서 처리된 응답을 다시 DispatcherServlet으로 반환.
- DispatcherServlet이 응답을 클라이언트에게 전달.
- Tomcat은 HTTP 요청과 스레드 풀을 관리하여, 동시 요청 처리를 담당합니다.
FastAPI (Python 기반)
- FastAPI는 ASGI 표준을 기반으로 설계되었으며, 일반적으로 Uvicorn 같은 ASGI 서버와 함께 사용됩니다.
- 요청 처리 흐름:
- 클라이언트 요청 → Uvicorn이 요청 수신.
- Uvicorn이 ASGI 프로토콜에 따라 요청을 FastAPI 애플리케이션으로 전달.
- FastAPI 애플리케이션이 요청을 처리하고 응답 생성.
- Uvicorn이 FastAPI에서 생성된 응답을 클라이언트에게 반환.
2. 동기 vs 비동기 처리
Spring
- 기본적으로 동기 처리:
- Spring의 Servlet API는 기본적으로 요청당 하나의 스레드를 할당하는 스레드 기반 동기 모델입니다.
- 하지만, Spring WebFlux를 사용하면 비동기 처리가 가능하며, 이는 Reactor와 같은 비동기 스트림 라이브러리를 사용합니다.
- 장점:
- 전통적인 동기 요청-응답 처리에 최적화.
- JVM의 멀티스레드 기능을 활용.
- 단점:
- 동시 요청이 많아지면 스레드 풀 관리가 어려워질 수 있음.
- 비동기 처리를 위해 별도의 WebFlux 설정이 필요.
FastAPI
- 비동기 처리 지원:
- FastAPI는 Python의 asyncio를 기반으로 설계되어 기본적으로 비동기 요청 처리를 지원합니다.
- FastAPI에서 작성된 모든 엔드포인트는 동기 또는 비동기 방식으로 작동할 수 있습니다.
- 장점:
- 많은 동시 요청을 효율적으로 처리 가능 (비동기 I/O).
- 비동기 함수(async def)를 쉽게 정의하여 네트워크 대기 시간을 줄일 수 있음.
- 단점:
- CPU 집약적인 작업에는 적합하지 않음(비동기 처리 대신 멀티프로세스를 활용해야 함).
3. 확장성과 구성
Spring
- 모듈화와 유연성:
- Spring은 다양한 모듈(Spring MVC, Spring Boot, Spring Data 등)을 통해 대규모 애플리케이션 개발에 적합합니다.
- 클래스 기반 구성:
- Java의 강타입 시스템과 객체지향적 설계를 활용하여 코드가 안정적이고 명확합니다.
- 대규모 애플리케이션에 적합:
- 복잡한 비즈니스 로직과 엔터프라이즈급 애플리케이션 개발에 강점.
FastAPI
- 경량화와 간결성:
- FastAPI는 경량 프레임워크로 설계되어 간단한 REST API나 비동기 기반 애플리케이션에 적합합니다.
- Pythonic 구성:
- Python의 동적 타이핑과 pydantic을 활용하여 JSON 스키마 검증 및 데이터 유효성 검사가 간단합니다.
- 속도와 개발 생산성:
- 빠른 개발 속도와 경량 애플리케이션에 최적화되어 있음.
4. 요청 매핑 및 코드 작성 예시
Spring:
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Spring!";
}
}
FastAPI
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
async def say_hello():
return {"message": "Hello, FastAPI!"}
5. 성능 비교
- Spring:
- 스레드 기반으로 안정적인 성능을 제공.
- 비동기 처리가 필요한 경우 WebFlux를 추가로 설정해야 함.
- FastAPI:
- 비동기 요청 처리를 기본적으로 지원하므로 IO 바운드 작업에서 높은 성능을 발휘.
- Uvicorn이나 Hypercorn의 경량 아키텍처로 빠른 요청-응답 처리가 가능.
반응형
'Tools > FastAPI' 카테고리의 다른 글
FastAPI의 비동기 요청 처리 (0) | 2024.11.27 |
---|