FastAPI 정리
1. 기본 CRUD API
웹 서버 실행 후 코드를 변경하면, 웹 서버를 재시작해야 변경사항이 Swagger UI에 반영됩니다.
FastAPI 서버 종료: Ctrl + C
전체 조회 (GET)
@app.get("/todos")
단일 조회 (GET)
@app.get("/todos/{todo_id}")
생성 (POST)
from pydantic import BaseModel
class CreateToDoRequest(BaseModel):
id: int
contents: str
is_done: bool
@app.post("/todos")
def create_todo_handler(request: CreateToDoRequest):
todo_data[request.id] = request.dict()
return todo_data[request.id]
수정 (PATCH)
from fastapi import FastAPI, Body
@app.patch("/todos/{todo_id}")
def update_todo_handler(
todo_id: int,
is_done: bool = Body(..., embed=True),
):
todo = todo_data.get(todo_id)
if todo:
todo["is_done"] = is_done
return todo
return {}
삭제 (DELETE)
@app.delete("/todos/{todo_id}")
def delete_todo_handler(todo_id: int):
todo_data.pop(todo_id, None)
return todo_data
2. HTTP Status Code
2xx — 성공
| 코드 | 이름 | 의미 및 발생 상황 |
|---|
| 200 | OK | 요청이 성공적으로 처리됨 (가장 일반적인 성공 응답) |
| 201 | Created | 요청이 성공하여 새로운 리소스가 생성됨 (회원가입, 포스트 작성 성공 등) |
| 204 | No Content | 요청은 성공했으나 응답 본문에 보낼 데이터가 없음 (주로 DELETE 성공 시 사용) |
4xx — 클라이언트 오류
| 코드 | 이름 | 의미 및 발생 상황 |
|---|
| 400 | Bad Request | 요청 자체가 잘못됨 (파라미터 누락, 데이터 형식 오류 등) |
| 401 | Unauthorized | 인증되지 않음 (로그인이 필요하거나 토큰이 유효하지 않을 때) |
| 403 | Forbidden | 권한이 없음 (로그인은 했지만 해당 페이지에 접근 불가능할 때) |
| 404 | Not Found | 요청한 리소스를 찾을 수 없음 (잘못된 URL 경로 등) |
5xx — 서버 오류
| 코드 | 이름 | 의미 및 발생 상황 |
|---|
| 500 | Internal Server Error | 서버 내부 로직 오류 (코드 내 예외 발생, 소위 '서버 터짐') |
| 502 | Bad Gateway | 게이트웨이가 잘못된 응답을 받음 (Nginx와 서버 간 연결 문제 등) |
| 503 | Service Unavailable | 서버가 과부하되었거나 점검 중이라 현재 이용 불가 |
3. 상태 코드 & 에러 처리 실습
전체 조회 — 상태 코드 적용
@app.get("/todos", status_code=200)
def get_todos_handler(order: str | None = None):
ret = list(todo_data.values())
if order and order == "DESC":
return ret[::-1]
return ret
단일 조회 — 에러 처리
from fastapi import FastAPI, Body, HTTPException
@app.get("/todos/{todo_id}", status_code=200)
def get_todo_handler(todo_id: int):
todo = todo_data.get(todo_id)
if todo:
return todo
raise HTTPException(status_code=404, detail="ToDo Not Found")
생성 (POST) — 상태 코드 적용
@app.post("/todos", status_code=201)
def create_todo_handler(request: CreateToDoRequest):
todo_data[request.id] = request.dict()
return todo_data[request.id]
수정 (PATCH) — 에러 처리
@app.patch("/todos/{todo_id}", status_code=200)
def update_todo_handler(
todo_id: int,
is_done: bool = Body(..., embed=True),
):
todo = todo_data.get(todo_id)
if todo:
todo["is_done"] = is_done
return todo
raise HTTPException(status_code=404, detail="ToDo Not Found")
삭제 (DELETE) — 에러 처리
@app.delete("/todos/{todo_id}", status_code=204)
def delete_todo_handler(todo_id: int):
todo = todo_data.pop(todo_id, None)
if todo:
return
raise HTTPException(status_code=404, detail="ToDo Not Found")