반응형
schemas.py는 FastAPI에서 Pydantic을 활용하여 API의 데이터 검증과 직렬화를 담당하는 파일임.
주로 요청(Request)과 응답(Response)에서 사용되는 데이터 구조를 정의하는 역할
1. schemas.py의 역할
- 데이터 유효성 검사
- 클라이언트에서 들어오는 데이터를 검증하고, 백엔드 로직이 예상하는 형식과 일치하는지 확인.
- 예를 들어 start_date가 날짜 형식인지, product_name이 비어있지 않은지 검사.
- 데이터 직렬화 및 역직렬화
- Python 객체를 JSON 형식으로 변환하여 API 응답으로 보내거나,
JSON 데이터를 Python 객체로 변환하여 FastAPI 내부에서 처리.
- Python 객체를 JSON 형식으로 변환하여 API 응답으로 보내거나,
- 코드 가독성 향상
- 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에서 사용된 주요 개념
- BaseModel
- FastAPI에서 Pydantic을 사용하여 데이터 검증을 수행하는 기본 클래스.
- Optional[str] = None
- 해당 필드가 선택 사항(Nullable)이라는 의미.
- orm_mode = True
- 데이터베이스 모델(SQLAlchemy ORM)과 Pydantic 모델을 호환 가능하게 만듦.
- 요청과 응답을 분리하는 이유
- 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 와 다른 경우 예제
반응형
'Dev > Python' 카테고리의 다른 글
[Python] 주석(Comment) vs. 독스트링(Docstring) 차이점 (0) | 2025.03.24 |
---|---|
[FastAPI] Schemas Models 와 다른 경우 예제 (0) | 2025.03.22 |
🚨[Alembic] 명령어 및 오류 설정확인 (0) | 2025.03.20 |
[FastAPI] FastAPI+ Alembic 설정 및 프로세스 정리 (0) | 2025.03.19 |
[Python] Code Formatter 코드포매터 (0) | 2025.03.17 |