Tools/FastAPI

FastAPI의 구조

칼쵸쵸 2024. 11. 13. 17:40
반응형

FastAPI와 Uvicorn

FastAPI란?

FastAPI는 ASGI(Application Server Gateway Interface) 표준을 기반으로 동작하며, 일반적으로 Uvicorn이나 Hypercorn 같은 ASGI 서버와 함께 사용됩니다.

 

FastAPI의 특징은 다음과 같습니다:

  1. ASGI 서버 의존성:
    • FastAPI는 ASGI 표준에 맞춰 설계된 프레임워크입니다. Tomcat처럼 Java 기반의 웹 서버를 포함하는 것이 아니라, Python 생태계에서 널리 사용되는 Uvicorn 같은 경량 ASGI 서버를 통해 요청을 처리합니다.
  2. 비동기 처리 지원:
    • FastAPI는 Python의 asyncio 기반으로 동작하며, 비동기 처리를 기본으로 지원합니다. Tomcat과는 달리, Python의 비동기 모델과 잘 통합됩니다.
  3. 간단한 설정:
    • Tomcat처럼 복잡한 설정이 필요하지 않습니다. Uvicorn 같은 ASGI 서버를 설치하고 FastAPI 애플리케이션을 실행하면 됩니다.
  4. 확장 가능성:
    • 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의 관계

  1. FastAPI:
    • FastAPI는 Python으로 작성된 ASGI 프레임워크로, RESTful API나 비동기 웹 애플리케이션을 쉽게 개발할 수 있게 해줍니다.
    • 요청과 응답을 처리하는 로직과 애플리케이션을 개발하는 데 집중합니다.
    • 자체적으로 요청을 실행하거나 네트워크 요청을 처리하는 기능(서버 기능)을 포함하지 않습니다.
  2. Uvicorn:
    • Uvicorn은 Python으로 작성된 경량 ASGI 서버입니다.
    • FastAPI와 같은 ASGI 프레임워크가 실제로 동작할 수 있도록 네트워크 요청을 처리하고 FastAPI 애플리케이션으로 전달합니다.
    • HTTP 요청, WebSocket 지원, 이벤트 루프 관리 등 서버 역할을 수행합니다.

동작 구조

FastAPI와 Uvicorn이 협력하는 방식은 다음과 같습니다:

  1. FastAPI 애플리케이션 작성:
    • 개발자는 FastAPI를 사용하여 API 엔드포인트를 정의합니다.
    • 예: @app.get("/")로 엔드포인트를 정의.
  2. Uvicorn으로 실행:
    • Uvicorn은 ASGI 서버 역할을 하며, FastAPI 애플리케이션을 실행합니다.
    • 클라이언트 요청이 들어오면, Uvicorn이 요청을 받아 ASGI 표준에 따라 FastAPI 애플리케이션에 전달합니다.
  3. FastAPI가 요청 처리:
    • FastAPI는 전달받은 요청을 처리하고 적절한 응답을 생성합니다.
    • 생성된 응답은 Uvicorn을 통해 클라이언트에게 반환됩니다.

왜 분리되어 있을까?

FastAPI와 Uvicorn이 분리되어 있는 이유는 다음과 같습니다:

  1. 유연성:
    • FastAPI는 특정 ASGI 서버(Uvicorn)에 의존하지 않고, 다른 ASGI 서버(Hypercorn, Daphne 등)와도 사용할 수 있습니다.
  2. 경량 설계:
    • FastAPI는 프레임워크에 서버 기능을 포함하지 않으므로 경량화되고 단순합니다.
  3. 역할 분리:
    • Uvicorn은 ASGI 서버의 역할에만 집중하고, FastAPI는 웹 애플리케이션 로직 구현에만 집중합니다.
  • Uvicorn은 FastAPI 내부에 포함되어 있지 않습니다.
  • Uvicorn은 FastAPI와 같은 ASGI 애플리케이션을 실행하기 위한 독립적인 ASGI 서버입니다.
  • FastAPI와 Uvicorn은 각각 역할이 다르며 독립적으로 설계되어 협력하여 작동합니다.

 

Spring과 FastAPI의 요청 처리 비교

1. 기본 구조와 서버 동작 방식

Spring (Java 기반)

  • Spring은 Servlet 기반으로 동작하며, 일반적으로 Tomcat 같은 서블릿 컨테이너를 통해 요청을 처리합니다.
  • 요청 처리 흐름:
    1. 클라이언트 요청 → Tomcat(또는 다른 서블릿 컨테이너)이 요청 수신.
    2. 서블릿 컨테이너가 요청을 Spring DispatcherServlet에 전달.
    3. DispatcherServlet이 요청을 컨트롤러에 매핑하여 처리.
    4. 컨트롤러에서 처리된 응답을 다시 DispatcherServlet으로 반환.
    5. DispatcherServlet이 응답을 클라이언트에게 전달.
  • Tomcat은 HTTP 요청과 스레드 풀을 관리하여, 동시 요청 처리를 담당합니다.

FastAPI (Python 기반)

  • FastAPI는 ASGI 표준을 기반으로 설계되었으며, 일반적으로 Uvicorn 같은 ASGI 서버와 함께 사용됩니다.
  • 요청 처리 흐름:
    1. 클라이언트 요청 → Uvicorn이 요청 수신.
    2. Uvicorn이 ASGI 프로토콜에 따라 요청을 FastAPI 애플리케이션으로 전달.
    3. FastAPI 애플리케이션이 요청을 처리하고 응답 생성.
    4. 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