FastAPI에서 백그라운드 작업 처리하기

문제 상황

회원가입 API에서 이메일 발송, 슬랙 알림, 로그 기록을 모두 처리하다보니 응답 시간이 3초 이상 소요되었다. 사용자는 회원가입 후 바로 다음 화면으로 넘어가야 하는데, 불필요한 대기 시간이 발생했다.

해결 방법

FastAPI의 BackgroundTasks를 사용해 응답 후 처리할 작업을 분리했다.

from fastapi import BackgroundTasks, FastAPI
from app.services import send_welcome_email, notify_slack

app = FastAPI()

def process_after_signup(user_id: int, email: str):
    send_welcome_email(email)
    notify_slack(f"New user: {email}")
    # 기타 후처리 작업

@app.post("/signup")
async def signup(data: SignupRequest, background_tasks: BackgroundTasks):
    user = create_user(data)
    background_tasks.add_task(process_after_signup, user.id, user.email)
    return {"user_id": user.id, "message": "Signup successful"}

결과

  • 응답 시간: 3초 → 300ms로 단축
  • 사용자는 즉시 다음 단계로 진행 가능
  • 백그라운드 작업 실패 시에도 회원가입 자체는 성공 처리

주의사항

중요한 작업(결제 처리 등)은 BackgroundTasks로 처리하면 안 된다. 서버 재시작 시 작업이 유실될 수 있기 때문이다. 이런 경우 Celery나 RQ 같은 메시지 큐를 사용해야 한다.

간단한 비동기 작업에는 FastAPI의 내장 기능으로 충분하다. 별도 인프라 구축 없이 빠르게 적용할 수 있어 유용했다.