고도화 및 확장

CHAN·2024년 11월 3일

FastAPI

목록 보기
9/9

9강: 고도화 및 확장

이번 강의에서는 데이터 자동화와 성능 최적화, Selenium 스크립트 안정성 강화 등을 다루어 프로젝트를 더 견고하게 구축하고 운영할 수 있도록 개선합니다. 이를 통해 더욱 원활한 사용자 경험을 제공하고, 시스템 안정성을 높일 수 있습니다.


1. 데이터 자동화 및 성능 최적화

  1. FastAPI에서 비동기 처리 사용

    • FastAPI의 비동기 기능을 활용하여 API 호출 속도를 개선하고 서버 부하를 줄입니다.
    • 데이터베이스 요청이나 외부 API 호출 시 비동기 함수를 사용해 성능을 최적화합니다.
    from fastapi import FastAPI, Depends
    from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
    from sqlalchemy.orm import sessionmaker
    import asyncio
    
    DATABASE_URL = "mysql+aiomysql://music_user:password@localhost/music_service"
    engine = create_async_engine(DATABASE_URL, echo=True)
    AsyncSessionLocal = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
    
    async def get_db():
        async with AsyncSessionLocal() as session:
            yield session
    
    app = FastAPI()
    
    @app.get("/keywords/pending/")
    async def get_pending_keywords(db: AsyncSession = Depends(get_db)):
        result = await db.execute("SELECT * FROM keywords WHERE status = 'pending'")
        return result.fetchall()
  2. MySQL에서 쿼리 최적화

    • INDEX를 설정하여 쿼리 속도를 높입니다. 예를 들어, status 필드에 인덱스를 추가하여 빠르게 필터링이 가능하게 합니다.
    CREATE INDEX idx_status ON keywords(status);
  3. 캐싱 도입

    • Firebase에서 자주 사용되는 데이터나 외부 API 응답 결과를 캐시해 반복적인 요청이 발생하지 않도록 합니다.
    • Redis와 같은 인메모리 캐시 솔루션을 활용하여 쿼리 응답 속도를 개선할 수 있습니다.

2. Selenium 스크립트 안정성 개선

  1. Selenium 스크립트 예외 처리

    • 네트워크 오류나 페이지 로딩 실패 등의 문제를 대비해 예외 처리를 강화합니다.
    • 예외 발생 시 다시 시도하거나 오류를 로깅하여 추적할 수 있도록 설정합니다.
    from selenium.common.exceptions import TimeoutException, NoSuchElementException
    
    def register_copyright(music_url, title, artist):
        driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
        try:
            driver.get("https://www.copyright-office-url.com")
            # 로그인 및 등록 절차
            driver.find_element(By.ID, "username").send_keys("your_username")
            driver.find_element(By.ID, "password").send_keys("your_password")
            driver.find_element(By.ID, "loginButton").click()
            
            # 저작권 등록 페이지로 이동
            driver.find_element(By.LINK_TEXT, "Register New Work").click()
    
            # 필드 채우기
            driver.find_element(By.ID, "titleField").send_keys(title)
            driver.find_element(By.ID, "artistField").send_keys(artist)
            driver.find_element(By.ID, "fileUrlField").send_keys(music_url)
    
            # 제출
            driver.find_element(By.ID, "submitRegistration").click()
    
        except (TimeoutException, NoSuchElementException) as e:
            print("Error occurred during registration:", e)
            # 오류 로깅 추가
        finally:
            driver.quit()
  2. 페이지 로딩 대기 설정

    • 특정 요소가 나타날 때까지 대기하는 WebDriverWait을 사용하여 네트워크 속도나 페이지 로딩 속도에 대응합니다.
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "submitRegistration"))
    )
  3. 정기 실행 및 모니터링

    • 스크립트를 주기적으로 실행하여 자동으로 저작권 등록이 이루어지도록 설정하고, cron 잡이나 Celery를 활용하여 일정 간격마다 자동 실행합니다.
    • 실행 결과를 기록하거나 Slack이나 이메일을 통해 알림을 설정하여 문제 발생 시 즉각 대처할 수 있도록 합니다.

3. Firebase와 MySQL 동기화

MySQL로 전환 후에도 Firebase와 MySQL의 데이터 일관성을 유지하려면, Firebase 데이터가 변경될 때 MySQL로 자동 업데이트하거나, 반대로 MySQL 변경사항이 Firebase에 반영되도록 설정합니다.

  1. 이벤트 기반 데이터 동기화

    • Firebase Functions를 사용하여 Firestore 데이터가 변경될 때 MySQL 업데이트를 트리거할 수 있습니다.
    • 반대로, MySQL에서 데이터가 변경되면 Firebase에 이를 반영하도록 이벤트 기반으로 동기화 코드를 작성할 수 있습니다.
  2. 데이터 일관성 체크

    • Firebase와 MySQL 데이터를 주기적으로 비교하여 일치하지 않는 데이터를 자동으로 조정하는 스크립트를 작성합니다.

4. 앱 성능 모니터링 및 로그 관리

  1. Firebase Performance Monitoring

    • Firebase의 Performance Monitoring 기능을 사용하여 앱에서 발생하는 모든 작업의 속도를 추적하고 개선할 수 있습니다.
    • 느린 네트워크 요청이나 로드 속도를 확인하고, 성능을 개선할 수 있습니다.
  2. 로그 관리 및 분석

    • FastAPI 서버와 Selenium 스크립트의 모든 로그를 중앙에서 관리하도록 설정합니다.
    • 예를 들어, Loggly, ELK Stack을 사용해 로그를 수집하고 모니터링하여 서버 상태와 오류 발생 상황을 실시간으로 파악합니다.

이번 강의 요약

  • FastAPI 서버에 비동기 처리 및 MySQL 쿼리 최적화를 도입하여 성능을 개선했습니다.
  • Selenium 스크립트에 예외 처리와 안정성 기능을 추가하여 저작권 등록 자동화의 신뢰성을 높였습니다.
  • Firebase와 MySQL 간 데이터 동기화를 위한 방안을 마련해 데이터 일관성을 강화했습니다.
  • Firebase Performance Monitoring과 로그 관리를 통해 앱 성능을 추적하고, 오류 발생 시 신속하게 대응할 수 있는 환경을 구축했습니다.

이로써 고도화 및 확장을 통해 프로젝트의 안정성과 유지 보수 가능성을 높였습니다.

profile
프로그래머

1개의 댓글

comment-user-thumbnail
2024년 11월 7일

The lecture discussed setting up automatic updates between Firebase and MySQL. Are there any considerations for handling potential data conflicts during synchronization, especially if both Incredibox Colorbox Mustard platforms are being updated simultaneously?

답글 달기