본문 바로가기

[FastAPI] Schemas 예제 개념 정리

@Jeeqong 2025. 3. 21. 10:26
반응형
schemas.py는 FastAPI에서 Pydantic을 활용하여 API의 데이터 검증과 직렬화를 담당하는 파일임.
주로 요청(Request)과 응답(Response)에서 사용되는 데이터 구조를 정의하는 역할

1. schemas.py의 역할

  1. 데이터 유효성 검사
    • 클라이언트에서 들어오는 데이터를 검증하고, 백엔드 로직이 예상하는 형식과 일치하는지 확인.
    • 예를 들어 start_date가 날짜 형식인지, product_name이 비어있지 않은지 검사.
  2. 데이터 직렬화 및 역직렬화
    • Python 객체를 JSON 형식으로 변환하여 API 응답으로 보내거나,
      JSON 데이터를 Python 객체로 변환하여 FastAPI 내부에서 처리.
  3. 코드 가독성 향상
    • API 요청과 응답 형식을 명확하게 정의하여 개발자가 쉽게 이해할 수 있도록 도와줌.

2.  schemas.py의 기능  요약

  • schemas.py는 API 데이터 검증 & 직렬화를 담당.
  • models.py와 분리하여 요청(Request), 응답(Response) 데이터 구조를 관리.
  • orm_mode = True로 SQLAlchemy ORM과 호환 가능하게 설정.

3. schemas.py의 주요 구성

일반적으로 schemas.py는 Pydantic을 사용해서 Base 모델을 만들고, 요청/응답용 모델을 따로 구분해서 관리해.

📌 models.py 기본 구조

from pydantic import BaseModel
from typing import Optional, List
from datetime import datetime

# 공통 속성을 가진 기본 Schema
class EventProductBase(BaseModel):
    product_name: str
    brand: Optional[str] = None
    category: Optional[str] = None
    start_date: datetime
    end_date: datetime
    user_id: Optional[str] = None

# 생성 (POST 요청 시 사용)
class EventProductCreate(EventProductBase):
    pass

# 수정 (PATCH, PUT 요청 시 사용)
class EventProductUpdate(BaseModel):
    product_name: Optional[str] = None
    brand: Optional[str] = None
    category: Optional[str] = None
    start_date: Optional[datetime] = None
    end_date: Optional[datetime] = None

# 응답용 Schema (id 포함)
class EventProductResponse(GroupBuyingEventBase):
    id: str
    created_at: datetime

    class Config:
        orm_mode = True  # SQLAlchemy 모델을 Pydantic 모델로 변환 가능하게 함

4. schemas.py에서 사용된 주요 개념

  1. BaseModel
    • FastAPI에서 Pydantic을 사용하여 데이터 검증을 수행하는 기본 클래스.
  2. Optional[str] = None
    • 해당 필드가 선택 사항(Nullable)이라는 의미.
  3. orm_mode = True
    • 데이터베이스 모델(SQLAlchemy ORM)과 Pydantic 모델을 호환 가능하게 만듦.
  4. 요청과 응답을 분리하는 이유
    • Create 모델은 요청 시 필요한 필드만 포함.
    • Response 모델은 DB에서 가져온 추가 데이터(id, created_at 등) 포함.

5 schemas.py와 models.py의 관계

  • models.py는 실제 데이터베이스 ORM 모델을 정의하는 곳.
  • schemas.py는 API에서 데이터를 주고받을 때 사용할 DTO(Data Transfer Object) 역할을 함.

예제: models.py와 비교

📌 models.py

from sqlalchemy import Column, String, DateTime
from database import Base
import uuid
from datetime import datetime

class EventProductEvent(Base):
    __tablename__ = "event_products"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    product_name = Column(String, nullable=False)
    brand = Column(String)
    category = Column(String)
    start_date = Column(DateTime, nullable=False)
    end_date = Column(DateTime, nullable=False)
    user_id = Column(String, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow)

📌 schemas.py

class EventProductResponse(EventProductBase):
    id: str
    created_at: datetime

    class Config:
        orm_mode = True

✅ orm_mode = True 덕분에 SQLAlchemy 모델을 직접 Pydantic 모델로 변환 가능!


6. 실제 API에서 사용 예시 (routes/schedules.py)

 
  • 요청(Request): GroupBuyingEventCreate 모델을 사용해 데이터를 검증.
  • 응답(Response): GroupBuyingEventResponse 모델을 사용해 API 응답을 형식화.
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from database import get_db
from schemas import EventProductCreate, EventProductResponse
from models import EventProduct
import crud

router = APIRouter()

@router.post("/event-product", response_model=EventProductResponse)
def create_event(event: EventProductCreate, db: Session = Depends(get_db)):
    return crud.create_event_product(db, event)

[🌎 Dev(for macos)/Python] - [FastAPI] Schemas Models 와 다른 경우 예제

반응형
Jeeqong
@Jeeqong :: JQVAULT

Jeeqong's vault : 정보/기록을 쌓아두는 공간 웹개발 포스팅 일상 리뷰를 기록하는 공간입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차