01 경로 동작 함수에 대하여
경로 동작 함수는 경로와 동작의 조합이다.
REST API의 엔드포인트와 HTTP 메서드에 각각 대응된다.
ToDo 앱을 만들기 위해 라우터에는 다음과 같은 6가지 경로 동작 함수를 정의하게 된다.
- GET /tasks
- POST /tasks
- PUT /tasks/{task_id}
- DELETE /tasks/{task_id}
- PUT /tasks/{task_id}/done
- DELETE /tasks/{task_id}/done
02 경로 동작 함수 만들기
6개의 함수를 하나의 파일에 담게 되면, 구현 상태에 따라서 파일 크기가 커져서
보기 않 좋을 수 있다.
해당 프로젝트는 처리가 비교적 단순해서 하나의 파일로 묶어도 크게 문제가 되지는 않는다.
하지만, 함수에 기능을 추가할 때마다 파일 크기가 커지므로 미리 명확하게 분할해 놓아야 더욱 실용적인 설계가 될 수 있다.
분할은 리소스 단위로 하는 것을 추천한다.
이번에 ToDo 앱의 경우 크게
/tasks와 /tasks/{task_id}/done
으로 두개의 리소스로 나눌 수 있으므로 각각을 api/routers/task.py와 api/routers/done.py에 작성한다.
일단 함수의 내용은 pass로 둔다. 이후 그 안에 내용을 채워넣자
api/routers/task.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/tasks")
async def list_tasks():
pass
@router.post("/tasks")
async def create_task():
pass
@router.put("/tasks/{task_id}")
async def update_task():
pass
@router.delete("/tasks/{task_id}")
async def delete_task():
pass
api/routers/done.py
from fastapi import APIRouter
router = APIRouter()
@router.put("/tasks/{task_id}/done")
async def mark_task_as_done():
pass
@router.delete("/tasks/{task_id}/done")
async def unmark_task_as_done():
pass
이것으로 routers의 플레이스홀더 준비는 끝났다.
플레이스홀더: 문자나 이미지등의 요소가 들어갈 자리를 임시로 채워놓은 내용물을 말한다.
하지만 이것만으로는 앞서 설명한 Swagger UI에 나타나지 않는다.
위 두 파일로 작성한 router 인스턴스를 FastAPI 인스턴스로 가져와야 한다.
Hello World!를 작성한 api/main.py를 아래와 같이 다시 작성한다.
app/main.py
from fastapi import FastAPI
from api.routers import task, done
app = FastAPI()
app.include_router(task.router)
app.include_router(done.router)
03 동작 확인
지금까지의 작업을 통해 Swagger UI가 위 그림처럼 6개의 경로 동작 함수에 해당하는 엔드포인트가 추가되었다.
Docker에 FastAPI 환경을 구축할 때 변경 사항을 즉시 반영하는 핫 리로드 (hot reload) 옵션 (--reload)를 추가했으므로, 파일을 저장하면 Swagger UI를 열었을 때 위와 같이 최신 상태가 반영되어 있을 것이다.
POST /tasks의 경로 동작을 열고 Try it out을 클릭한 뒤 Execute 버튼을 클릭하면 Response body에 null만 반환되는 것을 확인할 수 있다. (빈 함수들만 있기 때문에)
다음 장에서 스키마를 사용해 정형화 된 값을 채워 응답을 반환하도록 정의해 본다.