아이디어 4개를 버리고 나서야 토스에 미니앱을 출시했다
만든 것 — 말투 판독기. 카톡 대화 내보내기 파일을 브라우저 안에서만 읽어 내 말투를 분석하는 미니앱입니다. 웹 버전은 maltu.pages.dev에서 바로 해볼 수 있습니다.
토스 안에서 돌아가는 미니앱을 하나 만들어보고 싶었다. 앱인토스라는 플랫폼이 있고, 미니앱이 벌써 1만 개를 넘었다는 기사를 봤다. 별도 앱 설치 없이 토스 유저에게 바로 닿는다는 게 매력이었다. 만든 건 "말투 판독기"라는 카톡 말투 분석기다. 심사는 이틀 만에 통과됐다. 그런데 이 앱에 도착하기까지 아이디어 네 개를 버렸다. 그 과정이 사실 이 글의 절반이다.
버린 아이디어들
처음 생각한 건 구독 서비스 관리 앱이었다. 넷플릭스니 유튜브 프리미엄이니 줄줄 나가는 구독료를 한눈에 보여주자. 조사해보니 토스 본체에 이미 고정지출 관리 기능이 있었다. 왓섭 같은 전문 앱은 계좌 연동으로 자동 탐지에 해지 대행까지 한다. 미니앱은 토스의 결제 데이터에 접근할 수 없어서 사용자가 손으로 입력해야 한다. 대놓고 불리한 조건이었다. 접었다.
다음은 흥얼거림으로 노래 찾기. 구글 앱에 이미 들어 있는 기능이었다. 구글이 공짜로 더 잘하는 걸 만들 이유는 없다. 접었다.
최신 밈 알려주는 서비스도 생각했다. 이건 경쟁자보다 운영이 문제였다. 밈은 유통기한이 며칠이라 매주 사람이 큐레이션해야 한다. 앱이 아니라 미디어를 굴리게 되는 거다. 보류했다.
네 번째는 심리검사로 주식 추천해주는 앱. 재밌겠다 싶었는데 앱인토스 정책 문서에 정확히 이렇게 적혀 있었다. "특정 종목 추천이나 투자 전략 안내로 개인 투자자의 의사결정에 영향을 미치는 서비스는 등록할 수 없어요." 심리검사라는 포장을 씌워도 결과가 종목이면 이 조항이다. 시작 전에 죽었다.
네 번을 버리고 나니 기준이 생겼다. 플랫폼이 이미 하는 것 말고, 빅테크가 무료로 하는 것 말고, 매일 운영해야 하는 것 말고, 정책에 걸리는 것 말고. 남는 건 가볍고, 재밌고, 공유되는 것이었다.
카톡 대화 분석에 도착하다
인스타 팔로워 분석 앱들이 터지는 걸 보면서 "내 데이터로 나를 알려줘"라는 심리가 꽤 강하구나 싶었다. 한국인 전원이 가진 데이터가 뭘까. 카톡이다. 카톡에는 대화 내용 내보내기 기능이 있다. 채팅방 전체를 텍스트 파일로 뽑을 수 있고, 텍스트앳이나 연애의 과학 같은 곳이 이미 이 파일로 분석 서비스를 해서 수요를 증명했다.
문제는 그 다음이었다. 연애의 과학을 만든 회사는 수집한 카톡 대화를 챗봇 학습에 써서 개인정보보호위 제재를 받았다. 이루다 사건이다. 카톡 대화에는 상대방 정보가 같이 들어 있다. 그런데 그 사람은 동의한 적이 없다.
그래서 구조를 뒤집었다. 단톡방 파일을 받되, 분석은 사용자가 선택한 본인 메시지만 한다. 그리고 서버로 아무것도 보내지 않는다. 파일은 브라우저 안에서만 읽히고 화면을 닫으면 사라진다. 분석이라고 해봐야 ㅋ 개수 세고 답장 간격 재는 산수라서 폰 브라우저만으로 충분하다. 이 결정 하나로 개인정보 리스크, 서버 비용, 심사 부담이 한꺼번에 사라졌다. 나중에 심사 신청할 때도 "대화는 기기 밖으로 나가지 않습니다" 한 줄이 제일 든든한 방패였다.
하루 만에 만든 프로토타입, 그리고 버그들
기능은 단순하다. 내보내기 파일을 올리면 참여자 목록이 뜨고, 나를 고르면 내 메시지만 분석해서 말투 유형을 알려준다. 답장 3초컷, 쿨한 단답장인, 장문 서사시인, 리액션 몰빵형 같은 9가지 유형이 있다. 여기에 ㄹㅇ이니 킹받이니 하는 표현과 ^^나 물결 사용률을 비교해 MZ인지 아재인지 가리는 세대 판독, 내가 누구한테 제일 빨리 답하는지 보여주는 애정도 랭킹까지 넣었다.
파서는 카톡 내보내기 형식이 안드로이드, 아이폰, PC 세 가지가 다 달라서 셋 다 지원해야 했다. 여기서 첫 버그가 나왔다. 실제 파일을 넣었더니 채팅방에 있지도 않은 사람 이름이 우르르 나타났다. 범인은 전달된 대화였다. 누가 다른 방 대화를 복사해 붙이면 그 안의 "날짜, 이름 : 내용" 줄까지 파서가 진짜 메시지로 읽어서 유령 참여자가 생긴다. 메시지 지분이 바닥인 이름은 숨기는 필터로 해결했다.
두 번째 버그는 부끄러운 CSS 실수. 결과 카드 이미지를 띄우는 화면의 닫기 버튼이 안 먹혔다. 오버레이에 인라인 스타일로 display:flex를 박아놔서 숨김 클래스의 display:none이 계속 지고 있었던 거다. 인라인 스타일은 클래스를 이긴다는 기초를 실전에서 다시 배웠다.
공유 기능에서 제일 오래 헤맸다
이런 앱은 결과를 공유하는 순간이 전부다. 단톡방에 결과가 올라가면 방 사람들이 우르르 해보는 구조를 노렸으니까. 그런데 공유가 세 번을 고쳐도 계속 아쉬웠다.
처음엔 공유 버튼이 그냥 조용히 죽었다. 환경에 따라 공유 API가 막히는데 실패 처리를 안 해놨던 거다. 공유 시트가 안 되면 클립보드 복사, 그것도 안 되면 문구를 직접 보여주는 3단 폴백으로 고쳤다. 카톡에 링크를 보냈더니 이번엔 미리보기 없이 밋밋한 글자만 떴다. OG 태그를 넣고 미리보기 이미지를 만들어 해결했다.
진짜 문제는 따로 있었다. 받은 사람이 링크를 열면 결과가 아니라 빈 업로드 화면이 떴다. 당연했다. 분석 결과가 서버에 없으니 링크가 보여줄 게 없었다. 그래서 결과 요약을 링크 주소 자체에 실어 보내기로 했다. 유형 이름과 통계 몇 개를 인코딩하면 130자 정도라 카톡에 아무 문제 없고, 받은 사람은 보낸 사람의 결과 카드를 먼저 본 다음 "나도 해보기"를 누른다. 서버 없이 바이럴 루프가 닫혔다.
앱인토스 포팅에서 만난 함정 하나
웹 버전은 Cloudflare Pages에 올렸다. 파일 하나짜리 정적 사이트라 10분이면 끝났다. 앱인토스 포팅은 공식 SDK(@apps-in-toss/web-framework)를 붙이고 설정 파일을 만들면 되는데, 여기 함정이 하나 있었다. 문서는 설정 파일을 granite.config.ts라고 안내하는데, 최신 CLI(3.x)는 apps-in-toss.config.ts라는 이름을 요구한다. 문서대로 했다가 빌드가 계속 거부돼서 잠깐 헤맸다. 이름만 맞추면 ait build 한 방에 .ait 번들이 나오고, 콘솔에 그 파일을 올리면 된다.
토스 안에서는 공유도 토스 SDK의 공유 링크 기능으로 갈아탄다. 같은 코드가 토스 안이면 토스 공유, 밖이면 웹 공유로 동작하게 분기해두면 코드베이스 하나로 웹과 미니앱을 같이 유지할 수 있다.
심사 준비물은 생각보다 많았다. 로고는 라이트 모드용과 다크 모드용이 따로 필요했고, 스크린샷도 세로 3장에 가로 1장 규격이 정해져 있었다. 스크린샷은 실제 대화를 노출할 수 없으니 샘플 데이터를 넣고 헤드리스 브라우저로 실제 화면을 캡처했다. 개인정보 처리방침 페이지도 만들어 URL을 등록했다. 우리 앱은 수집하는 게 없어서 방침이 오히려 쓰기 쉬웠다. "수집하지 않습니다"의 반복이었으니까.
승인, 그리고 배운 것
검토 요청을 넣고 이틀 만에 승인이 났다. 반려 왕복 없이 한 번에 통과한 건 운도 있겠지만, 설명에 데이터 흐름을 미리 적어둔 게 컸다고 생각한다. 심사자가 물어볼 것을 먼저 답해두는 것.
아이디어는 내는 게 아니라 버리는 게 일이었다. 네 개를 버리는 동안 생긴 기준이 다섯 번째를 골라줬다. 프라이버시 설계는 윤리 문제이기 전에 속도와 비용 문제였다. 기기 안에서만 처리한다는 결정 하나로 서버도, 법적 리스크도, 심사 부담도 사라졌다. 그리고 공유는 버튼이 아니라 설계였다. 보낸 링크를 연 사람이 뭘 보게 되는지까지가 공유 기능이다.
토스 앱에서 "말투 판독기"를 검색하면 나온다. 다음 앱은 화났을 때 쓴 메시지를 24시간 얼려뒀다가 다음날 보여주는 물건을 구상 중이다. 홧김 카톡으로 이불킥해본 사람이라면 무슨 앱인지 바로 알 것이다.