FastAPI/데이터베이스

ORM 적용 - PATCH API

hyunai 2026. 6. 25. 17:42
# orm.py

    def done(self) -> "ToDo":
        self.is_done = True
        return self

    def undone(self) -> "ToDo":
        self.is_done = False
        return self
  • 인스턴스 메소드로 정의
  • 이렇게 인스턴스 메소드를 정의해서 데이터를 업데이트 관리하는 이유는 유지보수가 훨씬 편하기 때문이다.
    • 예를 들어 만약 is_done을 True로 업데이트할 때 이메일을 발송한다고 하면 여기에 sendEmail 같은 식으로 코드를 구현하게 되면은 이 updateDone을 호출할 때마다 이 코드가 자연적으로 호출이 돼서 좀 더 코드 반복 없이 작업을 할 수 있게 된다.
    • 근데 만약 isDone을 true로 하는 업데이트 관련 코드가 밖에 있다면 여러 군데애 파편화되어 있어 반복되는 작업이 많아진다.
# repository.py

def update_todo(session: Session, todo:ToDo) -> ToDo:
    session.add(instance=todo)
    session.commit()
    session.refresh(instance=todo)
    return todo
  • create 부분이랑 코드가 같다.
    • 왜? 마찬가지로 업데이트된 todo 객체를 받아서 session에 추가를 해주고 session에 커밋을 하게 되면 이 때 데이터가 저장이 된다.
    • 여기선 refresh가 필수는 아니지만 최신 데이터를 DB에 잘 저장된 데이터를 가져오는지 확인 차 넣어준다.
# main.py

@app.patch("/todos/{todo_id}", status_code=200)
def update_todo_handler(
    todo_id : int,
    is_done: bool = Body(..., embed=True),
    session: Session = Depends(get_db),
):
    # todo id를 조회해서 단일 todo를 조회
    todo: ToDo | None = get_todo_by_todo_id(session=session, todo_id=todo_id)
    # todo가 있다면
    if todo:
        # 밑의 일반 if문이랑 같은 의미 -> 삼항연산자
        # Patch 요청으로 is_done을 true를 보내면 True로 false를 보내면 False로 응답
        # 여기까지 하면 DB에 반영이 되진않는다.
        todo.done() if is_done else todo.undone()
        # if is_done is True:
        #     todo.done()
        # else:
        #     todo.undone()
        todo: ToDo = update_todo(session=session, todo=todo)
        return ToDoSchema.model_validate(todo)
    # 만약 todo가 없다면
    raise HTTPException(status_code=404, detail="Todo Not Fount")
  1. ToDo id path를 통해서 먼저 접근하고자 하는 데이터가 유효한지 체크
    => ToDo가 존재하는지 확인
  2. ToDo가 존재하면 update
  3. ToDo가 존재하는 경우에 is_done 값 요청이 true면 done()를 통해 true로 update false면 undone()을 통해 false로 update
  4. 없다면 404 발생

swagger 확인

'FastAPI > 데이터베이스' 카테고리의 다른 글

ORM 적용 - DELETE API  (0) 2026.06.26
ORM 적용 - POST API  (0) 2026.06.24
파이참 - Refactoring  (0) 2026.06.16
ORM 적용 - GET 단일 조회 API  (0) 2026.06.16
ORM 적용 - HTTP Response 처리  (1) 2026.06.14