저녁이 제작기 01. 식대 기록 앱 기획과 범위 결정
·7 min read·1 / 2
사람들은 이미 성실히 적고 있었다
#팀-0-저녁 채널에는 매일 오후 7시에 메시지가 하나 올라왔다. 팀원들은 그 메시지의 스레드에 식대 사용 내역을 자유 형식으로 적고 있었다.
입력 형식은 사람마다 달랐고, 같은 가게 이름을 매번 새로 타이핑했다.
"기록이 없다"가 문제가 아니었다. 기록이 구조화되어 있지 않은 게 문제였다.
버튼 하나와 세 칸으로 끝내기로 했다
데일리 메시지(매일 오후 7시에 채널로 올라오는 그 메시지다)에 버튼을 붙인다. 누르면 모달(Slack 화면 위에 뜨는 입력 팝업이다)이 열리고, 세 칸을 채워 제출하면 데일리 메시지 본문에 기록이 쌓인다.
| 입력 | 기획 의도 |
|---|---|
| 함께 먹은 사람 | 워크스페이스 사용자를 이름으로 찾아 다중 선택. 타이핑이 아니라 선택 |
| 출처 | 가게명·음식명 한 칸. 입력 중 과거 출처를 추천해 재사용을 만든다 |
| 이용 방식 | 식대카드 사용 / 배달 둘 중 하나 필수 |
출처 추천이 "매번 새로 타이핑한다"는 문제를 직접 겨냥한 기능이다. 나머지 두 칸은 그걸 성립시키는 구조다. 가츠까지 치면 가츠시, 가츠시 돈카츠가 후보로 뜬다.
빼는 결정에 가장 많은 분량을 썼다
| 안 한 것 | 이유 |
|---|---|
| 등록자·날짜 입력칸 | 등록자는 제출한 Slack 사용자, 날짜는 버튼을 누른 메시지에서 정해진다. 물어볼 이유가 없다 |
| 스레드 댓글 자동 집계 | 자유 대화는 자유 대화로 남긴다. 앱은 스레드에 아무것도 쓰지 않는다 |
| 과거 스레드 데이터 가져오기 | 자유 형식을 정답 데이터로 보지 않는다. 필요해지면 따로 검토한다 |
| 출처 탐색 버튼 / 태그 화면 | 화면을 늘리지 않는다. 한 칸 안에서 검색과 신규 등록을 같이 해결한다 |
| 가게명 / 음식명 분리 필드 | 사람들이 실제로 구분해서 적지 않는다. 강제하지 않는다 |
| 유사 출처 자동 병합 | 대소문자와 앞뒤 공백만 정규화한다. 비슷해 보여도 의미가 다를 수 있다 |
사람이 이미 하고 있는 행동을 막지 않기로 했다. 스레드 대화는 그대로 뒀다. 앱은 데일리 메시지 본문만 담당하고, 대화는 건드리지 않는다.
만들기 전부터 제약 세 가지가 보였다
- 데일리 메시지를 이 앱이 게시해야 한다. 다른 워크플로가 올린 메시지에는 버튼을 붙이거나 본문을 수정할 수 없다. 채널에 매일 오후 7시 메시지를 올리고 있는 기존 워크플로를 언젠가 이 앱으로 대체해야 한다.
external_select(타이핑에 맞춰 앱 서버가 후보 목록을 돌려주는 Slack 선택 요소다)는 후보를 고르는 순간 값이 확정된다. 타이핑만 하고 후보를 고르지 않은 채 바로 제출하는 동작이 필수라면 별도 검증이 필요하다.- 동시 제출로 기록이 사라지지 않게 저장한 뒤 다시 렌더링해야 한다.
저장은 읽고 덧붙여 다시 쓰는 구조로 가기로 했다. 동시성은 알면서 받아들이기로 했다.
라벨이 전부 바뀌었다
| 기획 | 실제 |
|---|---|
| 라벨 "함께 먹은 사람" | 야근맨 |
| 라벨 "출처" | 메뉴 |
| 라벨 "이용 방식" | 결제 수단 (값은 식대카드 / 배달 그대로) |
사람 선택에 multi_users_select | multi_external_select |
| 버튼 문구 "식대 기록" | 등록하기를 거쳐 작성하기 |
사람 선택은 multi_users_select(Slack이 기본으로 주는 워크스페이스 사용자 다중 선택 요소다)로 잡아뒀다가 multi_external_select로 바꿨다. 초성·쿼티 검색을 잃을 수 없었다.
기획서에 적은 중립적인 용어가 실제 채널의 말투로 내려앉았다.
운영 규칙은 아직 정하지 못했다
- 함께 먹은 사람에 등록자 본인을 포함할지
- 출처 후보를 채널별로 공유할지 워크스페이스 전체로 공유할지
- 기록이 많아졌을 때 어떤 순서로 어떻게 보여줄지
- 오후 7시 워크플로를 언제 이 앱으로 대체할지
- 하루 여러 건 기록, 그리고 기록 수정·삭제. 규칙을 정하기 전에 구현이 먼저 나갔고, 여러 건 허용에 줄별 삭제로 만들어져 있다