Scheduler

옷가게 쇼핑몰을 운영한다고 생각해 보세요. 손님이 마지막 하나를 사 가면 그 상품의 재고는 0이 됩니다. 다시 팔려면 거래처에 발주를 넣어야 합니다. 거래처에는 발주를 받는 창구가 인터넷에 열려 있어서 정해진 주소로 부르면 발주가 접수된다고 하겠습니다. 재고가 0인 상품을 찾아 그 창구를 부르는 일은 Script로 만들어 두었다고 하겠습니다. 그래도 문제가 하나 남습니다. 매일 한 번 그 Script를 눌러 줄 사람이 필요합니다.

Scheduler가 그 사람을 대신합니다. "이 Script를 매일 같은 시각에 실행하라"를 한 번 정해 두면, 그 시각이 될 때마다 WEEGLOO가 알아서 실행합니다. 아무도 화면을 열지 않아도 됩니다.

알람 시계를 맞춰 두는 것에 비유할 수 있습니다. 몇 시에 울릴지 한 번 정해 두면 그 뒤로는 매일 그 시각에 저절로 울립니다. 이 페이지에서는 Scheduler에 무엇을 정해 두는지, 시각을 어떻게 적는지, 그리고 그것이 누구의 권한으로 실행되는지를 옷가게의 "재고 발주" 예시로 살펴봅니다.

정해 두는 것은 세 가지

Scheduler 하나에 정해 두는 것은 많지 않습니다.

  • 이름: 나중에 목록에서 알아보기 위한 것입니다. 예: 재고 발주.
  • 실행할 Script: 그 시각이 되면 실행할 Script 하나를 고릅니다. 하나의 Scheduler는 하나의 Script만 실행합니다.
  • 언제 돌지: 아래 언제 돌지 적는 법에서 다룹니다.

여기에 켜고 끄는 스위치가 하나 더 있습니다. 꺼 두면 저장은 그대로 남고 실행만 하지 않습니다. 거래처가 쉬는 기간처럼 잠시 멈춰야 할 때 지우지 않아도 됩니다.

실행할 Script는 나중에 바꿀 수 없습니다. 다른 Script를 돌리려면 Scheduler를 새로 만듭니다. 이름과 시각, 켜고 끄기는 언제든 고칠 수 있습니다.

언제 돌지 적는 법

시각은 다섯 칸으로 적습니다. 왼쪽부터 분, 시, 일, 월, 요일이고, *는 "전부"라는 뜻입니다.

분  시  일  월  요일
0   9   *   *   *      → 매일 9시 정각

자주 쓰는 모양은 이렇습니다.

적는 값언제 도는가
0 0 * * *매일 0시 정각
30 9 * * *매일 9시 30분
0 * * * *매시 정각
*/10 * * * *10분마다
0 0 * * 1매주 월요일 0시 정각
0 0 1 * *매월 1일 0시 정각

시각은 표준시(UTC)로 읽습니다. 지역 시간이 아니므로, 지역 시간으로 몇 시에 돌릴지 정한 뒤 그 차이만큼 계산해서 적습니다. 표준시보다 9시간 앞선 지역이라면 그곳의 아침 9시가 0 0 * * *입니다. 재고 발주는 이 값, 곧 표준시 0시에 돕니다.

날짜나 요일이 들어간 시각은 이렇게 시차를 계산하다 보면 실행되는 날짜까지 달라질 수 있으니 한 번 더 확인하세요.

한 번도 돌지 않는 값은 저장되지 않습니다. 예를 들어 0 0 30 2 *는 2월 30일을 가리키는데 그런 날은 오지 않으므로, 저장하려 하면 값을 다시 확인하라는 응답을 받습니다.

누구의 권한으로 도는가

SchedulerScript를 실행할 때, 그 실행은 Scheduler를 만든 사람이 한 것으로 처리됩니다. 재고 발주 Script가 상품을 읽고 거래처를 부르는 것도 만든 사람의 자격으로 일어납니다.

그래서 만들거나 고치려면 두 가지 권한이 함께 필요합니다.

  • 역할(SpaceRole)에 Scheduler 설정 권한이 있어야 합니다.
  • Scheduler가 실행할 Script를 실행할 권한이 있어야 합니다.

두 번째는 만들 때뿐 아니라 고칠 때도 확인합니다. 도는 시각을 바꾸는 것은 그 Script를 언제 실행할지 정하는 일이고, 꺼진 것을 켜는 것은 실행을 시작하는 일이기 때문입니다.

만든 사람이 나중에 그 권한을 잃으면 Scheduler는 꺼집니다. 담당자가 팀에서 빠지거나 역할이 좁아지면, 다음 실행 시각에 WEEGLOO가 그것을 확인하고 실행하지 않은 채 스위치를 끕니다. 권한이 돌아와도 스위치는 자동으로 켜지지 않으므로 직접 다시 켜야 합니다.

실행 기록 확인하기

Scheduler가 돌 때마다 기록이 하나씩 남습니다. 그 회차가 성공했는지 실패했는지가 여기에 남습니다. 어젯밤 발주가 실제로 나갔는지는 이 기록으로 확인합니다.

목록에는 각 회차의 실행 시각과 결과가 나옵니다. 돌다가 실패한 회차를 누르면, 그 이유를 상세의 오류 영역에서 그대로 볼 수 있습니다. 걸린 시간과 함께 나오므로, 거래처 창구가 응답하지 않아서인지 다른 문제인지를 이 문구로 가려낼 수 있습니다.

성공한 실행의 기록은 1시간, 실패한 실행의 기록은 3일 뒤에 사라집니다. 실패한 쪽이 더 오래 남는 것은 나중에 들여다보게 되는 기록이 그쪽이기 때문입니다. 발주 내역처럼 그보다 오래 남겨야 하는 값이라면 Script 안에서 Content로 저장하세요.

실패해도 Scheduler는 멈추지 않습니다. 거래처 창구가 잠시 응답하지 않아 실패했다면 그 회차만 실패로 기록되고, 다음 시각에 다시 돕니다.

Webhook과 무엇이 다른가

둘 다 사람이 누르지 않아도 Script를 실행한다는 점은 같습니다. 갈리는 것은 무엇이 실행을 부르는가 입니다.

  • Webhook일이 생겼을 때 실행합니다. 상품이 등록되면, 콘텐츠가 발행되면.
  • Scheduler시각이 되면 실행합니다. 아무 일이 없어도 매일 그 시각에.

재고 발주는 얼핏 Webhook이 맞아 보입니다. 재고가 0이 되는 그 순간에 발주하면 되니까요. 그런데 같은 상품의 재고가 하루 사이에 0이 되었다가 반품으로 돌아왔다가 다시 0이 되면, 그때마다 발주가 나갑니다. 하루에 한 번 모아서 훑으면 상품 하나에 발주도 하나입니다. "생길 때마다"가 아니라 "모아서 한 번"이어야 하는 일이 Scheduler의 자리입니다.

반대로 상품이 등록되는 순간 설명을 채우는 일은 늦출 이유가 없으므로 Webhook입니다.

알아 둘 것

  • 개수에 한도가 있습니다. Organization 하나가 가질 수 있는 Scheduler 개수가 요금제별로 정해져 있습니다(Free 1개, Basic 5개, Pro 30개, Enterprise 무제한). 한도에 다다르면 새로 만들 수 없고, 안 쓰는 것을 지우면 한 자리가 다시 빕니다.
  • 실행 횟수는 Script와 나눠 씁니다. Scheduler가 하는 일은 Script 실행이므로, 한 번 돌 때마다 요금제의 Script 실행 횟수를 하나 씁니다. Scheduler만의 별도 한도는 없습니다. 그 횟수를 다 쓰면 그 뒤로 실행 시각이 된 Scheduler는 실행되지 않고 꺼집니다. 이 경우에는 왜 시작하지 못했는지가 실행 기록에 남습니다. 다음 달이 되어도 자동으로 켜지지 않으므로 직접 다시 켜야 합니다.
  • 놓친 실행은 채워 넣지 않습니다. 점검 등으로 하루를 걸렀다고 다음 날 두 번 돌지 않습니다. 다음 시각부터 다시 돕니다.
  • 어떤 Scheduler가 쓰고 있는 Script는 지울 수 없습니다. 꺼 둔 Scheduler가 쓰고 있어도 마찬가지입니다. 그 Scheduler를 먼저 지운 뒤에 지우세요.

콘텐츠 스튜디오에서 관리하기

Scheduler는 콘텐츠 스튜디오의 Scheduler 화면에서 만들고 관리합니다. 목록에는 만들어 둔 Scheduler가 이름, 실행할 Script의 이름, cron 식, 다음 실행, 상태, 수정 시각, 수정자와 함께 한 줄씩 나옵니다.

Scheduler 목록 화면. "재고 발주"가 이름·Script·cron 식·다음 실행·상태 Active와 함께 한 줄로 보이는 상태. cron 칸 머리에 UTC, 다음 실행 칸 머리에 UTC±N 표시

화면은 두 칸이 각각 어느 시계인지도 함께 알려 줍니다. cron 식이 있는 칸의 머리에는 UTC가, 다음 실행 칸의 머리에는 보는 사람의 시간대가 UTC±N 꼴로 붙습니다. 그래서 저장된 값과 그것이 내 시간으로 몇 시인지를 같은 줄에서 볼 수 있습니다. 표준시보다 뒤선 시간대에서는 다음 실행이 전날로 보일 수 있습니다.

Scheduler는 목록 오른쪽 위의 생성 버튼으로 만듭니다.

  1. 목록 오른쪽 위의 생성 버튼을 누르세요.
  2. 이름 칸에 재고 발주를 입력하세요.
  3. 활성화를 켜 두세요. 꺼 두면 저장은 되어도 실행되지 않습니다.
  4. 실행할 Script에서 재고 발주 Script를 고르세요.
  5. 실행 주기에서 직접 입력을 고르세요.
  6. 다섯 칸에 0 0 * * *를 입력하세요.
  7. 오른쪽 위의 생성 버튼을 눌러 저장하세요.

화면은 입력한 식이 실제로 언제 도는지도 바로 보여 줍니다. 직접 입력한 식은 표준시(UTC)로 저장된다는 안내와 함께, 저장될 cron 값과 다음 실행 시각의 미리보기가 함께 나타납니다.

새 Scheduler 생성 화면. 이름 "재고 발주", 활성화 켜짐, 실행할 Script "재고 발주", 실행 주기 직접 입력 탭에 0 0 * * * 를 넣은 상태

목록에서 Scheduler 하나를 누르면 그 Scheduler의 상세 화면이 열립니다. 상세 화면은 실행 로그설정 두 탭으로 나뉘고, 처음 열면 실행 로그가 보입니다. 실행 로그 탭에는 지금까지 돈 회차가 한 줄씩 나오고, 한 줄마다 실행 시각·결과·그 회차를 가리키는 요청 ID가 보입니다. 결과 칸으로 성공한 회차만 또는 실패한 회차만 골라 볼 수 있고, 로그 새로고침을 누르면 방금 돈 회차까지 다시 읽어 옵니다.

Scheduler 상세 화면의 실행 로그 탭. "재고 발주"의 실행 세 건(실패 2건, 성공 1건)이 실행 시각·결과·요청 ID 칼럼으로 보이는 상태

한 회차를 누르면 그 회차의 상세가 열립니다. 여기서는 결과와 함께 상태 코드, 걸린 시간(소요 시간), 그 회차가 누구의 신원으로 돌았는지(실행 주체)가 나오고, 실패한 회차라면 그 이유가 오류 영역에 그대로 나옵니다. 위쪽에는 이 회차가 어느 Scheduler의 것이고 어떤 Script를 돌렸는지 알려 주는 배지가 있으며, 그 Script로 가는 링크와 같은 회차를 Script 쪽 기록에서 보는 Script 로그에서 보기 링크가 함께 있습니다.

Scheduler 실행 로그 상세 화면(실패 회차). 실행 시각·요청 ID와 함께 결과 Failure·상태 코드·소요 시간·실행 주체가 나오고, 오류 영역에 실패 이유가 보이는 상태

다음으로 할 일

  • Script: Scheduler가 실행할 Script를 만드는 법과, 거래처 창구처럼 바깥 서비스를 부르는 동작을 담는 방법을 다룹니다.
  • Webhook: 정해진 시각이 아니라 정해 둔 변화가 생겼을 때 실행되게 하는 방법을 다룹니다.
  • 역할과 권한: Scheduler 설정 권한과 Script 실행 권한을 역할에 담는 방법을 다룹니다.