FastAPI/FastAPI 알아보기

Error 처리

hyunai 2026. 5. 15. 23:22
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,
    }
}

todos 조회

# status_code만 적어주면 =200을 안 적어도 자동으로 200으로 매핑된다.
@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

본래 200으로 상태코드가 잘 동작하지만 status_code=200을 적어줌으로써 더 명시적으로 작성할 수 있다.

todo 단일 조회

from fastapi import  FastAPI, Body, HTTPException

# id를 찾아 todo를 단순 조회할 때 만약 찾는 id가 없으면 404 처리를 해줘야된다.
@app.get("/todos/{todo_id}", status_code=200)
def get_todo_handler(todo_id: int):
    # todo는 todo_data에서 todo_id를 get 조회를 먼저해서 todo를 찾아준다.
    # todo_id로 찾는 todo가 없다면 자동으로 none을 넣어준다.
    todo = todo_data.get(todo_id)
    # 만약 todo가 있다면
    if todo:
        # todo 반환
        return todo
    # 만약 todo가 없다면
    raise HTTPException(status_code=404, detail="Todo Not Fount")
  • 본래 id로 찾았을 때 해당 값이 없다면 404 에러를 내줘야한다.
  • 404 에러를 내기 위해 HttpException을 import
  • raise가 뭐지?
    => https://hyunai.tistory.com/57
 

에러 발생시키기

try: print("한 자리 숫자 나누기 전용 계산기") num1 = int(input("첫번째 숫자를 입력 : ")) num2 = int(input("두번째 숫자를 입력 : ")) if num1 >= 10 or num2 >= 10: raise ValueError print("{0} / {1} = {2}".format(num1, num2, int(nu

hyunai.tistory.com

존재하는 id를 입력했을 때

없는 id를 입력했을 때

404 에러가 나고 작성한 detail 값이 Response body 값으로 출력되는 걸 확인할 수 있다.

todo_data 추가하기

# import 받은 BaseModel을 상속받는다.
# todo 아이템들이 갖는 형태와 동일한 스키마로 만든다.
class CreateToDoRequest(BaseModel):
    id: int
    contents: str
    is_done: bool

# post 성공은 201
@app.post("/todos", status_code=201)
# FastAPI가 알아서 reqeustBody를 CreateToDoRequest에 넣어서 처리를 해준다.
def create_todo_handler(request: CreateToDoRequest):
    todo_data[request.id] = request.dict()
    return todo_data[request.id]

todo_data 수정하기

@app.patch("/todos/{todo_id}", status_code=200)
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
    raise HTTPException(status_code=404, detail="todo Not Found")

기존의 id가 3인 값의 is_done 값을 수정해주기

만약 없던 id 값을 바꿔준다면?

todo_data 삭제하기

# delete 성공 상태 코드 : 204
# 204는 응답 받는 body가 없기 때문에 return이 없거나 빈 return을 줘도 된다.
@app.delete("/todos/{todo_id}", status_code=204)
def delete_todo_handler(todo_id: int):
    # .pop() 함수로 해당 todo_id를 찾아 해당하는 데이터 삭제
    # 만약 키가 없는 경우에 키 에러가 날 수 있어서 default value 값으로 None을 넣어준다.
    todo = todo_data.pop(todo_id, None)
    # todo가 있는 경우에
    if todo:
        return
    # todo가 없는 경우에
    raise HTTPException(status_code=404, detail="todo Not Found")

'FastAPI > FastAPI 알아보기' 카테고리의 다른 글

DELETE API - 삭제  (0) 2026.05.10
PATCH API - 수정  (0) 2026.05.10
POST API - 생성  (0) 2026.05.10
GET API - 단일 조회  (0) 2026.05.10
GET API - 전체 조회  (0) 2026.05.10