반응형
🧩 배경
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)
이 한 줄로 입력된 값만 업데이트가 가능하다.
반응형
'Dev > Python' 카테고리의 다른 글
| 튜플 (Tuple) - 여러 값을 묶는 간단하고 효율적인 방법 (2) | 2025.04.10 |
|---|---|
| [FastAPI x PostgreSQL] 프로세스 정리 (with SQLAlchemy, Pydantic) (0) | 2025.04.08 |
| [FastAPI] 카테고리 중복 체크 시 null / 빈 문자열 처리 방법 (0) | 2025.04.05 |
| [Python] 프로젝트에서 린트 & 포맷터 도입하는 이유와 셋업 방법 (flake8, black, isort, mypy, pre-commit) (0) | 2025.04.03 |
| [FastAPI] Response vs FileResponse 차이와 사용법 (0) | 2025.04.02 |