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의 내장 기능으로 충분하다. 별도 인프라 구축 없이 빠르게 적용할 수 있어 유용했다.