[FastAPI 1일차] FastAPI 튜토리얼: 개념부터 코드까지 한눈에 정리 2/2 (250526)

2025. 5. 26. 20:52·특강

FastAPI에서 패스 변수, 쿼리 파라미터, 리퀘스트 바디를 처리하는 방법


  1. 🚀 FastAPI의 API와 쿼리 파라미터 처리

FastAPI는 API를 정의하면 Swagger UI에서 자동으로 문서화되고, 클라이언트는 웹 인터페이스를 통해 API를 직접 테스트할 수 있습니다.

  • 경로 매개변수(Path Parameter): URL의 중괄호({})를 사용해 정의하며, 함수 인자에 타입을 명시하여 사용합니다.
  • 쿼리 파라미터(Query Parameter): URL 뒤에 ?key=value 형식으로 붙으며, 함수의 매개변수에서 기본값과 타입을 설정해 처리합니다.

1.1 API 추가의 장점

  • 자동 문서화 → Swagger UI에서 시각적으로 확인 가능
  • Try it out → 실시간 호출 및 결과 확인
  • Postman 없이도 테스트 가능
  • JWT 같은 인증 방식도 연동 가능
  • 문서 개선 시 입력/응답 형식까지 명확하게 표현 가능

1.2 동적 URL 경로 처리

@app.get("/items/{item_id}")
def get_item(item_id: int):
    return {"item_id": item_id}
  • 중괄호로 경로에 변수를 삽입하고, 핸들러 함수에서 타입을 지정해 사용할 수 있습니다.
  • 숫자형이면 연산 가능 (예: item_id + 100)
  • 타입 불일치 시 → 자동으로 에러 메시지 발생

1.3 타입 지정 및 에러 처리

  • int, str, float 등으로 함수 인자의 타입을 제한할 수 있으며, 잘못된 입력 시 FastAPI가 자동으로 파싱 오류를 반환합니다.
  • 예: abc를 int로 지정된 매개변수에 넣으면 "value is not a valid integer" 오류 발생

1.4 쿼리 파라미터 개념 및 활용

@app.get("/items")
def read_items(max_price: int, category: str | None = None):
    if category:
        return {"max_price": max_price, "category": category}
    return {"max_price": max_price}
  • 쿼리 파라미터는 URL의 ?key=value 형식으로 전달
  • 필수로 설정하지 않으려면 기본값 None 또는 값을 지정
  • 클라이언트가 추가적인 파라미터를 보낼 경우 → 무시되거나 기본값 적용됨

1.5 패스 변수 vs 쿼리 파라미터

항목 패스 변수 쿼리 파라미터

정의 위치 URL 경로 URL ? 뒤
필수 여부 반드시 필요 선택 가능 (기본값 지정 시)
선언 방식 @app.get("/items/{id}") def func(id: int = 0)
목적 특정 자원 식별 필터, 조건 지정 등

  1. 🛠️requestbody 처리와 Pydantic 사용법

2.1 Requestbody?

  • 주로 POST, PUT, PATCH 요청 시 사용
  • JSON 형식의 데이터를 본문(request body)에 담아 전송

2.2 Pydantic이란?

  • Python 데이터 유효성 검사 및 변환용 라이브러리
  • FastAPI는 내부적으로 Pydantic의 BaseModel을 활용해 요청/응답 데이터를 다룹니다.

2.3 Pydantic 모델 정의 예시

from pydantic import BaseModel
from datetime import date

class UserSignupRequest(BaseModel):
    username: str
    age: int
    date_of_birth: date
  • 클래스 변수에 타입 힌트를 명시
  • 타입이 일치하지 않으면 자동 에러 발생 (밸리데이션)
  • 날짜 형식은 문자열(예: "2000-01-01")도 자동 변환 가능

2.4 FastAPI에서 리퀘스트 바디 처리 예시

@app.post("/items")
def create_item(item: ItemCreateRequest):
    return {"name": item.name, "price": item.price}
  • 함수 인자에 BaseModel 상속 모델을 타입으로 지정 → FastAPI는 이를 JSON Body로 인식
  • Swagger UI에서 자동으로 JSON 입력 템플릿 제공됨

2.5 자동 타입 변환 및 유효성 검사

  • age: int → 문자열로 전달돼도 자동으로 int로 변환 시도
  • 불리언 값도 0/1 → False/True로 변환 가능
  • 그러나 명확하지 않거나 허용 범위 밖의 값은 에러 발생

2.6 Pydantic vs DRF Serializer

항목 Pydantic DRF Serializer

주요 목적 데이터 유효성 검사 및 구조화 직렬화/역직렬화 + 유효성 검사
타입 힌트 활용 O 제한적
자동 타입 변환 강력함 일부 지원
활용 범위 요청 + 응답 데이터 주로 요청 데이터 (응답은 Response 객체)

  1. 📆 예제 실행 결과
  • GET /items/1 → {"item_id": 1}
  • GET /items?max_price=100 → {"max_price": 100}
  • GET /items?max_price=100&category=food → {"max_price": 100, "category": "food"}
  • POST /items (JSON body: {"name": "아이폰", "price": 1200000}) → 응답 동일

  1. 📈 요약 정리
  • 패스 변수는 URL 경로에 중괄호로 선언하고 함수 인자와 타입을 일치시켜 처리
  • 쿼리 파라미터는 함수 인자에 기본값/타입을 지정해 처리 (선택적 전달 가능)
  • 리퀘스트 바디는 Pydantic의 BaseModel을 상속한 클래스를 통해 구조 정의 및 유효성 검사 수행
  • FastAPI는 Swagger UI에서 API 테스트와 문서화 기능을 기본 제공
  • Pydantic은 직렬화/역직렬화 + 타입 검사를 모두 지원하는 핵심 도구

이렇게 정리된 내용을 기반으로 FastAPI를 활용한 API 개발에 보다 효율적으로 접근할 수 있습니다 ✨

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

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

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

  • 공지사항

  • 인기 글

  • 태그

    livebroadcast
    btsjungkook
    americaparty
    smartphonedurability
    lawsuitculture
    bts
    homebartrend
    urbantrends
    RM
    americanlaw
    chatgpterror
    btsdischarge
    btscomeback
    college reunions
    self-growth
    global politics
    gpterror
    trumpmuskclash
    chinanightlife
    basalcellcarcinoma
    remittance
    youngprofessionals
    btsreunion
    newpoliticalparty
    classaction
    travel ban
    뷔
    life reflection
    titaniumcase
    hotcoffeecase
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
[FastAPI 1일차] FastAPI 튜토리얼: 개념부터 코드까지 한눈에 정리 2/2 (250526)
상단으로

티스토리툴바