세션 샤딩(Session Sharding)은 데이터베이스 수평 분할(샤딩)을 지원하는 ORM(Object-Relational Mapping) 기술입니다. 주로 SQLAlchemy에서 ShardedSession 클래스로 구현되며, 하나의 논리적 세션이 여러 데이터베이스 샤드에 걸친 작업을 투명하게 처리할 수 있도록 합니다.
주요 구성 요소
세션 샤딩은 다음 세 가지 핵심 결정자(chooser)를 통해 작동합니다:
샤드 결정자 (Shard Chooser): 매퍼(Mapper), 매핑된 인스턴스, 그리고 선택적으로 SQL 절을 인자로 받아 저장할 샤드 ID를 반환합니다. 이는 객체의 속성(예: 지역 코드)이나 라운드 로빈 방식으로 결정될 수 있습니다.
ID 결정자 (ID Chooser): 쿼리와 기본 키 값 튜플을 받아 해당 ID가 존재할 가능성이 있는 샤드 ID 목록을 반환합니다. ID로 객체를 조회할 때 이 목록 순서대로 샤드를 질의합니다.
쿼리 결정자 (Query Chooser): 주어진 쿼리에 대해 질의를 수행할 샤드 ID 목록을 반환하며, 모든 샤드의 결과가 하나로 병합됩니다.
작동 방식
ShardedSession은 connection()과 get_bind() 메서드를 통해 적절한 데이터베이스 연결을 관리합니다.
저장(Persistence): 객체를 저장할 때 shard_chooser가 호출되어 적절한 샤드를 선택합니다.
조회(Query): 일반 쿼리는 query_chooser가, ID 기반 조회(get())는 id_chooser가 샤드를 결정합니다. 이때 set_shard() 메서드로 특정 샤드에만 질의하도록 제한할 수도 있습니다.
사용 시 고려사항
트랜잭션: ShardedSession은 각 샤드에 대한 연결을 트랜잭션 내에서 관리합니다.
결과 정렬: 여러 샤드에서 가져온 결과는 자동으로 정렬되지 않으며, 필요시 애플리케이션 레벨에서 처리해야 합니다.
세션 샤딩은 대규모 애플리케이션에서 데이터를 수평적으로 확장하고자 할 때 유용한 패턴입니다.