본문 바로가기

[FastAPI] dict vs Pydantic 스키마 사용 비교

@Jeeqong 2025. 4. 7. 10:36
반응형

🧩 배경

FastAPI에서 API 요청 값을 처리할 때 dict로 받을지, Pydantic 스키마로 받을지 고민한 적이 있다. 특히 부분 업데이트 (PATCH) 혹은 선택적 필드 처리가 필요한 상황에서 어떤 방식을 써야 할지 명확히 구분해두면 좋다.


🧪 예제

예를 들어, 아래와 같은 ProductUpdate 스키마가 있다고 가정하자:

class ProductUpdate(BaseModel):
    name: Optional[str] = None
    price: Optional[int] = None
    url: Optional[str] = None
    category_id: Optional[int] = None

1. Pydantic 방식으로 처리하는 예시

def update_product_service(db: Session, product_id: int, data: ProductUpdate):
    product = get_product_by_id(db, product_id)

    # exclude_unset=True로 전달된 필드만 추출
    update_fields = data.dict(exclude_unset=True)

    for key, value in update_fields.items():
        setattr(product, key, value)

    db.commit()
    db.refresh(product)
    return product

장점

  • 타입 검증 자동
  • 문서 자동화 (Swagger 문서에 바로 반영됨)
  • ✅ exclude_unset=True로 전달된 값만 업데이트 가능

단점

  • ❌ BaseModel을 매번 정의해줘야 함
  • ❌ 내부 로직에서 dict 변환 필요

2. dict 방식으로 처리하는 예시

def update_product_service(db: Session, product_id: int, update_data: dict):
    product = get_product_by_id(db, product_id)

    if update_data.get("name"):
        product.name = update_data["name"]
    if update_data.get("price"):
        product.price = update_data["price"]

    db.commit()
    db.refresh(product)
    return product

장점

  • ✅ 빠르고 가볍다
  • ✅ 간단한 테스트/스크립트에는 적합

단점

  • ❌ 타입 안정성이 없음
  • ❌ 문서화 불가능
  • ❌ 실수할 가능성이 높음

🔍 결론: 언제 뭘 써야 하나?

상황  추천 방식
FastAPI에서 API 요청 처리 Pydantic 스키마
내부 로직, 임시 스크립트 dict
부분 업데이트 (PATCH) exclude_unset=True 조합
전체 업데이트 (PUT) 전체 필드 정의된 Pydantic 사용

💡 팁: exclude_unset=True를 꼭 기억하자!

Pydantic은 전달된 필드만 추출하는 기능이 있다.

data.dict(exclude_unset=True)

이 한 줄로 입력된 값만 업데이트가 가능하다.

 

 

 

 

반응형
Jeeqong
@Jeeqong :: JQVAULT

Jeeqong's vault : 정보/기록을 쌓아두는 공간 웹개발 포스팅 일상 리뷰를 기록하는 공간입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차