본문으로 건너뛰기
백엔드 기초집: Python FastAPILESSON 10

프로젝트 폴더 구조와 Router 분리

난이도초급
예상 시간35분
선수지식이전 강의

10강. 프로젝트 폴더 구조와 Router 분리

1. 이번 강의에서 해결할 문제

모델과 모든 endpoint가 main.py에 모이면 변경 충돌과 순환 import가 늘어납니다. HTTP 경로와 도메인별 코드를 패키지로 나눕니다.

2. 학습 목표

3. 핵심 개념

Router는 경로와 HTTP 변환을 담당하고 schema는 입출력 계약을 담당합니다. service는 점수 기록 같은 도메인 동작을 맡습니다. main.py는 FastAPI 객체 생성, middleware, router 연결에 집중합니다. 폴더마다 __init__.py를 두어 Python 패키지로 import합니다.

4. 단계별 코드 예시

파일 경로: game-ranking-api/

프로젝트 구조
game-ranking-api/
├─ app/
│ ├─ __init__.py
│ ├─ main.py
│ ├─ schemas/
│ │ ├─ __init__.py
│ │ └─ record.py
│ ├─ routers/
│ │ ├─ __init__.py
│ │ └─ records.py
│ └─ services/
│ ├─ __init__.py
│ └─ records.py
└─ requirements.txt

파일 경로: game-ranking-api/app/routers/records.py

app/routers/records.py
from fastapi import APIRouter

router = APIRouter(prefix="/records", tags=["records"])


@router.get("")
def list_records() -> dict[str, list[object]]:
return {"items": []}

파일 경로: game-ranking-api/app/main.py

app/main.py
from fastapi import FastAPI

from app.routers import records

app = FastAPI(title="Game Ranking API", version="0.2.0")
app.include_router(records.router)


@app.get("/health", tags=["system"])
def health() -> dict[str, str]:
return {"status": "ok"}

실행 위치: game-ranking-api/

python -m uvicorn app.main:app --reload
Invoke-RestMethod http://127.0.0.1:8000/records

5. 코드가 동작하는 이유

APIRouter는 작은 FastAPI처럼 path operation을 모읍니다. prefix가 각 경로 앞에 붙고 include_router가 최종 앱의 route 목록에 포함합니다. main은 records 내부 구현을 몰라도 router 객체만 연결합니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

프로젝트 폴더 구조와 Router 분리 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“프로젝트 폴더 구조와 Router 분리” 코드 리뷰에서 유지해야 할 설계 원칙은 무엇인가요?
  2. 문제 2“프로젝트 폴더 구조와 Router 분리”에서 ‘router와 main 모두 /records prefix를 붙입니다.’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

10강. 프로젝트 폴더 구조와 Router 분리 미완료 상태