Celery로 비동기 이메일 큐 처리하기

이메일을 보낼 때 시간이 오래 걸린다면, 웹 애플리케이션의 성능을 저하시킬 수 있습니다. 이런 경우, Celery를 사용하여 이메일을 비동기로 처리할 수 있습니다. Celery는 분산 작업 큐로 알려진 Python 라이브러리입니다. 이 블로그 포스트에서는 Celery를 사용하여 Django 애플리케이션에서 비동기 이메일 큐를 처리하는 방법을 알아보겠습니다.

Celery 설치하기

Celery를 사용하려면 먼저 Celery를 설치해야 합니다. 아래의 명령어를 사용하여 Celery를 설치합니다.

$ pip install celery

Django 설정 변경하기

Django 애플리케이션의 settings.py 파일에서 Celery 관련 설정을 변경해야 합니다. 아래의 예시 코드를 참고하여 설정을 추가해주세요.

# settings.py

# Celery 설정
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

위의 예시 코드에서는 Redis를 사용하여 Celery 브로커와 결과 백엔드를 설정하고 있습니다. 필요에 따라 이 설정을 변경할 수 있습니다.

Celery 작업 정의하기

비동기로 처리할 이메일 작업을 Celery 작업으로 정의해야 합니다. Django 애플리케이션의 tasks.py 파일을 열고 아래의 예시 코드를 작성해주세요.

# tasks.py

from celery import shared_task
from django.core.mail import send_mail

@shared_task
def send_async_email(subject, message, from_email, recipient_list):
    send_mail(subject, message, from_email, recipient_list)

위의 예시 코드에서는 send_async_email이라는 Celery 작업으로 이메일을 보내는 동작을 정의하고 있습니다.

이메일 큐에 작업 추가하기

이메일을 전송해야 할 때 Celery 작업 큐에 작업을 추가해야 합니다. 이를 위해 Django 뷰에서 아래의 예시 코드를 사용할 수 있습니다.

from .tasks import send_async_email

def send_email_view(request):
    subject = 'Hello'
    message = 'This is a test email'
    from_email = 'sender@example.com'
    recipient_list = ['recipient@example.com']

    send_async_email.delay(subject, message, from_email, recipient_list)

    return HttpResponse('Email sent.')

위의 예시 코드에서는 send_async_email 작업을 Celery 작업 큐에 추가하여 이메일을 비동기로 전송하고 있습니다.

Celery 워커 실행하기

Celery 작업을 실행하기 위해 Celery 워커를 실행해야 합니다. 아래의 명령어를 사용하여 Celery 워커를 실행할 수 있습니다.

$ celery -A your_django_project_name worker --loglevel=info

위의 명령어에서 your_django_project_name 부분은 본인의 Django 프로젝트 이름으로 변경해야 합니다.

Celery 결과 확인하기

Celery 작업의 결과를 확인하려면 Django 애플리케이션의 어느 곳에서든지 아래의 예시 코드를 사용할 수 있습니다.

from celery.result import AsyncResult

result = AsyncResult(task_id)
if result.ready():
    # 작업 완료
    pass
elif result.failed():
    # 작업 실패
    pass

위의 예시 코드에서는 AsyncResult를 사용하여 Celery 작업의 상태를 확인하고 있습니다.

Celery를 사용하여 Django 애플리케이션에서 이메일을 비동기로 처리하는 방법에 대해 알아보았습니다. Celery를 사용하면 애플리케이션의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다.

#python #django #celery