서론
이메일 발송은 많은 웹 애플리케이션에서 중요한 기능 중 하나입니다. 때로는 수천 개 이상의 이메일을 동시에 발송해야 할 수도 있습니다. 그러나 많은 양의 이메일을 동기적으로 처리하려고 하면 성능 문제가 발생할 수 있습니다. 이런 경우에 Celery를 사용하여 이메일 발송을 비동기적으로 처리할 수 있습니다.
Celery란?
Celery는 Python으로 작성된 분산 작업 큐 시스템입니다. 이를 사용하면 일련의 작업을 백그라운드에서 비동기적으로 실행할 수 있으며, 대량의 이메일 발송과 같이 시간이 오래 걸리는 작업을 효율적으로 처리할 수 있습니다.
Celery 설정하기
먼저, Celery를 설치해야 합니다. 다음 명령을 사용하여 Celery를 설치합니다:
pip install celery
Celery를 설정하기 위해 프로젝트 디렉토리에 celery.py
라는 파일을 생성합니다. 다음은 celery.py
파일의 내용입니다:
from celery import Celery
app = Celery('myapp',
broker='amqp://guest@localhost//',
backend='rpc://',
include=['myapp.tasks'])
app.conf.update(
result_expires=3600,
)
if __name__ == '__main__':
app.start()
broker
는 RabbitMQ와 같은 메시지 브로커의 URL을 지정합니다. backend
은 Celery 작업의 결과를 저장하는 데 사용되는 URL입니다. include
는 Celery 작업이 위치한 모듈을 지정합니다.
이메일 발송 작업 정의하기
이제 이메일 발송 작업을 정의해야 합니다. myapp
디렉토리에 tasks.py
라는 파일을 생성하고 다음 내용을 추가합니다:
from celery import shared_task
from django.core.mail import send_mail
@shared_task
def send_bulk_emails(subject, message, recipient_list):
from_email = 'noreply@example.com'
send_mail(subject, message, from_email, recipient_list)
send_bulk_emails
함수는 이메일의 제목, 내용 및 수신자 목록을 인수로 받아 이메일을 발송하는 작업입니다.
이메일 발송 작업 실행하기
이제 Celery를 실행하고 이메일 발송 작업을 실행할 준비가 되었습니다. 다음 명령을 사용하여 Celery를 실행합니다:
celery -A myapp worker --loglevel=info
-A
옵션은 Celery 애플리케이션의 이름을 지정하고, --loglevel
옵션은 로그의 상세도를 지정합니다.
이메일 발송 작업을 실행하기 위해 다음 코드를 사용할 수 있습니다:
from myapp.tasks import send_bulk_emails
# 이메일 발송 작업을 비동기적으로 실행
send_bulk_emails.delay('Hello', 'This is a test email', ['user1@example.com', 'user2@example.com'])
delay
메서드를 호출하여 작업을 예약할 수 있습니다. 이메일이 성공적으로 발송되면 Celery 로그에서 해당 작업에 대한 정보를 확인할 수 있습니다.
마무리
Celery를 사용하여 대량의 이메일을 비동기적으로 발송하는 방법을 알아보았습니다. 이를 통해 웹 애플리케이션의 성능을 향상시키고, 사용자들에게 빠른 응답을 제공할 수 있습니다. Celery에는 다양한 기능과 설정 옵션이 있으므로, 공식 문서를 참조하여 더 자세한 정보를 얻을 수 있습니다.