2장 – FastAPI의 핵심 개념: 요청 처리와 라우팅
FastAPI의 핵심: 요청 처리와 라우팅
FastAPI의 진가는 요청을 받아들이고 적절히 처리하여 응답을 보내는 과정에서 드러납니다. 사용자가 웹서비스에 접속하거나 데이터를 전송할 때마다 백엔드에는 HTTP 요청이 전달됩니다. FastAPI는 이런 HTTP 요청을 신속하게 분배하고, 개발자가 의도한 대로 동작하도록 손쉽게 구성할 수 있는 기능들을 제공합니다.
라우팅: URL과 함수의 연결
웹서버에 들어온 요청은 각기 다른 URL 경로를 가집니다. 예를 들어 /users
혹은 /items/123
와 같은 경로는 각각 다른 처리를 요구합니다. FastAPI에서는 이러한 경로마다 처리할 함수를 지정할 수 있습니다. 이를 라우팅이라고 부릅니다. 라우팅을 정의할 때는 Python의 데코레이터 문법을 사용합니다. 예를 들어,
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}
위 코드처럼 데코레이터에 HTTP 메소드(@app.get
, @app.post
등)와 경로를 지정하면, 해당 경로에 요청이 들어올 때마다 지정한 함수가 실행됩니다. 경로에 {user_id}
와 같이 변수 부분을 사용할 수도 있어 다양한 상황에 유연하게 대응할 수 있습니다.
요청 데이터의 처리와 유효성 검증
FastAPI에서는 클라이언트로부터 전송된 데이터도 자동으로 처리해줍니다. 타입 힌트만 올바르게 명시하면, 경로 파라미터, 쿼리 파라미터, 바디 데이터 등의 모든 입력값을 파이썬 타입으로 변환해주고, 잘못된 데이터에 대해서는 에러 응답을 자동으로 반환합니다. 이 과정에서 Pydantic 모델을 활용하며, 데이터 검증이 매우 직관적으로 이루어집니다.
예를 들어, 사용자의 정보를 입력받는 엔드포인트를 만들 때는 다음과 같이 정의할 수 있습니다.
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
@app.post("/users/")
def create_user(user: User):
return user
바디로 받은 데이터가 User
모델의 규칙에 맞지 않으면, FastAPI는 알아서 422 에러와 함께 어떤 부분에 문제가 있는지 안내해줍니다.
비동기 요청 처리와 성능
FastAPI의 가장 큰 강점 중 하나는 비동기 처리가 가능하다는 점입니다. 즉, 여러 사용자가 한 번에 몰려와도 각각의 요청을 빠르게 처리할 수 있습니다. 함수 정의에 async def
를 사용하면, 데이터베이스 접근이나 외부 시스템과의 통신 등 시간이 오래 걸릴 수 있는 작업도 효율적으로 처리합니다. 이는 Starlette와 ASGI의 기반 덕분에 가능한 일입니다.
경로 설계와 유지보수를 위한 모듈화
서비스 규모가 커지면 여러 엔드포인트와 라우터가 필요하게 됩니다. 이를 위해 FastAPI는 라우터 객체(APIRouter
)를 제공하며, 각 기능별로 라우터를 분리하면 코드 관리가 쉬워집니다. 예시는 아래와 같습니다.
from fastapi import APIRouter
user_router = APIRouter()
@user_router.get("/users/")
def read_users():
return ["User1", "User2"]
app.include_router(user_router)
이렇게 하면 코드가 기능별로 분리되어 대형 프로젝트에서도 유지보수가 용이합니다.
마치며
FastAPI의 요청 처리 흐름, 라우팅, 데이터 검증 그리고 비동기 처리까지, 이 핵심 개념들을 이해하고 나면 누구나 효율적이고 강력한 API 서버를 구현할 수 있습니다. 다음 장에서는 실제 API를 설계하면서 마주치는 다양한 실전 예제와 고급 설정 방법을 다룹니다.