[python] SQLAlchemy-Utils를 사용하여 멀티테넌시 데이터베이스 지원하기

이번 포스트에서는 Python의 SQLAlchemy 라이브러리와 SQLAlchemy-Utils 패키지를 사용하여 멀티테넌시 데이터베이스를 구현하는 방법에 대해 알아보겠습니다. 멀티테넌시는 여러 고객이나 그룹이 동일한 애플리케이션을 사용하면서 완전히 격리된 데이터베이스를 유지하는 구조를 의미합니다.

SQLAlchemy-Utils란?

SQLAlchemy-Utils는 SQLAlchemy를 보완하는 유용한 기능을 제공하는 패키지입니다. 이 패키지를 사용하면 멀티테넌시를 비롯한 여러 다양한 데이터베이스 관련 작업을 보다 쉽게 처리할 수 있습니다.

멀티테넌시 데이터베이스 모델링

먼저, 멀티테넌시 모델을 데이터베이스에 적용하기 위해 SQLAlchemy-Utils의 Tenant 클래스를 사용하여 각 테넌트에 대한 정보를 저장하는 테이블을 생성합니다.

from sqlalchemy_utils import create_view

class Tenant(Base):
    __tablename__ = 'tenants'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.String(50), unique=True, nullable=False)

위 코드에서 Tenant 클래스는 고유한 idname을 가지는 테넌트를 표현합니다. 이제 해당 테넌트에 대한 데이터를 저장할 테이블을 만들었습니다.

테넌트별 데이터 저장

애플리케이션의 각 테이블에 대해 테넌트를 식별할 수 있는 컬럼을 추가해야 합니다. SQLAlchemy-Utils의 TenantScopedSession을 사용하여 각 세션에 올바른 테넌트 스코프를 설정할 수 있습니다.

from sqlalchemy_utils import TenantScopedSession, create_multi_tenant_engine

engine = create_multi_tenant_engine('sqlite:///:memory:')
session = TenantScopedSession(session_factory(), Tenant, scopefunc=lambda: current_tenant)

위 코드에서 create_multi_tenant_engine 함수를 사용하여 멀티테넌시를 지원하는 엔진을 생성하고, TenantScopedSession을 사용하여 테넌트 스코프가 적용된 세션을 생성합니다.

결론

SQLAlchemy-Utils를 사용하면 멀티테넌시를 쉽게 구현할 수 있습니다. 이를 통해 여러 테넌트가 공통된 데이터베이스를 공유하면서도 완벽한 격리를 유지할 수 있습니다. SQLAlchemy-Utils의 다양한 유틸리티를 활용하여 데이터베이스 작업을 더욱 간단하고 효율적으로 처리할 수 있습니다.

더 많은 정보를 원하시면 SQLAlchemy-Utils 공식 문서를 참고하시기 바랍니다.

잘 읽어주셔서 감사합니다!