[FastAPI 2일차] 📘 FastAPI 라우팅과 응답 구조 마스터 가이드 2/2 (250528)

2025. 5. 28. 19:40·특강

📘 FastAPI 라우팅과 응답 구조 마스터 가이드


이 글은 FastAPI를 활용한 실전 API 개발에서 라우팅 구조화, 정규표현식 검증, 요청 및 응답 처리, 파일 업로드/다운로드까지의 전 과정을 정리한 내용입니다. 특히 APIRouter와 Pydantic을 중심으로 코드 설계와 Swagger 문서화 품질을 향상시키는 방법에 대해 다룹니다.

1. 📱 정규 표현식과 패턴 검증

  • 휴대폰 번호 형식(010-XXXX-XXXX)을 정규표현식으로 검증.
  • \d{4} 표현으로 0~9 숫자 4자리 제약을 설정.
  • Query와 Path 파라미터에서 조건부 유효성 검사 가능.

💡 실전 팁: 숫자 자리수 외에도 startswith, min_length, max_length 등 조건 조합 가능.

2. 🛠️ FastAPI 요청 처리 방식

  • Pydantic 모델 없이 단일 값만 받을 경우 Body(embed=True)로 처리 가능.
  • 쿼리/패스/바디 각각의 데이터 수신 방식 명확히 구분해야 함.
  • Request Body로 받는 값은 Swagger에서 JSON 형태로 입력됨.

✅ embed=True 사용 시 JSON 키 이름이 모델 속성과 일치해야 함.

3. 📁 FastAPI 프로젝트 구조 관리하기

3.1 프로젝트 분리 필요성

  • main.py에 모든 API 작성 시 확장성 부족.
  • Django의 앱 구조처럼 논리적 단위로 나누는 것이 유지보수에 효과적.

3.2 폴더 및 파일 구조화

  • 예: user/routers.py, item/routers.py 등으로 분할.
  • 각 라우터 모듈에서는 APIRouter() 객체를 생성하여 API 등록.
from fastapi import APIRouter
router = APIRouter()

@router.get("/items")
def get_items():
    return [{"name": "item1"}]

3.3 main.py 연결 구조

  • 각각의 router를 main.py에서 include_router로 등록.
from item.routers import router as item_router
from user.routers import router as user_router

app.include_router(item_router, prefix="/api/v1/items", tags=["items"])
app.include_router(user_router, prefix="/api/v1/users", tags=["users"])

4. 🖼️ FastAPI에서 이미지와 파일 처리하기

4.1 이미지 업로드

  • UploadFile을 이용한 multipart/form-data 업로드 처리 가능
from fastapi import UploadFile, File

@router.post("/upload")
def upload_image(image: UploadFile = File(...)):
    return {"filename": image.filename, "content_type": image.content_type}

4.2 HTML 및 Plain 텍스트 응답

  • HTML: HTMLResponse 사용
  • Plain 텍스트: Response(media_type="text/plain") 사용

4.3 파일 다운로드 처리

  • FileResponse로 이미지 등 파일 반환 가능
  • Content-Disposition 헤더로 자동 다운로드 가능
from fastapi.responses import FileResponse

@app.get("/download")
def download():
    return FileResponse("images/pizza.jpg", headers={
        "Content-Disposition": "attachment; filename=pepperoni.jpg"
    })

5. ✅ 응답 타입 명시 및 검증

5.1 Pydantic 모델로 응답 구조 지정

class NowResponse(BaseModel):
    now: datetime

@app.get("/now", response_model=NowResponse)
def get_now():
    return {"now": datetime.now()}
  • 응답 데이터가 문서에 미리 반영됨 → Swagger UI 가독성 향상
  • 잘못된 타입 반환 시 자동 검증

5.2 JSONResponse 활용

  • 응답 데이터 직접 변환 필요 시 사용
from fastapi.responses import JSONResponse

@app.get("/custom")
def custom():
    return JSONResponse(content={"message": "Hello"})

5.3 파일 다운로드 시 사용자 경험 개선

  • 브라우저에서 파일 다운로드가 자동으로 되도록 하려면 HTTP 헤더 Content-Disposition에 attachment 값을 설정해야 함.
  • 파일명 변경도 가능하여 UX 측면에서 유리함.
return FileResponse("path/to/image.jpg", headers={
    "Content-Disposition": "attachment; filename=custom_name.jpg"
})

💡 주의: 다운로드 기능은 FastAPI의 기능이라기보다 브라우저의 처리 방식이며, 서버는 응답 헤더 설정만 제공.

5.4 응답 데이터에 대한 타입 보장 및 오류 방지

  • BaseModel을 활용하면 응답 데이터의 타입을 명확히 선언할 수 있음.
  • 반환 값이 잘못된 타입일 경우 FastAPI가 에러를 발생시켜 디버깅에 용이.
  • 클라이언트와의 데이터 타입 약속을 명시적으로 유지 가능.

💡 예: datetime을 반환해야 할 API에서 문자열이나 숫자가 반환되면 검증 에러 발생.

5.5 타입 힌트로 API 문서 자동화 극대화

  • response_model=MyModel 선언은 Swagger 문서에 자동으로 응답 예시를 생성.
  • 타입 힌트를 통해 API의 입력/출력 구조를 명확히 표현할 수 있어 유지보수에 유리.
  • 복잡한 응답 구조도 명확하게 시각화되어 API 소비자 입장에서 큰 도움 제공.
@app.get("/users", response_model=List[User])
def list_users():
    return [User(id=1, name="Alice"), User(id=2, name="Bob")]

📌 응답 모델은 단순 리스트 외에도 중첩된 구조, Optional, Union 타입 등도 표현 가능.

✅ 요약 정리

  • APIRouter로 API 라우팅을 논리적 단위로 구조화 가능.
  • Prefix, tags 설정으로 Swagger 문서 품질 향상.
  • UploadFile, FileResponse로 파일 업로드/다운로드 처리.
  • BaseModel로 요청/응답 데이터 유효성 검사 가능.
  • HTML/PlainText/JSON 다양한 형식의 응답 가능.
  • response_model + 타입 힌트로 API 문서 자동화 품질 향상.

💡 FastAPI는 개발자의 설계 의도를 Swagger에 그대로 반영해주기 때문에, 구조적으로 깔끔하게 설계해두는 것이 문서화 품질에도 직결됩니다.

'특강' 카테고리의 다른 글

🚀 FastAPI 요청과 응답 처리 흐름 완전 정리  (0) 2025.05.28
[FastAPI 2일차] FastAPI에서 타입 힌트(Type Hint)의 목적과 활용법 완전 정리 1/2 (250528)  (0) 2025.05.28
[FastAPI 1일차] FastAPI 튜토리얼: 개념부터 코드까지 한눈에 정리 2/2 (250526)  (0) 2025.05.26
[FastAPI 1일차] FastAPI 튜토리얼: 개념부터 코드까지 한눈에 정리 1/2 (250526)  (0) 2025.05.26
🚀 FastAPI 입문 가이드: 설치부터 실행까지 한 번에!(1일차)  (0) 2025.05.26
'특강' 카테고리의 다른 글
  • 🚀 FastAPI 요청과 응답 처리 흐름 완전 정리
  • [FastAPI 2일차] FastAPI에서 타입 힌트(Type Hint)의 목적과 활용법 완전 정리 1/2 (250528)
  • [FastAPI 1일차] FastAPI 튜토리얼: 개념부터 코드까지 한눈에 정리 2/2 (250526)
  • [FastAPI 1일차] FastAPI 튜토리얼: 개념부터 코드까지 한눈에 정리 1/2 (250526)
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (730) N
      • Python (32)
      • 프로젝트 (55) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41) N
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5) N
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (13) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    self-growth
    trumpmuskclash
    lawsuitculture
    RM
    youngprofessionals
    chansmannewspick
    뷔
    basalcellcarcinoma
    global politics
    livebroadcast
    titaniumcase
    hotcoffeecase
    bts
    smartphonedurability
    galaxys25ultra
    college reunions
    urbantrends
    oliveoilhealth
    classaction
    remittance
    foodshortage
    life reflection
    americanlaw
    homebartrend
    newpoliticalparty
    militarydischarge
    japanricecrisis
    travel ban
    americaparty
    chinanightlife
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
[FastAPI 2일차] 📘 FastAPI 라우팅과 응답 구조 마스터 가이드 2/2 (250528)
상단으로

티스토리툴바