FastAPI - Request Body

KjjeddΒ·2026λ…„ 1μ›” 13일

FastAPI

λͺ©λ‘ 보기
7/16
post-thumbnail

πŸ“¦ Request Body

FastAPIμ—μ„œ Request BodyλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ λ³΄λ‚΄λŠ” β€œμ‹€μ œ 데이터”λ₯Ό λ‹΄λŠ” μ˜μ—­μ΄λ‹€.


πŸ“š 1. Request Bodyλž€?

HTTP μš”μ²­(Request)은 크게 두 λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰œλ‹€.

ꡬ성 μ—­ν• 
Header 메타 정보 (인증, νƒ€μž… λ“±)
Body μ‹€μ œ 데이터
πŸ‘‰ 즉 Request Bodyλž€
β€œμ„œλ²„μ—κ²Œ μ „λ‹¬ν•˜κ³  싢은 μ§„μ§œ 데이터”닀

예λ₯Ό λ“€λ©΄:

  • νšŒμ› κ°€μž… 정보
  • κ²Œμ‹œκΈ€ λ‚΄μš©
  • μƒν’ˆ 생성 데이터

등은 λͺ¨λ‘ Request Body둜 μ „λ‹¬λœλ‹€.


⚠️ HTTP λ©”μ„œλ“œμ™€ Request Body

Request BodyλŠ” 아무 μš”μ²­μ—λ‚˜ 쓰이지 μ•ŠλŠ”λ‹€.

HTTP λ©”μ„œλ“œ Request Body μ‚¬μš©
GET ❌ ꢌμž₯λ˜μ§€ μ•ŠμŒ
POST βœ… μ‚¬μš©
PUT βœ… μ‚¬μš©
PATCH βœ… μ‚¬μš©
DELETE ⚠️ κ²½μš°μ— 따라 μ‚¬μš©
❗ GET μš”μ²­μ— Bodyλ₯Ό λ„£λŠ” 것은 HTTP λͺ…세상 μ •μ˜λ˜μ§€ μ•Šμ€ λ™μž‘μ΄λ―€λ‘œ
μ ˆλŒ€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 원칙

πŸ§ͺ 2. Request Body 직접 μ²΄ν—˜

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

fastapi-body/
 β”œβ”€ main.py
 └─ requirements.txt

πŸ“¦ νŒ¨ν‚€μ§€ μ„€μΉ˜

# requirements.txt
fastapi[standard]
pydantic

pip install -r requirements.txt

✍️ μ½”λ“œ μž‘μ„±

FastAPIμ—μ„œλŠ” Pydantic λͺ¨λΈμ„ μ‚¬μš©ν•΄ Request Body ꡬ쑰λ₯Ό μ •μ˜ν•œλ‹€.

# main.py
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return {
        "item": item,
        "status": "done"
    }

πŸ“ Swagger UIμ—μ„œ μ‹€μŠ΅ν•΄λ³΄κΈ°
ν•΄λ‹Ή JSON을 Request Body에 μž…λ ₯

{
    "name": "λ…ΈνŠΈλΆ",
    "description": "개발용 λ§₯뢁",
    "price": 2500000,
    "tax": 250000
}

κ²°κ³Ό:
응닡에 μ“°μ˜€λ˜ item 객체가 json으둜 직렬화 λ˜μ—ˆλ‹€.


🧠 Pydantic λͺ¨λΈ

Pydanticμ΄λž€
Pydantic은 Python의 데이터 검증 라이브러리둜,"pedantic(κΉŒλ‹€λ‘œμš΄)"μ΄λΌλŠ” λ‹¨μ–΄μ—μ„œ μœ λž˜ν–ˆλ‹€.
데이터 νƒ€μž…μ„ κΉŒλ‹€λ‘­κ²Œ κ²€μ‚¬ν•΄μ€€λ‹€λŠ” 의미λ₯Ό λ‹΄κ³  있음.

FastAPIλŠ” Pydantic을 μ‚¬μš©ν•΄μ„œ Request Body의 데이터λ₯Ό μžλ™μœΌλ‘œ κ²€μ¦ν•œλ‹€.

λͺ¨λΈ μ •μ˜:

from pydantic import BaseModel


class Item(BaseModel):
    name: str                          # ν•„μˆ˜: νƒ€μž…μ— 기본값이 μ—†μœΌλ©΄ μš”μ²­ ν•  λ•Œ 값을 λ°˜λ“œμ‹œ μž…λ ₯λ°›μ•„μ•Ό 톡과됨.
    description: str | None = None     # 선택: νƒ€μž…μ— 기본값이 있기 λ•Œλ¬Έ.
    price: float                       # ν•„μˆ˜
    tax: float | None = None           # 선택

πŸ“Œ ν•„μˆ˜ ν•„λ“œ vs 선택 ν•„λ“œ

μ„ μ–Έ 방식 의미
name: str ν•„μˆ˜ (λ°˜λ“œμ‹œ 전달)
description: str | None = None 선택 (없어도 OK)
πŸ‘‰ 기본값이 있으면 선택
πŸ‘‰ 기본값이 μ—†μœΌλ©΄ ν•„μˆ˜

🧠 λͺ¨λΈ 데이터 ν™œμš©ν•˜κΈ°

Pydantic λͺ¨λΈμ„ λ”•μ…”λ„ˆλ¦¬λ‘œ λ³€ν™˜ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.
λ”°λΌμ„œ μ›ν•˜λŠ” ν•„λ“œλ₯Ό 자유둭게 μΆ”κ°€ν•  수 μžˆμ–΄μ„œ μœ μ—°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.
@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.model_dump()                            # 1. λͺ¨λΈ β†’ λ”•μ…”λ„ˆλ¦¬ λ³€ν™˜
    if item.tax is not None:
        price_with_tax = item.price + item.tax               # 2. λͺ¨λΈ μ†μ„±μœΌλ‘œ 계산
        item_dict.update({"price_with_tax": price_with_tax}) # 3. μƒˆ ν•„λ“œ μΆ”κ°€
    return item_dict									     # 4. ν™•μž₯된 λ”•μ…”λ„ˆλ¦¬ λ°˜ν™˜

πŸ“Œ μ™œ λ°”λ‘œ dict둜 μ•ˆ λ°›μ„κΉŒ?

방식 문제점
dict μžλ™μ™„μ„± ❌, νƒ€μž… μ•ˆμ •μ„± ❌
Pydantic λͺ¨λΈ μžλ™μ™„μ„± βœ…, νƒ€μž… μ•ˆμ •μ„± βœ…

item.price 처럼 점(.) 접근이 κ°€λŠ₯ν•˜κ³ 
IDEκ°€ νƒ€μž…μ„ μ΄ν•΄ν•˜κΈ° λ•Œλ¬Έμ— μ‹€μˆ˜κ°€ κΈ‰κ²©νžˆ 쀄어든닀.


πŸ”„ Request Body λ‚΄λΆ€ 처리 흐름

μš”μ²­ JSON
 ↓
FastAPI μˆ˜μ‹ 
 ↓
Pydantic λͺ¨λΈ λ§€ν•‘
 ↓
νƒ€μž… λ³€ν™˜ + 검증
 ↓
ν•¨μˆ˜ μ‹€ν–‰
 ↓
Response Body λ°˜ν™˜

🧠 Path Β· Query Β· Body μ‘°ν•© κ·œμΉ™

FastAPIλŠ” νŒŒλΌλ―Έν„°μ˜ μœ„μΉ˜μ™€ νƒ€μž…λ§Œ 보고 μ–΄λ””μ„œ 데이터λ₯Ό κ°€μ Έμ˜¬μ§€ μžλ™μœΌλ‘œ νŒλ‹¨ν•œλ‹€.

πŸ“Œ Path + Body

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {
        "item_id": item_id,
        **item.model_dump()
    }

πŸ“Œ Path + Query + Body

@app.put("/items/{item_id}")
async def update_item(
    item_id: int,
    item: Item,
    q: str | None = None
):
    result = {
        "item_id": item_id,
        **item.model_dump()
    }
    if q:
        result["q"] = q
    return result

🧭 FastAPI νŒŒλΌλ―Έν„° νŒλ³„ κ·œμΉ™ (μ€‘μš”)

쑰건 νŒλ³„ κ²°κ³Ό
URL κ²½λ‘œμ— 포함 Path Parameter
Pydantic λͺ¨λΈ νƒ€μž… Request Body
λ‹¨μˆœ νƒ€μž… (int, str λ“±) Query Parameter
❗ μˆœμ„œκ°€ μ•„λ‹ˆλΌ β€œνƒ€μž…κ³Ό μœ„μΉ˜β€κ°€ κΈ°μ€€

πŸ“Œ 전체 흐름 μš”μ•½

Client JSON
 ↓
FastAPI μˆ˜μ‹ 
 ↓
Pydantic λͺ¨λΈ λ§€ν•‘
 ↓
νƒ€μž… λ³€ν™˜ + 검증
 ↓
λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
 ↓
Response Body

βœ… μ΅œμ’… 정리

  • Request BodyλŠ” μ‹€μ œ 데이터 전달 μ˜μ—­
  • Pydantic λͺ¨λΈμ€ 데이터 κ³„μ•½μ„œ
  • κΈ°λ³Έκ°’ 유무둜 ν•„μˆ˜/선택 νŒλ‹¨
  • 검증 Β· νŒŒμ‹± Β· λ¬Έμ„œν™”λ₯Ό FastAPIκ°€ μžλ™ 처리
πŸš€ FastAPI + Pydantic = β€œκ²€μ¦μ„ μžŠμ–΄λ„ μ•ˆμ „ν•œ API”
profile
Gongbuhaja

0개의 λŒ“κΈ€