FastAPI

김우진·2026년 3월 12일

FastAPI

목록 보기
2/6
post-thumbnail

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 — 성공

코드이름의미 및 발생 상황
200OK요청이 성공적으로 처리됨 (가장 일반적인 성공 응답)
201Created요청이 성공하여 새로운 리소스가 생성됨 (회원가입, 포스트 작성 성공 등)
204No Content요청은 성공했으나 응답 본문에 보낼 데이터가 없음 (주로 DELETE 성공 시 사용)

4xx — 클라이언트 오류

코드이름의미 및 발생 상황
400Bad Request요청 자체가 잘못됨 (파라미터 누락, 데이터 형식 오류 등)
401Unauthorized인증되지 않음 (로그인이 필요하거나 토큰이 유효하지 않을 때)
403Forbidden권한이 없음 (로그인은 했지만 해당 페이지에 접근 불가능할 때)
404Not Found요청한 리소스를 찾을 수 없음 (잘못된 URL 경로 등)

5xx — 서버 오류

코드이름의미 및 발생 상황
500Internal Server Error서버 내부 로직 오류 (코드 내 예외 발생, 소위 '서버 터짐')
502Bad Gateway게이트웨이가 잘못된 응답을 받음 (Nginx와 서버 간 연결 문제 등)
503Service 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")

0개의 댓글