from fastapi import FastAPI, Body
todo_data = {
1: {
"id": 1,
"contents": "실전 FastAPI 섹션 0 수강",
"is_done": True,
},
2: {
"id": 2,
"contents": "실전 FastAPI 섹션 1 수강",
"is_done": False,
},
3: {
"id": 3,
"contents": "실전 FastAPI 섹션 2 수강",
"is_done": False,
}
}
@app.patch("/todos/{todo_id}")
def update_todo_handler(
todo_id : int,
is_done: bool = Body(..., embed=True),
):
# 기존 todo_data에서 todo_id가 될 todo를 get
todo = todo_data.get(todo_id)
# 만약 투두가 있다면
if todo:
todo["is_done"] = is_done
return todo
# 만약 투두가 없다면 빈 dictinary
return {}
is_done: bool = Body(..., embed=True) 란?
is_done: bool = Body(..., embed=True)
# ↑ ↑ ↑
# Body 필수 감싸기
Body
- 이 값은 Request Body에서 꺼내와라
- Body를 안 붙이면 FastAPI가 is_done을 Query String에서 찾으려고 한다.
- 근데 이건 Body에 있는 값이라서 명시적으로 알려줘야한다.
| 선언 방식 | 꺼내는 곳 | 예시 |
| todo_id: int | URL 경로 | /todos/1 |
| order: str = None | Query String | /todos?order=DESC |
| is_done: bool = Body(...) | Request Body | { "is_done": true } |
...(Ellipsis)
- 필수값
- Python 내장 객체, FastAPI에서 "반드시 있어야 함"의 신호로 쓴다.
is_done: bool = Body(...) # 필수 → 없으면 422 에러
is_done: bool = Body(None) # 선택 → 없으면 None
is_done: bool = Body(False) # 선택 → 없으면 False
embed = True
- JSON 키로 감싸달라는 의미
- Body 파라미터가 딱 하나일 때, FastAPI는 기본적으로 값을 날 것으로 받으려 한다.
- 실무에서 JSON은 항상 키-값 쌍으로 오기 때문에 embed=True로 키를 명시하는 것
| 보내야 하는 JSON | |
| embed=False (기본값) | true |
| embed=True | { "is_done": true } |
만약 Body 파라미터가 2개 이상이라면?
파라미터가 하나일 때만 embed=True가 필요
# 이러면 자동으로 키-값으로 묶여서 embed 안 써도 됨
def update_todo_handler(
todo_id: int,
is_done: bool = Body(...),
memo: str = Body(...), # 2개 이상이면 자동으로 embed처럼 동작
):
pass
# 자동으로 이렇게 받음
{
"is_done": true,
"memo": "메모내용"
}
전체 흐름 정리
PATCH /todos/1 ← todo_id = 1 (URL에서)
{
"is_done": true ← is_done = True (Body에서)
}
↓
todo_data[1]["is_done"] = True
↓
{ "id": 1, "contents": "...", "is_done": true } 반환
swagger 에서 기존 2번 id의 is_done 값을 True 값으로 수정해주기


swagger에서 없는 id인 4를 넣는다면?


빈 {}를 반환
'FastAPI > FastAPI 알아보기' 카테고리의 다른 글
| Error 처리 (0) | 2026.05.15 |
|---|---|
| DELETE API - 삭제 (0) | 2026.05.10 |
| POST API - 생성 (0) | 2026.05.10 |
| GET API - 단일 조회 (0) | 2026.05.10 |
| GET API - 전체 조회 (0) | 2026.05.10 |