포스트

기존 API에 영향을 주지 않고 새 기능을 개발하는 방법 – FastAPI 구조 기준

FastAPI로 백엔드를 개발하면서 흔히 겪는 고민이 하나 있습니다.

기존에 잘 돌아가던 admin API를 건드리지 않으면서, 새롭게 user/service 관련 API를 개발하고 싶은데… 스키마나 DB 구조까지 바꿔야 할 것 같을 땐 어떻게 하지?

이런 상황에서 직접 겪은 삽질과 복구 경험을 토대로, 실전에서 유용했던 API 개발 격리 전략을 공유합니다.


문제 상황 ** 내 프로젝트는 다음과 같은 구조를 갖고 있다:

1
2
3
4
5
6
7
app/
├── api/v1/endpoints/admin/      ← 운영 중인 안정된 관리자 API
├── api/v1/endpoints/users/      ← 새로 개발해야 할 사용자 API
├── api/v1/schemas/*.py
├── models/
├── crud/

새로 만드는 user/game API는 스키마, DB, 모델, CRUD 구조까지 영향을 줄 수 있는 작업이고, 이 과정에서 기존 admin API가 고장날 우려가 있었다. 실제로 그런 일이 발생해서 git으로 복구한 적도 있었다 😵‍💫


  • 새 기능은 api/v2/ 아래에서 완전히 분리된 구조로 개발
  • 기존 admin 기능은 v1 그대로 유지
1
2
3
4
5
6
7
8
9
10
11
12
13
app/
├── api/
│   ├── v1/                     ← 기존 유지
│   └── v2/                     ← 새 기능 개발
│       ├── endpoints/users/
│       └── schemas/
├── models/
│   ├── user.py
│   └── v2/user.py              ← 모델 구조가 다를 경우 분리
├── crud/
│   ├── user.py
│   └── v2/user.py

2. API 라우터 분리 ** api/api.py에서 v1과 v2를 명확히 나눔:

1
2
3
4
api_router.include_router(admin_router, prefix="/v1/admin", tags=["admin"])
api_router.include_router(v1_user_router, prefix="/v1/users", tags=["v1-users"])
api_router.include_router(v2_user_router, prefix="/v2/users", tags=["v2-users"])

  • Alembic 마이그레이션은 가급적 브랜치 분기 후 staging DB에서 테스트
  • 운영용 DB와는 철저히 분리한 개발 환경을 마련 (Docker, .env.dev 활용)
1
2
3
4
5
tests/
├── test_admin_utils.py          ← 기존 유지
└── v2/
    └── test_users.py            ← 신규 테스트


핵심 요약

구분기존 admin 유지새로운 user/game 개발
라우팅/v1/admin/…/v2/users/… 등
폴더 구조api/v1/api/v2/
모델models/user.pymodels/v2/user.py
테스트tests/tests/v2/
마이그레이션운영 DB개발용 DB 또는 브랜치별 진행

sticker


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.