본문으로 건너뛰기

저녁이 제작기 05. 데일리 뒤 메뉴판 안내 버튼 추가

·9 min read·5 / 5

메뉴판을 열려면 /메뉴판이나 /저녁이 메뉴를 입력해야 했다. 커맨드를 모르면 메뉴판이 있는 줄도 모른다. 매일 올라오는 데일리 메시지 옆에 메뉴판으로 가는 버튼을 두기로 했다.

셋째 버튼 대신 안내 메시지를 따로 올렸다

데일리 하단에는 이미 「작성하기」「지우기」 버튼이 있었다. 여기에 「메뉴판」까지 붙이면 하단이 붐빈다. 데일리 메시지는 그대로 두고, 새로 게시될 때 뒤에 「메뉴판이 도착했어요」라는 안내를 따로 올렸다.

「메뉴판」 버튼은 안내 문구 아래에 달았다. Slack 메시지에서 섹션 오른쪽에 요소를 붙이는 accessory를 쓰면 문구와 버튼이 멀어졌다. 대신 버튼을 모아 배치하는 actions 블록에 넣었다.

버튼에서도 /메뉴판과 같은 showMenu를 호출했다. 메뉴판을 여는 방법은 커맨드 두 가지와 안내 버튼으로 늘었지만, 메뉴판을 보여주는 함수는 하나로 유지했다.

모달은 3초 안에, 안내는 명단 갱신 전에

데일리는 정해진 시간에 실행되는 cron 작업이나 /저녁이 커맨드에서 새로 게시할 수 있다. 인자 없이 /저녁이를 실행하면 기록을 붙일 데일리가 없는 경우 데일리를 만든 뒤 기록 모달을 연다. 모달은 사용자가 저녁 기록을 입력하는 창이다. 메뉴판 안내는 그 뒤에 올렸다.

Slack에서 모달을 열 때 쓰는 trigger_id는 3초 안에 사용해야 한다. 데일리 게시와 모달 열기 사이에 안내 게시까지 넣으면 시간이 빠듯해진다. 안내는 몇백 ms 늦어도 상관없지만 모달은 늦으면 열리지 않는다.

cron에서는 순서를 다르게 잡았다. 데일리를 올린 다음 안내를 게시하고, 그 뒤에 명단을 갱신하는 refreshDailyContext를 호출했다. 작업하면서 명단 갱신에 2초쯤 걸리는 것을 봤다. 그동안 다른 대화가 끼면 안내가 데일리에서 떨어지므로, 갱신이 끝나기를 기다리지 않았다.

수동 게시 명령인 /저녁이 post에서는 기록 모달을 열지 않는다. 데일리를 새로 만들면 안내를 이어서 올린다. 같은 /저녁이 커맨드여도 인자가 없는 경우와는 순서가 다르다.

안내 게시는 데일리를 조회하거나 만드는 공용 함수 ensureDailyMessage 안에 넣지 않았다. 호출하는 쪽에서 안내를 올려야 모달이나 명단 갱신과의 순서를 정할 수 있었다.

안내를 이미 올렸는지 따로 저장하지 않고, 이번 호출에서 데일리를 새로 게시했는지를 나타내는 created에 맡겼다. 기존 데일리를 찾으면 안내도 생략한다. 다만 조회와 게시가 분리되어 있어, 동시에 들어온 요청까지 하루 한 번으로 보장하지는 않는다. created 판별에 문제가 생기면 안내도 영향을 받는다.

인자 없는 /저녁이에서는 모달을 여는 동안 다른 메시지가 끼어 안내가 데일리에서 떨어질 수 있다. 이 경로에서는 모달을 제때 여는 쪽을 우선했다.

안내가 실패해도 기록은 계속돼야 했다

메뉴판 안내는 기록을 돕는 기능이다. 안내 게시가 실패했다고 데일리나 기록 모달까지 실패로 보이면 안 됐다. 안내를 올리는 postMenuNotice는 예외를 밖으로 던지지 않고 false를 돌려주게 했다.

실패를 확인하는 방법은 호출 경로에 따라 다르다. /저녁이에서는 오류를 기록할 로거를 전달하므로 로그가 남는다. cron에서는 로거를 넘기지 않고, 안내 게시 뒤 명단 갱신까지 성공하면 응답에 created와 notice를 담는다.

notice: false만으로는 안내가 실패했다고 볼 수 없다. 기존 데일리가 있어 안내를 시도하지 않았을 때도 같은 값이 나온다. 정상 응답에서 created: true인데 notice: false라면 안내 게시가 실패한 것이다. 명단 갱신까지 실패하면 이 응답 자체를 받지 못한다.

안내 게시가 실패했을 때 다시 올리는 기능은 넣지 않았다. 부가 안내에 재시도까지 붙이지 않고, /저녁이의 로그와 cron의 정상 응답으로 확인하는 데 그쳤다.

안내 버튼에서 메뉴판을 열다가 실패했을 때도 문제가 있었다. 버튼 클릭에 답하는 respond는 기본 동작 때문에 오류 안내로 원래 메시지를 덮어썼다. 그러면 메뉴판 버튼까지 사라졌다. 오류 응답에 replace_original: false를 명시해 안내 메시지를 남겼다.

커맨드 이름이 설정 파일마다 달랐다

v0.2.0에서 /메뉴를 /메뉴판으로 바꾸며 Slack 앱 설정을 담은 매니페스트와 템플릿을 고쳤다. 안내 버튼을 작업하다 보니 옛 이름이 남은 곳이 있었다.

위치상태
slack-manifest.template.json / slack-manifest.json/메뉴판으로 변경됨
.env.example/메뉴를 /메뉴판으로 고쳤다. 아직 커밋하지 않았다
src/config/env.ts 기본값/메뉴가 남아 있다

커맨드 이름은 Slack 콘솔과 매니페스트, 환경변수에만 있는 게 아니었다. .env.example은 새로 설치하는 사람이 복사하는 출발점이고, env.ts의 기본값은 환경변수를 비웠을 때 쓰인다. 여기에 옛 이름이 남으면 새 설치는 매니페스트와 맞지 않는 이름으로 시작한다.

배포 환경에는 환경변수가 있어서 증상이 없었다. 이름이 쓰일 곳을 세 군데로 정해두기보다 grep으로 옛 이름을 찾아 확인하는 편이 맞았다. 실제로 사용될 예시 파일과 기본값에 다른 이름이 남아 있었다.