1. SQLAlchemy
SQLAlchemy는 파이썬 생태계에서 관계형 데이터베이스를 연결해 주는 라이브러리이다.
개발자들이 데이터베이스를 다룰 때 생기는 복잡성을 줄여주는 ORM(Object Relational Mapper) 중 하나이다.
2. ORM
ORM은 코드로 데이터베이스를 관리하며 생기는 불편함에서 등장하게 되었다.
관계형 데이터베이스는 테이블과 관계를 기반으로 데이터를 관리하지만, 코드에서는 객체를 사용해 데이터를 다룬다.
두 방식의 컨셉 차이 때문에 개발자는 데이터베이스와 코드를 연결할 때 여러 번거로움과 비효율을 겪는다.
ORM은 객체와 데이터베이스의 데이터를 자동으로 연결(mapping)하여 코드로 데이터베이스를 자연스럽게 다룰 수 있도록 돕는다.
ORM을 사용해 users 테이블을 조작하는 예시를 살펴보자.
위 예시에서 User 클래스는 users 테이블과 연결되어 파이썬 객체를 다루듯이 자연스럽게 데이터 추가가 가능하다.
코드를 보면 Session에 객체를 추가하는 방식으로 데이터를 관리하고 있다.
SQLAlchemy의 Session은 무엇일까?
3. SQLAlchemy의 Session
SQLAlchemy의 Session은 데이터베이스와의 모든 상호작용을 관리하는 작업 공간이다.
내부의 identity map을 사용해 동일한 기본 키를 가진 ORM 객체를 하나로 보장하고, SQL 쿼리로 로드하거나 변경된 객체를 보관한다.
이후 flush()로 모아둔 변경사항을 한 번에 데이터베이스에 반영한다.
다음은 Session을 다루는 간단한 코드와 그 동작을 다이어그램으로 나타낸 것이다.
Session은 객체의 변경 사항을 추적하고 트랜잭션 관리를 통해 안전하고 일관된 데이터베이스 작업을 보장한다.
이렇게 변경사항을 모아두었다가 한 번에 반영하는 방식을 Unit of Work 패턴이라고 한다.
Unit of Work (UoW) 패턴
Unit of Work은 여러 번의 변경사항을 모아뒀다가 한 번에 처리하는 패턴이다.
UoW 패턴을 쉽게 이해하기 위해 Git으로 비유할 수 있다.
Git에서 파일을 수정한 뒤 git add로 변경을 Staging Area에 모아 git commit으로 확정하는 상황을 상상해 보자.
SQLAlchemy도 Session 내의 객체 변경사항을 모아두었다가 session.flush() 단계에서 객체 변경사항을 SQL 표현식으로 변환한다.
Session은 UoW 패턴을 사용해 변경사항을 모아두었다가 필요한 시점에만 반영/롤백하여 데이터베이스와의 불필요한 통신을 줄이고 일관성을 유지한다.
4. Session의 객체 상태 관리
SQLAlchemy는 객체마다 어떤 SQL 쿼리를 사용해야 할지 판단해야 한다.
이를 위해 Session은 객체를 다섯 가지 상태로 표현하여 관리한다.
아래 코드에서는 session 조작에 따라 객체의 상태 변화를 확인하고 있다.
inspect() 함수는 객체가 현재 어떤 상태에 해당하는지 boolean으로 반환한다.
1. Transient
현재 Session에 속해 있지 않고 데이터베이스에 저장된 적 없는 인스턴스의 상태이다.
Transient 상태의 객체는 Primary Key가 부여되지 않는다.
2. Pending
Transient 객체에 session.add()를 사용하면 Pending 상태가 되고 객체가 Session에 속하게 된다.
Pending 상태에서는 flush()가 실행되지 않았기 때문에 INSERT SQL이 나가지 않는다.
3. Persistent
객체가 Session에 속해 있고 데이터베이스에 실제 레코드가 존재하는 상태이다.
Pending 상태에서 flush()되면 Persistent 상태로 전이된다.
또한 쿼리 결과로 불러온 객체도 Persistent 상태로 설정된다.
4. Deleted
session.delete()를 호출한 후 flush() 단계에서 DELETE SQL이 생성된 상태이다.
아직 트랜잭션이 커밋되지 않아 삭제가 확정되지 않은 상태이다.
트랜잭션이 커밋되면 Detached로 전이되고 롤백되면 Persistent로 복귀한다. 
5. Detached
과거에 Persistent였거나 데이터베이스와 연결된 식별자를 가진 인스턴스지만 현재 어떤 Session에도 소속되지 않은 상태이다.
Detached 상태의 객체를 조작해도 SQLAlchemy는 데이터베이스와 통신하지 않는다.
5. SQLAlchemy의 구조
SQLAlchemy는 크게 Core 계층과 ORM 계층으로 구성된다.
Core 계층은 SQL Expression Language를 사용해 select(), insert() 등의 SQL 표현식 객체를 생성한다.
이후 해당하는 DB 방언에 맞춰 SQL 문자열로 컴파일한 뒤 DBAPI로 실행합니다.
ORM 계층은 Core 계층 위에서 객체-관계 매핑을 제공한다.
Session 안에서 파이썬 객체의 상태 변경을 누적한 뒤, flush/commit 시점에 누적된 변경사항을 Core의 SQL 표현식으로 변환하여 한 번에 데이터베이스에 반영한다.
참고 자료
Session Basics — SQLAlchemy 2.0 Documentation
Session Basics — SQLAlchemy 2.0 Documentation
Session Basics What does the Session do ? In the most general sense, the Session establishes all conversations with the database and represents a “holding zone” for all the objects which you’ve loaded or associated with it during its lifespan. It pro
docs.sqlalchemy.org
State Management — SQLAlchemy 2.0 Documentation
State Management — SQLAlchemy 2.0 Documentation
State Management Quickie Intro to Object States It’s helpful to know the states which an instance can have within a session: Transient - an instance that’s not in a session, and is not saved to the database; i.e. it has no database identity. The only r
docs.sqlalchemy.org
'공부' 카테고리의 다른 글
FastAPI에서 다형성 요청 처리하기 (0) | 2025.04.19 |
---|---|
DELETE Method와 멱등성 (0) | 2025.04.16 |
FastAPI에서 StreamingResponse 활용 시 DB 세션 관리 (0) | 2025.03.30 |
Triton Inference Server와 비동기 gRPC로 통신하기 (0) | 2025.02.11 |
FastAPI의 페이지네이션 성능 개선기 (0) | 2025.01.30 |
댓글