FastAPI에서 백그라운드 태스크로 이메일 발송 처리하기
문제 상황
회원가입 API에서 인증 이메일을 발송하는 로직이 동기로 처리되면서 응답 시간이 3초 이상 걸렸다. SMTP 서버 연결과 메일 발송을 기다리는 동안 클라이언트가 대기해야 했고, 사용자 경험이 좋지 않았다.
해결 방법
FastAPI의 BackgroundTasks를 사용해 이메일 발송을 백그라운드로 분리했다.
from fastapi import BackgroundTasks, FastAPI
import smtplib
from email.mime.text import MIMEText
app = FastAPI()
def send_verification_email(email: str, token: str):
msg = MIMEText(f"인증 토큰: {token}")
msg['Subject'] = '이메일 인증'
msg['To'] = email
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login(SMTP_USER, SMTP_PASSWORD)
server.send_message(msg)
@app.post("/register")
async def register(email: str, background_tasks: BackgroundTasks):
# 사용자 생성 로직
user = create_user(email)
token = generate_token(user.id)
# 백그라운드에서 이메일 발송
background_tasks.add_task(send_verification_email, email, token)
return {"message": "회원가입 완료. 이메일을 확인하세요."}
결과
- API 응답 시간: 3초 → 200ms
- 이메일 발송 실패 시에도 회원가입은 정상 완료
- 에러 핸들링을 위해 추후 Celery 도입 검토 필요
간단한 백그라운드 작업은 FastAPI 내장 기능으로 충분히 처리 가능했다. 다만 재시도 로직이나 작업 모니터링이 필요하다면 Redis + Celery 조합을 고려해야 할 것 같다.