본문 바로가기
Programing

SQLAlchemy Column vs Mapped

by xuswns 2026. 4. 30.

FastAPI 미니 실습을 진행하다가 예제 Model 파일을 보면서 내가 짜는 코드랑 달라서 찾아봤는데

SQLAlchemy model 정의방식이 새로 나왔다는 것을 알았다.

기존 방식 - Column(1.x)

from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, DateTime
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class Todo(Base):
    __tablename__ = 'todo'

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(100), nullable=False)
    description = Column(String(500), nullable=True)
    is_done = Column(Boolean, default=False, nullable=False)
    priority = Column(Integer, nullable=False)
    category_id = Column(Integer, ForeignKey('category.id'), nullable=False)

다들 많이 써본 방식일 것이다.

각 필드를 Column()객체로 선언하고, nullable, default 같은 옵션을 인자로 전달한다.

 

이 방식은  SQLAlchemy 2.0에서도 동작하지만, 하위 호환성을 유지하기 위해 레거시로 분류했을 뿐 오류는 나지 않는다.


새로운 방식 - Mappend(2.0)

from datetime import datetime, timezone
from sqlalchemy import String, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

class Base(DeclarativeBase):
    pass

class Todo(Base):
    __tablename__ = 'todo'

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    title: Mapped[str] = mapped_column(String(100))
    description: Mapped[str | None] = mapped_column(String(500))
    is_done: Mapped[bool] = mapped_column(default=False)
    priority: Mapped[int]
    category_id: Mapped[int] = mapped_column(ForeignKey('category.id'))

 

가장 눈에 띄는 변화는 python 타입 힌트를 사용한다는 것이다.

 

타입 힌트

- Python 변수나 함수의 데이터 타입을 명시적으로 표시하는 문법이다.

# 타입 힌트 없음
def add(a,b):
	return a+b

#타입 힌트 있음
def add(a :int, b,int) -> int:
	return a+b

 

타입힌트의 특징

  • 런타임의 강제되지 않는다.
  • 힌트일 뿐, Python이 타입을 체크하지 않는다.
  • 정적분석도구나 IDE가 타입오류를 미리 잡아준다.
    • Column방식은 이를 할 수 없었다.
  • 코드 가독성과 자동완성 품질이 올라간다.

SQLAlchemy에서의 타입힌트

위 코드에서는 Mapped[T]를 대표적으로 볼 수 있다.

해석하자면

이 컬럼은 T type이다 라는 타입 힌트이며, SQLAlchemy가 이걸 읽어서 컬럼정의까지 자동처리하게 된다.

 

Mapped[str | None] 은 이 컬럼은 str타입이며 nullable=True를 의미한다.


Base 클래스 정의 방식

 

# 구버전 — 함수 호출로 생성
from sqlalchemy.orm import declarative_base
Base = declarative_base()

# 신버전 — 클래스 상속으로 정의
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
    pass

https://leapcell.io/blog/ko/why-sqlalchemy-20-is-the-most-powerful-python-orm-yet

 

SQLAlchemy 2.0이 가장 강력한 Python ORM인 이유 | Leapcell

SQLAlchemy는 Python 생태계에서 가장 인기 있는 ORM(Object Relational Mapping)입니다. 우아한 디자인을 가지고 있으며, 기본 Core와 상위 레벨의 전통적인 ORM의 두 부분으로 나뉩니다. Python뿐만 아니라 다른

leapcell.io

 

'Programing' 카테고리의 다른 글

OpenCV와 Python을 활용한 명함 이미지 보정  (0) 2026.05.07
영상처리 입문  (0) 2026.05.06
Python - Class  (0) 2026.04.17
Python - List  (0) 2026.04.14
머신러닝  (0) 2026.04.13