본문 바로가기

개발자 생활

FastAPI 연재 4편 — 라우터 쪼개기 + 버저닝(prefix) 걸어두기

반응형

프로젝트가 커지면 라우팅이 제일 먼저 난장판 된다.

  • main.py에 라우터가 다 붙어있음
  • 엔드포인트가 늘어나면 파일 하나가 1,000줄 넘어감
  • /v1, /v2 같은 버전이 필요해졌을 때… “아 망했다” 느낌

그래서 나는 처음부터 라우터를 두 레벨로 나눴다.

  • root_router: 버전이 없는 엔드포인트(헬스체크 같은 거)
  • api_router: /api/v1 아래로 들어가는 실제 API

핵심 코드: root_router vs api_router

대표 이미지 (라우터 분리 + 버저닝)

구조는 단순하다.

root_router = APIRouter()
root_router.include_router(health_router)

api_router = APIRouter()
api_router.include_router(diaries_router)
api_router.include_router(weather_router)

그리고 app 생성할 때 이렇게 붙인다.

app.include_router(root_router)
app.include_router(api_router, prefix=settings.api_v1_prefix)

여기서 포인트는 2개.


1) 헬스체크는 버저닝을 안 타는 게 운영에서 편하다

예를 들어 로드밸런서나 모니터링에서 /health만 때려보고 싶을 때가 많다.

그때 /api/v1/health처럼 “API 버전”을 의존하게 만들면, 버전 정책 바뀔 때 운영도 같이 흔들린다.

그래서 그냥 /health로 둔다.

curl -sS http://127.0.0.1:8000/health

2) 실제 비즈니스 API는 /api/v1로 “경계”를 만들어준다

이 경계는 나중에 진짜 도움이 된다.

  • /api/v1/diaries
  • /api/v1/weather

버전이 필요해지면 Settings.api_v1_prefix만 바꾸거나, /api/v2를 새로 만들고 라우터 세트를 갈아끼우면 된다.


실습: 라우팅이 제대로 붙었는지 한 번에 확인

“prefix로 묶인 라우터” 개념

서버를 띄운 뒤, 아래 3개를 쏴보자.

curl -sS http://127.0.0.1:8000/health
curl -sS "http://127.0.0.1:8000/api/v1/diaries"
curl -sS "http://127.0.0.1:8000/api/v1/weather?lat=37.57&lng=126.98"
  • /health는 무조건 200이 떠야 정상
  • /api/v1/diaries는 DB 비어있으면 []가 나오는 게 정상
  • /api/v1/weather는 키가 없으면 503, 있으면 200 (둘 다 “의도된 동작”)

마무리

라우팅은 초반에 구조 잡아두면 이후에 “정신 건강”이 달라진다 ㅋㅋ
다음 편에서는 DB로 넘어가서 SQLModel로 MVP DB를 어떻게 구성했는지 본다.


참고

반응형