[Undang] Undang 서비스에 django-crontab 적용하기

진행하고 있는 장고 프로젝트에 cron 작업을 추가하는 경험을 정리해본다.


환경 및 선수조건

  • Django
  • crontab의 개념
  • (선택) pyenv와 virtualenv를 이용한 가상환경(가상환경에서도 잘 돌아가고 경로 설정을 자동으로 해줍니다.)


crontab 사용 이유

문제

  • 기존 API를 호출하면 페이지를 크롤링을 하고 그에 대한 결과를 응답하는데 시간이 3초 이상걸린다.

해결

  • 크롤링하고자하는 페이지를 주기적으로 크롤링해서 결과를 DB에 저장해두고 API는 DB에 저장된 값들만 가져온다.


설정

pip를 통한 설치

pip install django-crontab


settings.py에 django_crontab를 추가

settings.py

...
INSTALLED_APPS = (
    'django_crontab',
    ...
)
...


app/cron.py의 파일을 생성 및 함수 만들기

  • 해당 장고프로젝트의 app(본인의 경우에는 main이라는 앱명을 지었습니다.)폴더 안에 cron.py 파일을 생성하고 함수를 만듭니다.
  • 사실 함수를 불러올 수 있는 경로이면 상관 없습니다. 즉, 따로 cron.py를 만들지 않고 경로만 잘 잡아주면 됩니다.

app/cron.py

def my_cron_job():
    pass


settings.py에 있는 CRONJOBS에 작업 추가하기

  • 기본 Linux crontab과 형식이 같습니다.(참고)
  • 기본 구조: * * * * * 수행할 명령어
  • 순서대로 분(0 - 59) 시(0 - 23) 일(1 - 31) 월(1 - 12) 요일(0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일)
  • 예제: ('*/5 * * * *', 'app.cron.my_cron_job') -> 매 5분마다 app/cron.py에 있는 my_cron_job()을 실행합니다.

settings.py

...
CRONJOBS = [
    ('*/5 * * * *', 'app.cron.my_cron_job')
]
...


적용

등록된 job들을 모두 실행

python manage.py crontab add

등록된 job들을 모두 제거

python manage.py crontab remove

등록된 job들을 모두 보기

  • django-crontab을 통해서 등록한 job들이 보여집니다.
python manage.py crontab show


확인

  • 위에 나와있는 명령어로 확인이 가능하지만 django-crontab의 경우에는 등록을 하면 Linux crontab에 등록이 된다.
  • crontab -e의 명령어를 통해서 확인이 가능하다.


실수

  • django-crontab을 이용하는 경우에 실제 리눅스에 등록된 crontab이 작동하는거기 때문에 파일의 경로에 신경을 써줘야합니다.
  • 예를 들어서, 위에 cron.py에서 파일을 새로 생성했다면 프로젝트의 앱 폴더(app/)가 아닌! 리눅스 유저 기본 디렉토리(~)에 위치합니다!


참고자료