POST /items: FastAPI와 Pydantic을 사용하여 API에 새 데이터 추가
발행: (2026년 2월 27일 오전 05:52 GMT+9)
2 분 소요
원문: Dev.to
Source: Dev.to
읽기 전용에서 인터랙티브로
지금까지 우리 API는 데이터를 읽기만 할 수 있었습니다.
오늘은 CREATE 기능을 추가합니다: CRUD 중 C입니다.
요청 및 응답 DTO
요청: 클라이언트가 보내는 데이터
class ItemCreateDTO(BaseModel):
name: str
description: Optional[str] = None
price: float
@field_validator("price")
def price_must_be_positive(cls, v):
if v <= 0:
raise ValueError("Price must be a positive number")
return v
응답: API가 반환하는 데이터
class ItemResponseDTO(BaseModel):
id: int
name: str
description: Optional[str]
price: float
created_at: datetime
입력용 DTO와 출력용 DTO를 별도로 두면 깔끔한 API 설계가 가능합니다.
POST 엔드포인트
@app.post("/items", response_model=ItemResponseDTO, status_code=201)
def create_item(item: ItemCreateDTO):
db = SessionLocal()
new_item = Item(
name=item.name,
description=item.description,
price=item.price
)
db.add(new_item)
db.commit()
db.refresh(new_item)
db.close()
return new_item
status_code=201에 주목하세요: 성공적인 생성에 대한 올바른 HTTP 상태 코드이며, 200이 아닙니다.
Postman에서 테스트하기
정상 요청

이름 누락 — 422 오류

음수 가격 — 422 오류

배운 점
POST 엔드포인트는 두 가지를 정확히 해야 합니다:
- 입력 시 검증 – 요청 데이터가 요구 사항을 충족하는지 확인합니다.
- 출력 시 올바른 상태 코드 –
201 Created는200 OK와 다르며, 이 차이는 프로덕션 시스템에서 중요합니다.
Day 9 완료. 앞으로 21일 남았습니다. 🔥
GDGoCBowen30dayChallenge