[메신저를 한 화면에 ②] saya, 아무것도 모르는 화면

2026. 10. 9. 08:25·Develop

카카오톡, 텔레그램, 슬랙, 디스코드, 채팅+ 대화를 브라우저 한 화면에서 보는 도구를 만든 기록, 두 번째다. 1편이 카카오톡을 터미널에서 읽던 작은 도구 이야기였다면, 이번에는 그 앞에 세운 화면 saya(さや) 이야기다. 9월 17일부터 30일까지, 처음 계획을 사흘 만에 접고 다시 시작한 2주다.

옮겨 오려던 서버

9월 17일, saya 저장소의 첫 커밋은 코드가 아니라 문서였다. 무엇을 만들지, 그리고 카카오톡 도구가 무엇을 약속하는지 적었다.

계획은 이랬다. 다른 개발자가 카카오톡 도구에 보내 준 서버 코드가 있었다. 그걸 saya로 옮겨 오고, 그 위에 화면을 얹는다. 옮길 때 무엇이 어디로 가는지 한 줄씩 짚은 안내서까지 썼다.

사흘 만의 재시작

9월 20일, 그 안내서를 지웠다. 그사이 카카오톡 도구들이 서버 기능을 직접 갖게 됐기 때문이다. 이미 있는 서버를 saya가 한 번 더 감싸면, 같은 일을 두 곳에서 약속하게 된다. 빠져 있는 것은 서버가 아니라 화면이었다.

그래서 남긴 것이 몇 개 없다. README, 일하는 원칙, 그리고 약속 파일 하나. 두 도구가 주고받는 방식을 적은 이 파일을, 두 도구에 있는 것과 바이트 하나까지 똑같이 복사해 왔다. saya가 카카오톡에 대해 아는 것은 지금도 이 파일 하나뿐이다.

화면이 쓰는 타입도 손으로 쓰지 않고 이 파일에서 만들어 낸다. 손으로 쓴 정의는 약속이 바뀌어도 아무 일 없이 빌드된다. 그러면 틀렸다는 사실을 사용자의 화면에서야 알게 된다. 약속이 바뀌면 화면 대신 빌드가 깨지게 해 두었다.

토큰도 정했다. 이 토큰이 있으면 내 계정으로 메시지를 보낼 수 있다. 그러니 비밀번호처럼 다뤄야 한다. 브라우저는 토큰을 모르고, 앞단의 프록시가 요청에 붙인다. 화면 어디에도, 로그 어디에도 그리지 않는다.

지금의 saya. 방 목록과 대화. 이름과 대화는 모두 지어낸 것이다.

테스트는 다 통과했는데

9월 23일, 첫 버전을 냈다. 그리고 같은 날 이상한 걸 발견했다. 새 메시지를 실시간으로 받아 오는 부분이 테스트에서만 쓰이고 있었다. 실제 화면에서는 그 연결이 한 번도 만들어지지 않았다. 브라우저 탭은 실시간 연결을 0번 열었고, 처음 불러온 대화만 보여 주고 있었다.

테스트는 전부 초록색이었다. 부품 하나하나는 맞게 동작했는데, 그 부품을 실제로 끼우는 곳이 없었다. 실제 카카오톡 도구에 붙여 보고서야 알았다. 그 뒤로 화면에 닿는 변경은 실제 서버에 붙여 보고, 붙여 보지 못했으면 못 했다고 적기로 했다.

같은 날 하나가 더 나왔다. 한글을 치고 누른 첫 엔터가 먹지 않았다. 한글 입력이 끝날 때 섞여 들어오는 엔터를 막으려던 장치가, 사람이 누른 엔터까지 삼키고 있었다. 타이밍으로 추측하지 않고 키 자체가 무엇인지로 판단하게 고쳤다.

없는 건 그리지 않는다

처음 saya에는 사진이 없었다. 프로필 사진도, 대화 속 사진도. 약속 파일에 사진 주소를 담는 자리가 없었기 때문이다. 실제 데이터를 열어 봐도 메시지에 사진 주소는 없었다. 그래서 사진 대신 이름 첫 글자를 동그라미에 넣어 그렸다.

화면에서 우회할 방법을 찾지 않았다. 필요한 게 약속에 없으면, 화면이 아니라 카카오톡 도구 쪽에 요청한다. 일주일 뒤 약속이 늘어났고, 그제야 프로필 사진과 첨부 파일을 그렸다.

비슷한 결정이 하나 더 있었다. 아무도 읽지 않은 방에는 '미리보기 없음'이라는 문장이 떠 있었는데, 그걸 지웠다. 없다는 걸 알리는 문장이 그 자체로 소음이었다. 이 생각은 나중에 다른 메신저를 붙일 때 더 크게 돌아온다.

원칙에 낸 구멍 하나

saya는 서버를 두지 않는다는 원칙으로 시작했다. 그런데 9월 23일, 예외를 하나 만들었다. 링크 미리보기다. 대화에 있는 주소의 제목과 그림을 보여 주려면 누군가 그 페이지를 대신 가져와야 했다.

이 주소는 메시지를 쓴 사람이 고른다. 그러니 이 작은 서버는 내 집 안쪽 주소나 내부망으로 향하는 요청을 전부 거절해야 한다. 이 검사를 테스트하다가 진짜 구멍을 먼저 찾았다. 특정한 방식으로 적은 내부 주소가 검사를 그대로 통과하고 있었다. 미리보기 서버는 카카오톡 쪽에는 닿지 않고, 없어도 화면은 그냥 링크를 그린다. 예외는 이것 하나로 두었다.

엔터 한 번

9월 30일, 보내기를 엔터 한 번으로 바꿨다. 평범한 전송에는 확인 창을 띄우지 않는다. 미리 돌려 보는 확인은 뒤에서 조용히 먼저 하고, 데스크톱 카카오톡에 쓰다 만 초안을 지우게 될 때만 묻는다. 1편에서 고민한 '쓰다 만 말' 문제가 화면으로 온 것이다. "보냈습니다"는 여전히 다시 읽어 낸 메시지에만 붙는다.

입력창. 엔터로 보내고, 쓰다 만 초안이 지워질 때만 먼저 묻는다.

아직 못 푼 것

약속 파일을 복사해 오는 방식에는 값이 있다. 카카오톡 도구 쪽 약속이 바뀔 때마다 손으로 다시 가져와야 한다. 9월 28일부터 10월 1일까지 나흘 사이에 네 번 가져왔다. 정본이 한 곳에만 있다는 장점의 대가라고 생각하고 지금도 그렇게 한다.

다음 편은 10월 1일, 하루 만에 메신저가 넷이 된 날의 이야기다.


메신저를 한 화면에

  1. 카톡을 터미널에서 읽던 작은 도구
  2. saya, 아무것도 모르는 화면 (이 글)
  3. tsuba, 하루 만에 메신저가 넷
  4. 채팅+, 안 된다고 적었다가 지운 결론
  5. nichirin과 heimdal, 남에게 건네기
저작자표시 비영리 변경금지 (새창열림)

'Develop' 카테고리의 다른 글

[메신저를 한 화면에 ①] 카톡을 터미널에서 읽던 작은 도구  (0) 2026.10.07
삼성 갤러리의 OneDrive 동기화가 끝난다길래, 갤러리 앱을 직접 만들었다 - Miettes 개발기  (0) 2026.09.30
카카오톡을 터미널에서 읽는다 — 윈도우 kanao-cli, 맥 kamado-cli  (0) 2026.09.21
한국어 IME 조합 버그를 고쳐 Windows Terminal에 기여한 이야기  (0) 2026.07.29
Vercel 보안 이슈 정리  (0) 2026.04.20
'Develop' 카테고리의 다른 글
  • [메신저를 한 화면에 ①] 카톡을 터미널에서 읽던 작은 도구
  • 삼성 갤러리의 OneDrive 동기화가 끝난다길래, 갤러리 앱을 직접 만들었다 - Miettes 개발기
  • 카카오톡을 터미널에서 읽는다 — 윈도우 kanao-cli, 맥 kamado-cli
  • 한국어 IME 조합 버그를 고쳐 Windows Terminal에 기여한 이야기
상구너
상구너
개발, AI, 자동화, 일상 기록을 담는 상구너의 작업노트. 직접 해본 것, 써본 것, 정리한 것을 가볍고 실용적으로 남깁니다
  • 상구너
    상구너의 개발노트
    상구너
  • 전체
    오늘
    어제
    • 분류 전체보기 (65) N
      • Day by day (4)
        • Diary (1)
        • TV (0)
      • Challenge (6)
      • Study (32)
        • AI (10)
        • NodeJS (0)
        • JavaScript (3)
        • Markup (1)
        • Linux (6)
        • Java (1)
        • BCI&BCEL&ASM (8)
        • WAS (1)
        • DB (1)
      • Develop (16) N
        • inKrKamus (3)
        • SmartDropPoint (2)
        • rhwptopdf (1)
      • Faith (0)
  • 블로그 메뉴

    • 홈
    • GITHUB
    • LinkedIn
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Rust
    나노바나나
    사이드프로젝트
    Hermes
    openclaw
    tts
    html5
    Ai
    Supertonic
    AI에이전트
  • 최근 댓글

  • 최근 글

상구너
[메신저를 한 화면에 ②] saya, 아무것도 모르는 화면
상단으로

티스토리툴바