본 포스팅은 인프런에서 제공하는 '실전! FastAPI 입문' 강의를 수강후에 정리 및 복습을 위해 작성하는 글입니다.
역할
api > todo.py
api > user.py
main.py 와 별개로 비즈니스로직을 처리하기 위한 api를 모듈화 해둔 경로로 FastAPI의 APIRouter()를 사용하여 API를 구현한다.
또한 connection, orm, repository를 통해 DB에 접근하며 request, response로 각각 요청과 응답에 해당하는 객체를 생성하여 데이터를 보내고 받아온다.
각각의 handler를 생성하여 파라미터를 받아오고 오류 발생 시 raise Exception을 통해 Exception을 발생시킬 수 있다.
코드 분석
from typing import List
from fastapi import Depends, HTTPException, Body, APIRouter
from sqlalchemy.orm import Session
from database.connection import get_db
from database.orm import ToDo, User
from database.repository import ToDoRepository, UserRepository
from schema.request import CreateToDoRequest
from schema.response import ToDoListSchema, ToDoSchema
from security import get_access_token
from service.user import UserService
#APIRouter를 초기화하여 API를 생성한다.
#Spring에서와 동일하게 prefix를 사용하여 공통 경로를 지정할 수 있다.
router = APIRouter(prefix="/todos")
@router.patch("/{todo_id}", status_code=200) #todo_id를 파라미터로 받아오며, 성공 시 200코드를 반환한다.
def update_todo_handler(
todo_id: int,
is_done: bool = Body(..., embed=True),
# todo_repo: ToDoRepository = Depends(ToDoRepository)
# 의존성을 주입받는 객체와 주입하는 객체가 같다면, Depends() 안 생략 가능
todo_repo: ToDoRepository = Depends(),
):
#todo_id에 해당하는 to-do가 있을 경우
todo: ToDo | None = todo_repo.get_todo_by_todo_id(todo_id=todo_id)
if todo:
#삼항연산자
todo.done() if is_done else todo.undone()
todo: ToDo = todo_repo.update_todo(todo=todo)
#ORM을 통해 데이터베이스의 데이터를 Python객체로 반환
return ToDoSchema.from_orm(todo)
#일반 if else
# if is_done is True:
# to_do.done()
# else:
# to_do.undone()
#실패 시 raise를 통해 Exception을 반환
raise HTTPException(status_code=404, detail="Todo Not Found")
'공부 > FastAPI' 카테고리의 다른 글
[FastAPI] schema (0) | 2025.01.23 |
---|---|
[FastAPI] database (0) | 2025.01.22 |
[FastAPI] 기본적인 사용법 (0) | 2025.01.22 |
[FastAPI] main.py (0) | 2025.01.22 |
[FastAPI] 프로젝트 구조 (0) | 2025.01.17 |