[ Python – FastAPI ] 웹 서버 구축과 Routing 이해하기

이번 포스팅에서는 FastAPI를 이용하여 기본 웹 서버를 구축하는 방법을 알아보겠습니다.

특히 이번 포스팅에서는 Routing을 중점적으로 다루겠습니다.


기본 웹 서버 구축

웹 서버 구축이란?

웹 서버 구축이란, 사용자가 웹 브라우저를 통해 웹 페이지에 접속할 수 있도록 서버를 설정하는 것을 의미합니다.

웹 서버는 클라이언트(주로 웹 브라우저)로부터 요청을 받아 이를 처리하고, 적절한 응답을 반환하는 역할을 합니다.

기본 웹 서버 구축은 이러한 요청과 응답의 과정을 이해하고 설정하는 첫 단계입니다.

[FastAPI] 기초

FastAPI 소개

FastAPI는 기존의 Flask나 Django와 비교했을 때, 더 빠른 성능과 간결한 코드 작성을 제공하는 것이 특징입니다.

특히 Python의 타입 힌트를 적극 활용하여 자동으로 데이터 검증을 수행하고, 개발자가 별도로 스키마를 정의하지 않아도 API 문서를 자동 생성해주는 장점이 있습니다.

또한 비동기(async/await)를 기본적으로 지원하기 때문에, 대량의 요청을 처리하는 API 서버나 AI 모델 추론 서버에서도 효율적으로 사용할 수 있습니다.


FastAPI를 이용한 웹 서버 구축

1. FastAPI 설치

pip install fastapi uvicorn

2. 기본 웹 서버 구축

from fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():
return {"message": "Hello, World!"}

서버 실행

uvicorn main:app --reload

접속 URL

http://127.0.0.1:8000

Routing 소개

Routing 이란?

라우팅은 웹 애플리케이션에서 URL 경로에 따라 클라이언트의 요청을 적절한 처리기로 전달하는 것을 의미합니다.

즉, 사용자가 특정 URL로 요청을 보내면, 서버는 해당 요청을 받아 적절한 응답을 반환하는 역할을 합니다.

[FastAPI] Routing 소개

라우팅의 중요성

경로 관리: 다양한 URL 요청을 체계적으로 관리 가능
가독성 향상: 기능별 코드 분리 가능
유지보수 용이: 특정 기능 수정 시 영향 범위 최소화

실제 서비스에서는 단순히 URL을 나누는 것뿐만 아니라, 기능 단위로 API를 설계하는 것이 중요합니다.

예를 들어, 사용자 관련 기능은 /users, 상품 관련 기능은 /products와 같이 도메인 기준으로 라우팅을 구성하면 API 구조를 더 직관적으로 만들 수 있습니다.

이러한 구조는 프론트엔드와 협업할 때도 명확한 기준이 되어, 유지보수성과 확장성을 높이는 데 큰 도움이 됩니다.


기본 Routing 구현

FastAPI에서 기본적인 Routing 설정 방법을 알아보겠습니다.

from fastapi import FastAPIapp = FastAPI()@app.get("/")
def home():
return {"message": "Home Page"}@app.get("/about")
def about():
return {"message": "About Page"}@app.get("/contact")
def contact():
return {"message": "Contact Page"}

결과

각 URL에 따라 다음과 같은 응답을 확인할 수 있습니다.

/ → Home Page
/about → About Page
/contact → Contact Page

URL의 Parameter 처리 방법

URL Parameter란?

URL 파라미터는 URL의 일부로 전달되는 값을 의미합니다.

예를 들어, /users/{user_id} 경로에서 {user_id}가 URL 파라미터입니다.


사용법

from fastapi import FastAPIapp = FastAPI()@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}

요청 예시

/users/1 → {"user_id": 1}
/users/42 → {"user_id": 42}

복수 URL 파라미터

@app.get("/products/{category}/{product_id}")
def get_product(category: str, product_id: int):
return {
"category": category,
"product_id": product_id
}

유효성 검사

FastAPI는 타입 기반으로 자동 유효성 검사를 수행합니다.

@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}

만약 숫자가 아닌 값이 들어오면 자동으로 422 에러가 발생합니다.


Query Parameter

URL Parameter 외에도 Query Parameter를 사용할 수 있습니다.

@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}

요청 예시

/items/?skip=5&limit=20

Routing Module (APIRouter) 사용

Routing Module 이란?

Routing Module은 라우트를 모듈화하여 관리하는 구조입니다.

FastAPI에서는 APIRouter를 사용하여 기능별로 라우팅을 분리할 수 있습니다.


폴더 구조

fastapi_app
├── app
│ ├── routers
│ │ ├── user.py
│ │ ├── product.py
│ ├── main.py

1. user.py 생성

from fastapi import APIRouterrouter = APIRouter()@router.get("/users/list")
def get_users():
return {"message": "User list"}@router.post("/users/add")
def create_user():
return {"message": "Create user"}

2. product.py 생성

from fastapi import APIRouterrouter = APIRouter()@router.get("/products/list")
def get_products():
return {"message": "Product list"}@router.post("/products/add")
def create_product():
return {"message": "Create product"}

3. main.py에서 Router 연결

from fastapi import FastAPI
from app.routers import user, productapp = FastAPI()app.include_router(user.router)
app.include_router(product.router)

결과

/users/list
/users/add
/products/list
/products/add

각 경로에 맞는 API가 정상 동작합니다.


FastAPI의 장점 정리

빠른 성능 (Node.js 수준)
자동 API 문서 제공 (Swagger UI)
타입 기반 자동 검증
비동기 처리 지원
간결하고 직관적인 코드

FastAPI는 단순한 웹 서버 구축을 넘어, 다양한 백엔드 시스템에서 활용되고 있습니다.

특히 최근에는 AI 모델을 REST API 형태로 서비스하거나, 마이크로서비스 아키텍처에서 경량 API 서버로 사용하는 사례가 많아지고 있습니다.

이번 포스팅에서 살펴본 Routing 개념은 이러한 시스템을 설계할 때 가장 기본이 되는 요소이므로, 충분히 이해하고 활용하는 것이 중요합니다.

다음 포스팅에서는 FastAPI를 활용하여 실제 API 서버를 구성하거나, Docker 환경에서 배포하는 방법에 대해 알아보겠습니다.


참고 링크

FastAPI 공식 문서
https://fastapi.tiangolo.com/

Uvicorn 공식 문서
https://www.uvicorn.org/

Leave a Comment