Post

AInfo 프로젝트에서 Celery 적용

Django 기반 AInfo 프로젝트에 Celery를 적용한 과정과 사용 사례, 비동기 작업의 흐름을 설명합니다.

AInfo 프로젝트에서 Celery 적용

Celery 도입 배경

AInfo 프로젝트에서는 이메일 인증, 비밀번호 재설정, 공공데이터 수집, 전체 유저 메일 발송 등의 비동기 작업이 자주 발생합니다. 이런 작업을 사용자의 요청 흐름과 분리하여 백그라운드에서 처리하기 위해 Celery를 도입했습니다.

기본 설정 구조

1. Celery 인스턴스 구성 (config/celery.py)

1
2
3
app = Celery("config")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
  • Django 앱들 안에서 @shared_task로 정의된 작업을 자동으로 탐색합니다.
  • config/__init__.py에서 celery_app을 import하여 Django가 시작될 때 Celery도 함께 초기화되도록 했습니다.

2. 설정 파일 내 환경 변수 설정 (settings.py)

1
2
CELERY_BROKER_URL = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"
CELERY_RESULT_BACKEND = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"
  • Redis를 브로커 및 결과 저장소로 사용하여 작업 큐와 상태 관리 수행

비동기 작업 사용 예시

1. 이메일 인증 (accounts/tasks.py)

1
2
3
@shared_task
def send_verify_email(user_id, email, domain):
    # 토큰 생성 및 인증 URL 작성 → 이메일 전송
  • 회원가입 시 인증 메일 전송을 Celery를 통해 처리하여 응답을 빠르게 반환

2. 비밀번호 재설정 메일 (accounts/tasks.py)

1
2
3
@shared_task
def send_reset_pw_email(user_id, email, domain):
    # 재설정용 링크 포함한 이메일 전송

3. 전체 유저 공지 메일 발송 (notifications/tasks.py)

1
2
3
@shared_task
def send_mail_to_all(title, content, sender_name):
    # 수신동의한 유저 전체에게 공지 메일 전송
  • Django Admin 페이지에서 버튼을 누르면 Celery를 통해 모든 사용자에게 공지 메일이 발송됩니다.

4. 공공데이터 정기 수집 (dataload/tasks.py)

1
2
3
@shared_task
def load_employment_data_task():
    process_and_store_employment_data()
  • gov24, 고용24, 온통청년 API 데이터를 주기적으로 수집하여 벡터 DB에 적재
  • crontab을 사용한 config/celery.py 내 스케줄 설정으로 자동 실행됨

정기 스케줄 예시 (beat_schedule)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
app.conf.beat_schedule = {
    "load-employment-data-every-wednesday-1am": {
        "task": "dataload.tasks.load_employment_data_task",
        "schedule": crontab(hour=1, minute=0, day_of_week=3),
    },
    "load-youth_policy-data-every-wednesday-1.5am": {
        "task": "dataload.tasks.load_youth_policy_data_task",
        "schedule": crontab(hour=1, minute=30, day_of_week=3),
    },
    "load-gov24-data-every-wednesday-2am": {
        "task": "dataload.tasks.load_gov24_data_task",
        "schedule": crontab(hour=2, minute=0, day_of_week=3),
    },
}

실행 명령어

1
2
celery -A config worker --loglevel=info  # 워커 실행
celery -A config beat --loglevel=info    # 주기 작업 실행 (선택)

마무리

Celery 덕분에 사용자 요청과 무관한 작업들을 분리하여 효율적으로 처리할 수 있었고, 특히 이메일 전송과 정책 데이터 적재, 전체 알림 메일 발송에서 속도와 안정성을 확보할 수 있었습니다.

This post is licensed under CC BY 4.0 by the author.