📗목차
FastAPI로 서버 구축을 하면서, DB 연동할 때 사용되는 Schema와 Model의 차이점이 무엇인지 궁금했다. 둘 다 똑같이 데이터베이스의 데이터 형식을 정의하는 것이지만, 약간의 차이가 있었다.
스키마는 데이터 형식을 간단하게 정의하고, 모델은 비교적 자세하게 정의한다. 그 이유를 알고 싶어졌다.
이 둘의 차이점을 정리하고자 쉬운 예로 TodoList의 CRUD 코드 중 Create
부분만 살펴볼 것이다.
아래의 코드는 TodoList
테이블의 컬럼들을 나열한 것이다.
schema.py
from pydantic import BaseModel import datetime class TodoList(BaseModel): id: int = None content: str = None created_at: datetime.datetime = None updated_at: datetime.datetime = None deleted_at: datetime.datetime = None
스키마는 데이터의 구조와 유효성을 정의한다.
클라이언트로부터의 입력을 검증하고, 필요한 경우 형식을 변환하여 모델에 삽입 가능한 형태로 준비한다.
여러 데이터 유효성 검사 규칙을 포함할 수 있다.
보통 데이터베이스 스키마와는 직접적인 관련이 없으며, 데이터베이스에 데이터를 저장하기 전에 데이터를 정리하고 준비하는 역할을 한다.
아래의 코드는 TodoList
테이블의 컬럼들을 나열한 것이다.
위의 스키마 TodoList
테이블 컬럼들과는 조금 차이가 있는 것을 확인할 수 있다.
model.py
from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.sql import func from sqlalchemy.orm import declarative_base Base = declarative_base() class TodoList(Base): __tablename__ = "list" id = Column(Integer, primary_key=True, autoincrement=True) content = Column(String(255)) created_at = Column(DateTime, nullable=False, default=func.now()) updated_at = Column(DateTime, nullable=False, default=func.now(), onupdate=func.now()) deleted_at = Column(DateTime)
모델은 데이터베이스의 실제 테이블과 매핑된다.
데이터베이스에 저장되는 실제 데이터를 나타낸다.
모델 객체는 스키마로부터 생성된 데이터를 기반으로 생성된다.
= 모델은 스키마를 사용하여 만든 인스턴스
app.py
from fastapi import FastAPI, Depends from starlette.middleware.cors import CORSMiddleware # CORS 에러 방지 생략 from database import EngineConn # database.py 생략 from model import TodoList as TodoListModel from schema import TodoList as TodoListSchema from sqlalchemy.sql import func # 생략 # FastAPI 앱 생성 app = FastAPI() ## ... ## 코드 일부 생략 ## ... # 데이터베이스 세션 연결 engine = EngineConn() session = engine.sessionmaker() # 새로운 항목을 추가하는 엔드포인트 @app.post("/add_todo") def create_todo(todo: TodoListSchema): new_todo = TodoListModel(content = todo.content, deleted_at = None) session.add(new_todo) session.commit() return new_todo ## ... ## 코드 일부 생략 ## ...
위 코드에서
TodoListSchema
는 클라이언트로부터 받은 데이터를 검증하고 준비하는 역할
TodoListModel
은 이러한 데이터를 데이터베이스에 저장하고 관리하는 역할
스키마는 일종의 설계도이고, 모델은 스키마로 만든 인스턴스이다.
참고문헌