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_APPS
에 django_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 프로젝트의 성능을 개선해 보시기 바랍니다.
'Python Django' 카테고리의 다른 글
Django 배포 방법 (AWS, Heroku, Docker 활용) (0) | 2025.03.12 |
---|---|
Django에서 WebSocket과 채팅 기능 구현 (Django Channels) (0) | 2025.03.11 |
Django에서 REST API 만들기 (Django REST Framework 소개 및 기본 사용법) (0) | 2025.03.09 |
Django 미들웨어 개념과 활용법 (0) | 2025.03.08 |
Django에서 사용자 인증(Authentication) 시스템 구축하기 (0) | 2025.03.07 |