DB 연동) 모델, 스키마 쓰임새 차이점

호박이와 칼림바·2024년 4월 20일
0

회사 적응기

목록 보기
4/6
post-thumbnail

📗목차

FastAPI로 서버 구축을 하면서, DB 연동할 때 사용되는 Schema와 Model의 차이점이 무엇인지 궁금했다. 둘 다 똑같이 데이터베이스의 데이터 형식을 정의하는 것이지만, 약간의 차이가 있었다.

스키마는 데이터 형식을 간단하게 정의하고, 모델은 비교적 자세하게 정의한다. 그 이유를 알고 싶어졌다.
이 둘의 차이점을 정리하고자 쉬운 예로 TodoList의 CRUD 코드 중 Create 부분만 살펴볼 것이다.

1. 스키마 (Schema):

아래의 코드는 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
  • 스키마는 데이터의 구조와 유효성을 정의한다.

    • 일반적으로 데이터 유효성 검사(validation) 및 직렬화(serialize)에 사용된다.
  • 클라이언트로부터의 입력을 검증하고, 필요한 경우 형식을 변환하여 모델에 삽입 가능한 형태로 준비한다.

  • 여러 데이터 유효성 검사 규칙을 포함할 수 있다.

  • 보통 데이터베이스 스키마와는 직접적인 관련이 없으며, 데이터베이스에 데이터를 저장하기 전에 데이터를 정리하고 준비하는 역할을 한다.

2. 모델 (Model):

아래의 코드는 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)
  • 모델은 데이터베이스의 실제 테이블과 매핑된다.

  • 데이터베이스에 저장되는 실제 데이터를 나타낸다.

    • 데이터베이스와의 상호 작용을 관리하고, 데이터의 생성, 읽기, 수정, 삭제(CRUD) 등의 작업을 수행한다.
  • 모델 객체는 스키마로부터 생성된 데이터를 기반으로 생성된다.

    • = 모델은 스키마를 사용하여 만든 인스턴스

      • 이 인스턴스에는 기능적이기 때문에 데이터베이스를 조작할 수 있는 함수들이 포함되어 있다.

3. 결론

Database 연동에 사용되는 스키마, 모델

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은 이러한 데이터를 데이터베이스에 저장하고 관리하는 역할

스키마는 일종의 설계도이고, 모델은 스키마로 만든 인스턴스이다.


참고문헌

https://meir.tistory.com/m/681

profile
프론트엔드 개발자입니다.

0개의 댓글

관련 채용 정보