FastAPI에서 Pydantic으로 요청 검증 개선하기
배경
사내 백오피스 API 서버를 Flask에서 FastAPI로 전환하는 작업을 진행했다. 기존에는 요청 데이터 검증을 수동으로 하나씩 체크하는 방식이었는데, 코드가 지저분하고 누락되는 경우가 종종 있었다.
기존 방식의 문제
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
if not data.get('email'):
return {'error': 'email required'}, 400
if not isinstance(data.get('age'), int):
return {'error': 'age must be integer'}, 400
# 검증 로직이 계속 이어짐...
매 엔드포인트마다 이런 검증 코드를 작성하다 보니 보일러플레이트가 많았다.
FastAPI + Pydantic 적용
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
email: EmailStr
age: int = Field(ge=0, le=150)
name: str = Field(min_length=1, max_length=100)
app = FastAPI()
@app.post('/users')
async def create_user(user: UserCreate):
# 이미 검증된 데이터가 들어옴
return {'email': user.email, 'age': user.age}
타입 힌트만으로 자동 검증이 되고, 실패 시 422 응답과 함께 상세한 에러 메시지를 반환해줬다. OpenAPI 문서도 자동 생성되어 프론트엔드 팀과의 소통도 편해졌다.
결과
- 검증 로직 코드량 60% 감소
- 타입 안정성 확보로 런타임 에러 감소
- API 문서 자동화로 협업 효율 개선
FastAPI의 성능도 좋지만, Pydantic을 통한 선언적 검증이 가장 큰 장점이었다.