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에서 테스트하기

정상 요청

Valid Request

이름 누락 — 422 오류

Missing Name

음수 가격 — 422 오류

Negative Price

배운 점

POST 엔드포인트는 두 가지를 정확히 해야 합니다:

  1. 입력 시 검증 – 요청 데이터가 요구 사항을 충족하는지 확인합니다.
  2. 출력 시 올바른 상태 코드201 Created200 OK와 다르며, 이 차이는 프로덕션 시스템에서 중요합니다.

Day 9 완료. 앞으로 21일 남았습니다. 🔥

GDGoCBowen30dayChallenge

0 조회
Back to Blog

관련 글

더 보기 »