Firebase Firestore에서 MySQL로 전환

CHAN·2024년 11월 3일

FastAPI

목록 보기
8/9

8강: Firebase Firestore에서 MySQL로 전환

이번 강의에서는 Firebase Firestore에서 MySQL로 데이터베이스 전환하는 과정을 다룹니다. MySQL을 사용하면 더 복잡한 쿼리를 수행하고 데이터베이스 관리가 가능해져, 대규모 애플리케이션에 적합한 환경을 구축할 수 있습니다. 이 강의에서는 기존 Firestore 데이터베이스를 MySQL로 옮기고 FastAPI 서버와 연동하는 방법을 설명합니다.


1. MySQL 데이터베이스 설정

  1. MySQL 설치 및 데이터베이스 생성

    • MySQL이 설치되지 않은 경우 설치하고, MySQL 서버를 실행합니다.
    • 새로운 데이터베이스와 사용자를 생성합니다.
      CREATE DATABASE music_service;
      CREATE USER 'music_user'@'localhost' IDENTIFIED BY 'password';
      GRANT ALL PRIVILEGES ON music_service.* TO 'music_user'@'localhost';
      FLUSH PRIVILEGES;
    • 생성한 데이터베이스와 사용자로 FastAPI 서버가 MySQL에 접근할 수 있도록 설정합니다.
  2. MySQL 테이블 생성

    • Firestore의 keywords 컬렉션 구조에 맞춰 MySQL에 테이블을 생성합니다.

      USE music_service;
      
      CREATE TABLE keywords (
        id INT AUTO_INCREMENT PRIMARY KEY,
        keyword VARCHAR(255) NOT NULL,
        status ENUM('pending', 'generated', 'registered') DEFAULT 'pending',
        file_url TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );

2. SQLAlchemy와 FastAPI를 이용한 MySQL 연동

  1. SQLAlchemy 설치 및 설정

    • FastAPI에서 MySQL을 다루기 위해 SQLAlchemypymysql을 설치합니다.
      pip install sqlalchemy pymysql
  2. SQLAlchemy 데이터베이스 설정

    • FastAPI 프로젝트에 database.py 파일을 생성하고, MySQL 데이터베이스 연결을 설정합니다.

      from sqlalchemy import create_engine, Column, Integer, String, Enum, Text, TIMESTAMP
      from sqlalchemy.ext.declarative import declarative_base
      from sqlalchemy.orm import sessionmaker
      import enum
      
      DATABASE_URL = "mysql+pymysql://music_user:password@localhost/music_service"
      
      engine = create_engine(DATABASE_URL)
      SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
      Base = declarative_base()
      
      class StatusEnum(str, enum.Enum):
          pending = "pending"
          generated = "generated"
          registered = "registered"
      
      class Keyword(Base):
          __tablename__ = "keywords"
      
          id = Column(Integer, primary_key=True, index=True)
          keyword = Column(String(255), nullable=False)
          status = Column(Enum(StatusEnum), default="pending")
          file_url = Column(Text, nullable=True)
          created_at = Column(TIMESTAMP)
      
      # 테이블 생성
      Base.metadata.create_all(bind=engine)
    • Keyword 모델을 정의하여 MySQL의 keywords 테이블과 매핑합니다.

  3. FastAPI 라우트에서 MySQL 사용

    • get_db 함수를 추가하여 데이터베이스 세션을 생성하고, FastAPI 엔드포인트에서 Keyword 모델을 사용해 데이터를 가져오거나 업데이트할 수 있도록 합니다.

      from fastapi import FastAPI, Depends
      from sqlalchemy.orm import Session
      from .database import SessionLocal, Keyword
      
      app = FastAPI()
      
      # 데이터베이스 세션 생성 함수
      def get_db():
          db = SessionLocal()
          try:
              yield db
          finally:
              db.close()
      
      # 새로운 키워드 추가
      @app.post("/keywords/")
      async def add_keyword(keyword: str, db: Session = Depends(get_db)):
          new_keyword = Keyword(keyword=keyword, status="pending")
          db.add(new_keyword)
          db.commit()
          db.refresh(new_keyword)
          return new_keyword
      
      # 상태가 pending인 키워드 가져오기
      @app.get("/keywords/pending/")
      async def get_pending_keywords(db: Session = Depends(get_db)):
          return db.query(Keyword).filter(Keyword.status == "pending").all()

3. 데이터 마이그레이션: Firestore에서 MySQL로 데이터 옮기기

  1. Firestore 데이터 불러오기

    • Firebase Admin SDK를 사용해 Firestore에서 데이터를 불러옵니다.
    • status, keyword, file_url 필드 데이터를 가져와 MySQL 테이블에 삽입합니다.
  2. Firestore 데이터 MySQL로 옮기기 코드

    • migrate_firestore_to_mysql.py라는 스크립트를 생성하고, Firestore 데이터를 불러와 MySQL에 저장하는 코드를 작성합니다.

      from firebase_admin import firestore, initialize_app, credentials
      from sqlalchemy.orm import Session
      from database import SessionLocal, Keyword
      
      # Firebase Admin 초기화
      cred = credentials.Certificate("path/to/serviceAccountKey.json")
      initialize_app(cred)
      db_firestore = firestore.client()
      
      # Firestore 데이터 마이그레이션
      def migrate_data():
          # Firestore에서 키워드 데이터 가져오기
          keywords = db_firestore.collection("keywords").stream()
      
          # MySQL에 데이터 저장
          db_mysql = SessionLocal()
          for keyword_doc in keywords:
              data = keyword_doc.to_dict()
              new_keyword = Keyword(
                  keyword=data.get("keyword"),
                  status=data.get("status", "pending"),
                  file_url=data.get("fileUrl")
              )
              db_mysql.add(new_keyword)
      
          db_mysql.commit()
          db_mysql.close()
          print("Data migration completed.")
      
      if __name__ == "__main__":
          migrate_data()
  3. 마이그레이션 코드 실행

    • 스크립트를 실행하여 Firestore 데이터를 MySQL로 옮깁니다.
      python migrate_firestore_to_mysql.py

4. FastAPI에서 Firestore 기능을 MySQL로 전환

마이그레이션이 완료되면, FastAPI 엔드포인트에서 Firestore 관련 코드를 모두 MySQL 관련 코드로 대체하여 데이터를 MySQL에서 가져오고 업데이트하도록 수정합니다.


이번 강의 요약

  • MySQL 데이터베이스를 설정하고 FastAPI와 연동하여 기존 Firestore 데이터를 MySQL로 전환했습니다.
  • SQLAlchemy 모델을 사용해 FastAPI의 데이터베이스 기능을 확장했습니다.
  • Firestore에서 MySQL로 데이터 마이그레이션을 수행하는 스크립트를 작성하여 기존 데이터를 이동했습니다.

이로써 데이터베이스를 Firebase Firestore에서 MySQL로 성공적으로 전환하여 관리 및 확장 가능성이 더 높은 구조로 개선했습니다.

다음 강의에서는 고도화 및 확장을 통해 데이터 자동화와 성능 최적화, 그리고 Selenium 스크립트의 안정성을 개선하는 방법을 살펴보겠습니다.

profile
프로그래머

0개의 댓글