세션 기초
세션 기초 (Session Basics)
SQLAlchemy ORM에서 세션(Session)은 영속성의 기본 작업 단위예요. 세션은 파이썬 객체의 상태 변화를 추적하고, 필요한 시점에 데이터베이스로 내보내는(flush) 역할을 해요. 세션은 엔진에서 만들어지며, sessionmaker로 세션 팩토리를 생성해서 사용하는 게 2.0 표준 방식이에요.
세션 만들기
보통 앱은 세션 팩토리(sessionmaker)를 하나 만들고, 요청이나 작업 단위마다 세션을 하나씩 사용해요.
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
engine = create_engine("postgresql+psycopg://scott:tiger@localhost/mydb")
Session = sessionmaker(bind=engine)
with Session() as session:
# 세션 사용
...
세션의 핵심 개념
- 영속 상태 추적 — 세션에
add()된 객체는 영속(persistent) 상태로 관리되며, 이후 변경이 추적돼요. - flush와 commit —
session.commit()을 호출하면 세션이 현재 상태를 flush해서 SQL로 내보낸 뒤 트랜잭션을 커밋해요. - 트랜잭션 관리 — 세션은 트랜잭션과 묶여 있으며, 오류가 나면
session.rollback()으로 되돌릴 수 있어요. - begin 패턴 — 2.0부터는
with Session.begin() as session:처럼 컨텍스트로 트랜잭션을 함께 시작하는 패턴을 권장해요.
with Session.begin() as session:
session.add(User(name="spongebob", fullname="Spongebob Squarepants"))
이렇게 하면 블록을 정상적으로 빠져나올 때 자동으로 커밋되고, 예외가 나면 롤백돼요.
세션은 스레드에 안전하지 않다
세션은 여러 스레드가 공유하도록 설계되지 않았어요. 요청마다 새 세션을 만들고 쓰는 방식이 원칙이며, 동시성은 스레드별로 분리된 세션으로 처리하는 게 안전해요.