본문으로 건너뛰기

저녁이 제작기 01. 식대 기록 앱 기획과 범위 결정

·7 min read·1 / 2

사람들은 이미 성실히 적고 있었다

#팀-0-저녁 채널에는 매일 오후 7시에 메시지가 하나 올라왔다. 팀원들은 그 메시지의 스레드에 식대 사용 내역을 자유 형식으로 적고 있었다.

입력 형식은 사람마다 달랐고, 같은 가게 이름을 매번 새로 타이핑했다.

"기록이 없다"가 문제가 아니었다. 기록이 구조화되어 있지 않은 게 문제였다.

버튼 하나와 세 칸으로 끝내기로 했다

데일리 메시지(매일 오후 7시에 채널로 올라오는 그 메시지다)에 버튼을 붙인다. 누르면 모달(Slack 화면 위에 뜨는 입력 팝업이다)이 열리고, 세 칸을 채워 제출하면 데일리 메시지 본문에 기록이 쌓인다.

입력기획 의도
함께 먹은 사람워크스페이스 사용자를 이름으로 찾아 다중 선택. 타이핑이 아니라 선택
출처가게명·음식명 한 칸. 입력 중 과거 출처를 추천해 재사용을 만든다
이용 방식식대카드 사용 / 배달 둘 중 하나 필수

출처 추천이 "매번 새로 타이핑한다"는 문제를 직접 겨냥한 기능이다. 나머지 두 칸은 그걸 성립시키는 구조다. 가츠까지 치면 가츠시, 가츠시 돈카츠가 후보로 뜬다.

빼는 결정에 가장 많은 분량을 썼다

안 한 것이유
등록자·날짜 입력칸등록자는 제출한 Slack 사용자, 날짜는 버튼을 누른 메시지에서 정해진다. 물어볼 이유가 없다
스레드 댓글 자동 집계자유 대화는 자유 대화로 남긴다. 앱은 스레드에 아무것도 쓰지 않는다
과거 스레드 데이터 가져오기자유 형식을 정답 데이터로 보지 않는다. 필요해지면 따로 검토한다
출처 탐색 버튼 / 태그 화면화면을 늘리지 않는다. 한 칸 안에서 검색과 신규 등록을 같이 해결한다
가게명 / 음식명 분리 필드사람들이 실제로 구분해서 적지 않는다. 강제하지 않는다
유사 출처 자동 병합대소문자와 앞뒤 공백만 정규화한다. 비슷해 보여도 의미가 다를 수 있다

사람이 이미 하고 있는 행동을 막지 않기로 했다. 스레드 대화는 그대로 뒀다. 앱은 데일리 메시지 본문만 담당하고, 대화는 건드리지 않는다.

만들기 전부터 제약 세 가지가 보였다

  • 데일리 메시지를 이 앱이 게시해야 한다. 다른 워크플로가 올린 메시지에는 버튼을 붙이거나 본문을 수정할 수 없다. 채널에 매일 오후 7시 메시지를 올리고 있는 기존 워크플로를 언젠가 이 앱으로 대체해야 한다.
  • external_select(타이핑에 맞춰 앱 서버가 후보 목록을 돌려주는 Slack 선택 요소다)는 후보를 고르는 순간 값이 확정된다. 타이핑만 하고 후보를 고르지 않은 채 바로 제출하는 동작이 필수라면 별도 검증이 필요하다.
  • 동시 제출로 기록이 사라지지 않게 저장한 뒤 다시 렌더링해야 한다.

저장은 읽고 덧붙여 다시 쓰는 구조로 가기로 했다. 동시성은 알면서 받아들이기로 했다.

라벨이 전부 바뀌었다

기획실제
라벨 "함께 먹은 사람"야근맨
라벨 "출처"메뉴
라벨 "이용 방식"결제 수단 (값은 식대카드 / 배달 그대로)
사람 선택에 multi_users_selectmulti_external_select
버튼 문구 "식대 기록"등록하기를 거쳐 작성하기

사람 선택은 multi_users_select(Slack이 기본으로 주는 워크스페이스 사용자 다중 선택 요소다)로 잡아뒀다가 multi_external_select로 바꿨다. 초성·쿼티 검색을 잃을 수 없었다.

기획서에 적은 중립적인 용어가 실제 채널의 말투로 내려앉았다.

운영 규칙은 아직 정하지 못했다

  • 함께 먹은 사람에 등록자 본인을 포함할지
  • 출처 후보를 채널별로 공유할지 워크스페이스 전체로 공유할지
  • 기록이 많아졌을 때 어떤 순서로 어떻게 보여줄지
  • 오후 7시 워크플로를 언제 이 앱으로 대체할지
  • 하루 여러 건 기록, 그리고 기록 수정·삭제. 규칙을 정하기 전에 구현이 먼저 나갔고, 여러 건 허용에 줄별 삭제로 만들어져 있다