이번 강의에서는 Firebase Firestore에서 MySQL로 데이터베이스 전환하는 과정을 다룹니다. MySQL을 사용하면 더 복잡한 쿼리를 수행하고 데이터베이스 관리가 가능해져, 대규모 애플리케이션에 적합한 환경을 구축할 수 있습니다. 이 강의에서는 기존 Firestore 데이터베이스를 MySQL로 옮기고 FastAPI 서버와 연동하는 방법을 설명합니다.
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;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
);
SQLAlchemy 설치 및 설정
SQLAlchemy와 pymysql을 설치합니다.pip install sqlalchemy pymysqlSQLAlchemy 데이터베이스 설정
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 테이블과 매핑합니다.
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()
Firestore 데이터 불러오기
status, keyword, file_url 필드 데이터를 가져와 MySQL 테이블에 삽입합니다.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()
마이그레이션 코드 실행
python migrate_firestore_to_mysql.py마이그레이션이 완료되면, FastAPI 엔드포인트에서 Firestore 관련 코드를 모두 MySQL 관련 코드로 대체하여 데이터를 MySQL에서 가져오고 업데이트하도록 수정합니다.
이로써 데이터베이스를 Firebase Firestore에서 MySQL로 성공적으로 전환하여 관리 및 확장 가능성이 더 높은 구조로 개선했습니다.
다음 강의에서는 고도화 및 확장을 통해 데이터 자동화와 성능 최적화, 그리고 Selenium 스크립트의 안정성을 개선하는 방법을 살펴보겠습니다.