Python Django

Django에서 비동기 처리를 위한 Celery 사용법

PyExplorer 2025. 3. 10. 10:14
728x90

Django에서 비동기 처리를 위한 Celery 사용법

1. 비동기 처리가 필요한 이유

Django는 기본적으로 요청을 처리할 때 동기적으로 동작합니다. 하지만 웹 애플리케이션을 운영하다 보면 사용자의 요청을 즉시 처리하지 않고, 백그라운드에서 실행해야 하는 작업들이 존재합니다. 예를 들어:

  • 이메일 전송
  • 데이터베이스 대량 업데이트
  • 외부 API 호출 및 응답 처리
  • 대용량 파일 처리 및 변환

이러한 작업을 동기적으로 처리하면 사용자가 응답을 받기까지 오랜 시간이 걸릴 수 있으며, 서버의 성능이 저하될 수 있습니다. 이를 해결하기 위해 Django에서는 Celery를 활용하여 비동기 처리를 수행할 수 있습니다.

2. Celery란?

Celery는 분산형 태스크 큐(task queue) 시스템으로, Django와 같은 웹 애플리케이션에서 백그라운드 작업을 처리할 때 많이 사용됩니다. Celery는 브로커(Broker)를 이용하여 작업을 큐에 등록하고, 워커(Worker)가 이를 비동기적으로 실행하는 구조를 가집니다.

Celery의 주요 개념

  • 태스크(Task): 실행할 작업을 정의한 함수 또는 클래스
  • 브로커(Broker): 태스크를 큐에 넣고 관리하는 메시지 브로커 (예: Redis, RabbitMQ)
  • 워커(Worker): 큐에서 태스크를 가져와 실행하는 프로세스
  • 백엔드(Backend): 실행된 태스크의 결과를 저장하는 저장소 (예: Redis, Database)

3. Celery 설치 및 설정

3.1 Celery 설치

Celery를 사용하려면 먼저 필요한 패키지를 설치해야 합니다.

pip install celery redis

위 명령어는 Celery와 Redis를 설치합니다. Redis는 메시지 브로커로 사용됩니다.

3.2 Django 프로젝트에 Celery 설정하기

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

# settings.py
import os
from celery import Celery

# Redis를 브로커로 사용
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'

이제 celery.py 파일을 생성하여 Celery 인스턴스를 설정합니다.

# 프로젝트 루트 디렉토리 (예: myproject/myproject/celery.py)
import os
from celery import Celery

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

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

또한, __init__.py 파일을 수정하여 Celery 인스턴스를 Django 프로젝트에서 사용할 수 있도록 설정합니다.

# 프로젝트 루트 디렉토리 (예: myproject/myproject/__init__.py)
from .celery import celery_app

__all__ = ('celery_app',)

4. Celery 태스크 만들기

Django 앱의 tasks.py 파일을 생성하고, Celery 태스크를 정의합니다.

# example_app/tasks.py
from celery import shared_task
import time

@shared_task
def add(x, y):
    time.sleep(5)  # 5초 동안 대기 (예제용)
    return x + y

이제 Celery 워커를 실행하면 이 태스크를 비동기적으로 실행할 수 있습니다.

5. Celery 실행하기

Celery를 실행하기 위해 먼저 Redis 서버가 실행 중인지 확인합니다. Redis가 실행 중이 아니라면 다음 명령어로 실행할 수 있습니다.

redis-server

그 다음 Celery 워커를 실행합니다.

celery -A myproject worker --loglevel=info

이제 Django에서 Celery 태스크를 호출하면 됩니다.

6. Celery 태스크 호출하기

Django의 뷰(View)에서 Celery 태스크를 호출할 수 있습니다.

# example_app/views.py
from django.http import JsonResponse
from .tasks import add

def add_numbers(request):
    result = add.delay(10, 20)  # 비동기 실행
    return JsonResponse({'task_id': result.id})

위 API를 호출하면 Celery가 비동기적으로 add 함수를 실행하고, 사용자는 바로 응답을 받을 수 있습니다.

7. 실행된 태스크의 상태 확인

Celery 태스크의 실행 상태를 확인하기 위해 AsyncResult를 사용할 수 있습니다.

from celery.result import AsyncResult

def check_task_status(request, task_id):
    result = AsyncResult(task_id)
    return JsonResponse({'task_id': task_id, 'status': result.status, 'result': result.result})

8. 주기적인 작업 실행 (Celery Beat)

일정한 시간 간격으로 작업을 실행하고 싶다면 Celery Beat를 사용할 수 있습니다.

8.1 Celery Beat 설치

pip install django-celery-beat

INSTALLED_APPSdjango_celery_beat를 추가합니다.

INSTALLED_APPS = [
    ...
    'django_celery_beat',
]

마이그레이션을 실행합니다.

python manage.py migrate django_celery_beat

Celery Beat를 실행하여 주기적인 작업을 실행할 수 있습니다.

celery -A myproject beat --loglevel=info

9. 마무리

이번 포스팅에서는 Django에서 Celery를 이용하여 비동기 태스크를 실행하는 방법을 살펴보았습니다. Celery는 대규모 애플리케이션에서 필수적인 도구이며, 성능 최적화 및 비동기 작업을 쉽게 구현할 수 있도록 도와줍니다. 이를 활용하여 Django 프로젝트의 성능을 개선해 보시기 바랍니다.

728x90