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

관련 글

더 보기 »

현대 웹 앱에서 OTP 인증 시작하기

왜 OTP 인증이 중요한가 - 로그인 또는 회원가입 시 사용자 신원을 확인합니다 - 가짜 계정 생성을 방지합니다 - 추가적인 보안 계층을 제공합니다 - 일반적으로 사용됩니다

그룹별 배열 뒤집기

문제 설명: 주어진 크기 k의 그룹으로 배열을 뒤집는다. 배열은 길이 k인 연속적인 청크(윈도우)로 나뉘며, 각 청크는 뒤집힌다.