[python] FastAPI에서 데이터베이스 샤딩 구현하기

FastAPI는 Python으로 작성된 웹 프레임워크로, 빠르고 간편한 API 개발을 도와줍니다. 이번 블로그 포스트에서는 FastAPI를 사용하여 데이터베이스 샤딩을 구현하는 방법에 대해 알아보겠습니다. 데이터베이스 샤딩은 대량의 데이터를 여러 개의 데이터베이스에 분산하여 저장하고 처리하는 기술로, 데이터베이스 성능을 향상시키는 데 도움이 됩니다.

샤딩이란?

샤딩은 데이터베이스의 수평 분할을 의미합니다. 일반적으로 데이터베이스는 한 곳에 모든 데이터를 저장합니다. 하지만 샤딩을 사용하면 데이터를 여러 곳에 나누어 저장할 수 있습니다. 예를 들어, 사용자 데이터를 샤딩한다면, 사용자 A의 데이터는 서버 1에, 사용자 B의 데이터는 서버 2에 저장할 수 있습니다. 이렇게 분할된 데이터를 저장 및 처리함으로써 데이터베이스 전체의 부하를 줄이고 성능을 향상시킬 수 있습니다.

FastAPI에서의 데이터베이스 샤딩 구현

FastAPI는 SQLAlchemy를 통해 다양한 데이터베이스와 상호 작용할 수 있는 기능을 제공합니다. SQLAlchemy는 샤딩을 지원하기 위한 몇 가지 기능을 제공하므로, 이를 활용하여 데이터베이스 샤딩을 구현할 수 있습니다.

먼저, SQLAlchemy를 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다:

pip install sqlalchemy

다음으로, 해당 데이터베이스에 대한 SQLAlchemy 모델 클래스를 정의해야 합니다. 샤딩을 위해 모델 클래스의 일부 ㅍ매개 변수를 변경해야 합니다. 예를 들어, 다음과 같이 모델 클래스를 정의할 수 있습니다:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))
    email = Column(String(50))

위의 예시에서는 사용자 모델을 정의합니다. 테이블 이름은 users를 사용하고, id, name, email 세 가지 열을 정의합니다. 여기서 중요한점은 __tablename__ 속성으로 테이블 이름을 지정하는 것입니다.

다음으로, 여러 데이터베이스 연결을 설정해야 합니다. 샤딩된 데이터베이스에 대한 개별 연결을 설정하는 것이 중요합니다. 이를 위해 SQLAlchemy의 create_engine 기능을 사용합니다. 예를 들어, 다음과 같이 코드를 작성할 수 있습니다:

from sqlalchemy import create_engine

engine1 = create_engine('sqlite:///shard1.db')
engine2 = create_engine('sqlite:///shard2.db')

위의 예시에서는 shard1.db와 shard2.db 라는 두 개의 SQLite 데이터베이스에 대한 연결을 만들고 있습니다.

마지막으로, FastAPI 앱에서 데이터베이스에 연결하고 샤딩된 모델을 사용할 수 있습니다. 이를 위해 FastAPI의 Depends 기능을 사용하여 데이터베이스 연결을 의존성으로 주입합니다. 예를 들어, 다음과 같이 코드를 작성할 수 있습니다:

from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session, sessionmaker

app = FastAPI()

SessionLocal1 = sessionmaker(autocommit=False, autoflush=False, bind=engine1)
SessionLocal2 = sessionmaker(autocommit=False, autoflush=False, bind=engine2)

def get_db(shard: int = 1) -> Session:
    if shard == 1:
        db = SessionLocal1()
    else:
        db = SessionLocal2()
    try:
        yield db
    finally:
        db.close()

@app.get('/users/{user_id}')
def get_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    return user

위의 예시에서는 FastAPI 앱을 생성하고, 데이터베이스 연결을 의존성으로 사용하고 있는 get_user 함수를 정의하였습니다. get_user 함수 내에서 사용자 모델을 샤드 값에 따라 적절한 연결로 쿼리하고 결과를 반환하는 것을 확인할 수 있습니다.

이렇게 FastAPI와 SQLAlchemy를 결합하여 데이터베이스 샤딩을 구현할 수 있습니다. FastAPI의 뛰어난 성능과 SQLAlchemy의 샤딩 기능을 조합하여 대용량의 데이터를 처리하는 웹 애플리케이션을 구축할 수 있습니다.

결론

FastAPI를 사용하여 데이터베이스 샤딩을 구현하는 방법을 살펴보았습니다. 데이터베이스 샤딩은 대량의 데이터를 처리하는 데 도움이 되는 중요한 기술입니다. FastAPI와 SQLAlchemy의 결합을 통해 샤딩된 데이터베이스를 사용하는 웹 애플리케이션을 구축할 수 있습니다. 이를 통해 더 효율적이고 빠른 웹 애플리케이션을 개발할 수 있습니다. 자세한 내용은 아래의 자료를 참고하시기 바랍니다.