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