세션 기초

세션 기초 (Session Basics)

SQLAlchemy ORM에서 세션(Session)은 영속성의 기본 작업 단위예요. 세션은 파이썬 객체의 상태 변화를 추적하고, 필요한 시점에 데이터베이스로 내보내는(flush) 역할을 해요. 세션은 엔진에서 만들어지며, sessionmaker로 세션 팩토리를 생성해서 사용하는 게 2.0 표준 방식이에요.

출처: SQLAlchemy — Session Basics

세션 만들기

보통 앱은 세션 팩토리(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와 commitsession.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"))

이렇게 하면 블록을 정상적으로 빠져나올 때 자동으로 커밋되고, 예외가 나면 롤백돼요.

세션은 스레드에 안전하지 않다

세션은 여러 스레드가 공유하도록 설계되지 않았어요. 요청마다 새 세션을 만들고 쓰는 방식이 원칙이며, 동시성은 스레드별로 분리된 세션으로 처리하는 게 안전해요.

더 알아보기