이전 편에서는 Django-Celery-Beat: 예약 작업을 생성하는 방법을 통해 Django-Celery-Beat에서 예약 작업을 생성하는 기본적인 방법을 알아봤습니다.

📌 제목을 클릭해서 이전 포스트도 확인해 보세요!

하지만 실제 프로젝트에서는 단순히 예약된 시간마다 반복 실행하는 것만으로는 충분하지 않은 경우가 많습니다.

  • 특정 시간에만 실행되도록 제한해야 할 수도 있고,
  • 실행 주기를 동적으로 변경해야 하거나,
  • 특정 조건에서 작업을 비활성화하거나,
  • 특정 날짜 이후에는 자동으로 예약이 해제되도록 설정해야 할 수도 있습니다.

이런 복잡한 로직을 다루기 위해 이번 편에서는 Django-Celery-Beat의 PeriodicTask 모델을 더 깊이 있게 다루고, 다양한 필드와 설정 방법을 살펴보겠습니다! 🚀

Django Celery-Beat PeriodicTask illustration

1️⃣ update_or_create를 활용한 PeriodicTask 설정

실제 서비스에서는 한 번 생성한 예약 작업을 그대로 두는 경우보다, 사용자의 요청과 환경 변화에 맞춰 수정하는 경우가 많습니다.

따라서, PeriodicTask.objects.create()를 사용하기보다는 update_or_create() 메서드를 사용하는 것이 더 유용합니다.

📌 update_or_create()를 사용하면,

  1. 이미 존재하는 작업이면 업데이트
  2. 존재하지 않으면 새로 생성

즉, 동일한 이름의 예약 작업이 있을 경우 덮어쓰기가 가능해서, 불필요한 중복 인스턴스를 방지할 수 있습니다.

2️⃣ PeriodicTask.interval 필드와 IntervalSchedule 모델

Django-Celery-Beat의 PeriodicTaskinterval 필드를 통해 반복 실행 간격을 설정할 수 있습니다.

interval 필드는 IntervalSchedule 모델과 연결되어 있기 때문에, 먼저 IntervalSchedule 인스턴스를 생성한 후 PeriodicTask에서 이를 참조해야 합니다.

즉, 예약 작업을 등록하려면:

  1. 먼저 IntervalSchedule 인스턴스를 생성
  2. 그 후 생성된 IntervalSchedulePeriodicTask에 연결

3️⃣ IntervalSchedule 필드 옵션

필드명 설명 값 예시
every 반복 주기의 수치 값 10, 30, 2
period 반복 주기의 단위 IntervalSchedule.SECONDS, IntervalSchedule.MINUTES, IntervalSchedule.HOURS, IntervalSchedule.DAYS

4️⃣ update_or_create를 이용한 PeriodicTask 설정 예제

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# IntervalSchedule 생성 (10분마다 실행)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,
    period=IntervalSchedule.MINUTES
)

# PeriodicTask 생성 또는 업데이트
task, created = PeriodicTask.objects.update_or_create(
    name="send_reminder_email",
    defaults={
        "interval": schedule,
        "task": "myapp.tasks.send_reminder_email",
        "args": json.dumps([1]),
        "enabled": True,
    }
)

5️⃣ PeriodicTask의 기타 필드 설명

필드명 설명 예시
name 작업의 고유한 이름 "send_report_task"
interval 실행 간격 (IntervalSchedule 참조) schedule
crontab 특정 시각에 실행할 경우 (CrontabSchedule 참조) None
clocked 특정 시간에 한 번만 실행 (ClockedSchedule 참조) None
task 실행할 Celery Task "myapp.tasks.send_report"
args 함수에 전달할 인자 (JSON 형식) json.dumps([123, "email@example.com"])
kwargs 함수에 전달할 키워드 인자 (JSON 형식) json.dumps({"priority": "high"})
enabled 실행 여부 True or False
one_off 한 번만 실행하고 종료 True or False

📌 one_off=True로 설정하면 작업이 한 번 실행된 후 비활성화되지만 삭제되지는 않습니다

📌 clocked 필드를 사용하면 정확한 특정 시간에 한 번 실행되는 작업을 예약할 수 있습니다.

🎯 결론: 예약 작업을 유연하게 관리하려면 update_or_create를 활용하자!

📌 Django-Celery-Beat에서 예약 작업을 등록할 때 update_or_create()를 사용하면 기존 작업을 쉽게 수정할 수 있음

📌 PeriodicTask.interval 필드는 IntervalSchedule을 참조하므로, 먼저 IntervalSchedule 인스턴스를 생성한 후 연결해야 함.

📌 복잡한 예약 작업을 관리할 때는 args, kwargs, enabled, one_off, clocked 등의 필드를 활용하면 더 유연하게 설정할 수 있음.

🔥 다음 편 예고

이번 편에서는 PeriodicTask를 보다 유연하게 생성하고 수정하는 방법을 알아봤습니다.

다음 편에서는 Crontab을 활용한 특정 시각에 실행하는 예약 작업 설정과, Clocked를 활용한 특정 시간에 한 번만 실행하는 예약 작업을 다룰 예정입니다.

더 깊이 있는 Celery 활용법을 알고 싶다면 다음 편도 기대해주세요! 🚀

그리고, 블로그 내에서 Celery 관련된 글을 더 보고 싶다면,

아래의 '유사 포스트' 목록이나, 우측 상단의 검색창에서 "Celery"를 검색해 보세요! 😊