[파이썬] Django의 비동기 처리와 Celery 연동

Django는 웹 애플리케이션을 개발하기 위한 강력하고 유연한 프레임워크입니다. 그러나 때로는 사용자의 요청에 대해 빠른 응답을 제공하기 위해서는 비동기 처리가 필요할 수 있습니다.

비동기 처리는 요청을 처리하는 동안 다른 작업을 수행하는 기술로, Celery는 이러한 비동기 처리를 지원하는 도구입니다. Celery를 사용하면 Django 애플리케이션에서 백그라운드 작업을 실행하고 결과를 받아올 수 있습니다.

Celery 설치

Celery를 사용하려면 우선 Celery 라이브러리를 설치해야 합니다. 다음 명령을 사용하여 Celery를 설치할 수 있습니다.

pip install celery

Django에서 Celery 설정하기

Celery를 Django와 연동하기 위해서는 몇 가지 설정이 필요합니다.

프로젝트 폴더 구조

myproject/
├── myapp/
├──── __init__.py
├──── celery.py
└── myproject/
────── __init__.py
────── settings.py

settings.py 설정

Django의 settings.py 파일에서 다음과 같이 Celery 설정을 추가합니다.

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'

Redis를 사용하여 Celery를 설정하였으며, 필요에 따라 다른 메시지 브로커나 결과 백엔드를 사용할 수 있습니다.

celery.py 설정

애플리케이션에 대한 celery.py 파일을 생성하고 다음과 같이 설정합니다.

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

myproject는 Django 프로젝트의 이름입니다.

tasks.py 정의

Celery를 사용하여 비동기 작업을 실행하기 위해 tasks.py 파일을 생성합니다. 이 파일에는 Celery에서 실행할 작업들을 정의합니다. 예를 들어, 다음과 같이 send_email 작업을 정의할 수 있습니다.

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

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

@shared_task 데코레이터를 사용하여 작업을 정의합니다. 이렇게 정의된 작업은 다른 곳에서 Celery를 통해 실행될 수 있습니다.

사용 예제

이제 Celery를 사용하여 Django 애플리케이션에서 비동기 작업을 실행할 수 있습니다. 다음은 views.py 파일에서 send_email 작업을 호출하는 예제입니다.

from django.shortcuts import render
from .tasks import send_email

def send_email_view(request):
    subject = 'Hello'
    message = 'This is a test email.'
    from_email = 'noreply@example.com'
    recipient_list = ['recipient@example.com']
    send_email.delay(subject, message, from_email, recipient_list)
    
    return render(request, 'email_sent.html')

send_email.delay() 함수를 사용하여 작업을 비동기적으로 실행합니다.

결론

Django와 Celery를 연동하여 비동기 처리를 수행하면 웹 애플리케이션의 응답 속도를 향상시킬 수 있습니다. Celery는 다양한 백그라운드 작업을 지원하며, Django와의 연동도 간편합니다. 따라서 비동기 처리가 필요한 경우, Django 및 Celery의 조합은 강력한 선택일 것입니다.