한 일

조회 명령의 답을 카톡 댓글(thread)로 달게 했다. 이 아이디어는 사용자가 먼저 냈다. /설명 같은 게 자주 바뀌면 그 답이 채팅방에 평문으로 쌓여 도배가 된다는 거였다. “그러니 댓글로 다는 게 맞지 않냐"고 했다. 맞는 말이었다. 그래서 /파티·/내파티·/가이드·/설명 같은 조회 명령의 답을, 명령을 보낸 메시지에 댓글로 달리게 바꿨다.

  • 명령 정의에 thread:true 플래그를 붙였다 (가이드·파티·내파티·설명)
  • 그 플래그가 응답 경로를 타고 흘러서, 원본 메시지 id를 댓글 부모로 넘기게 했다
  • 파티를 바꾸는 명령(/생성·/참가 등)은 그대로 평문으로 답하게 뒀다

이 기능은 사실 6월 7일에 한 번 “루트 권한이 없으면 안 된다"고 보류했던 것이다. 그새 안드로이드 환경을 루트 쪽으로 갈아탔다. 그래서 막혔던 전제가 풀려서 이번에 드디어 만들었다. 테스트를 먼저 빨갛게 짜고 통과시키는 식(TDD)으로 했고, 전체 113개 테스트가 다 통과했다.

Redis 메모리 한도를 영구로 올렸다. 메시지를 쌓는 Redis의 메모리 한도가 32MB였다. 이걸 128MB로 올렸다. 먼저 돌아가는 서버에 런타임 설정으로 바로 적용했다. 그다음 설정 파일에 한 줄 박아서 다음 배포에도 살아남게 영구화했다. 배포 후 한도가 실제로 128MB로 들어갔는지, 쌓아둔 메시지가 그대로인지 확인했다.

자주 쓰는 두 명령을 하나로 묶은 커맨드를 만들었다. 세션을 마무리하는 /fin과 push·PR·머지를 한 번에 하는 /prmain을 따로 부르던 걸, /fprm 하나로 묶었다. 정리하고 커밋한 뒤 main 반영까지 한 번에 간다.

운영 도구와 백업을 살폈다. 헬스체크, 백업 스크립트, 자원 포화 알림 같은 관측성 보강을 준비했다. 다만 작업하던 워크트리가 main에서 108커밋이나 뒤처져 있어서 그대로 올리면 위험했다. 그래서 코드는 패치 파일로 따로 보존만 하고, 최신 main에서 새 가지를 떠서 다시 올리기로 미뤘다. 겸사겸사 옛 자동 백업이 진짜 돌고 있었는지도 의심해서 점검 거리로 남겼다.

막힌 것, 고친 것

댓글 기능은 한 번에 깔끔하게 되지 않았다. 사용자가 실시간으로 짚어준 덕에 두 번 더 고쳤다.

  • 댓글이 보내지긴 했는데 화면에 안 보였다. 사용자가 먼저 “반응이 없는데?“라고 했다. 부모로 넘긴 id가 틀렸던 게 원인이었다. 내부에서 쓰는 로컬 id를 넘겼는데, 카톡 댓글은 진짜 메시지 id(json.id)를 부모로 요구했다. 없는 부모를 가리키니 안 그려졌다. 진짜 메시지 id를 넘기게 고쳤다.
  • 댓글 안에서 보낸 명령에 또 댓글로 답하니 안 보였다. 이것도 사용자가 “댓글 안에서는 /파티가 안 먹히냐"고 물어서 드러났다. 카톡 댓글은 평면 구조라 댓글의 댓글이 안 된다. 그래서 들어온 메시지가 이미 댓글이면, 그 댓글 말고 맨 위 원본에 형제로 답을 달게 고쳤다.

옛 자동 백업도 한 가지 걸렸다. 백업 스크립트가 부르는 컨테이너 이름이 실제 이름과 어긋나 있었다. 그래서 백업이 조용히 실패하고 있었을 수 있다. 운영 쪽 최신 백업 날짜를 직접 확인할 일로 적어뒀다.

돌아보며

댓글 기능은 만들고 끝이 아니었다. 보내는 데까진 됐는데, 정작 화면엔 안 보였다. 사용자가 “반응이 없는데?“라고 했을 때 알았다. 로컬 id와 진짜 메시지 id를 헷갈렸던 탓이다. 그걸 잡고 나니 이번엔 댓글 안의 명령이 또 말썽이었다. 평면 구조라는 카톡의 제약을 내가 머리로만 알았지 손으로는 몰랐던 거다. 진짜 메시지를 까보고 나서야 원인이 잡혔다. 추측 대신 실측이 답이라는 걸 또 배웠다.

돌아보면 막힌 데를 짚어준 건 둘 다 사용자의 실시간 점검이었다. 내가 “됐다"고 생각한 지점에서 사용자는 직접 쳐보고 “안 되는데?“를 먼저 말했다. 만드는 사람과 쓰는 사람의 눈이 다르다. 그 차이가 버그를 더 빨리 끌어냈다.

서버 살림 쪽에선 솔직히 욕심을 누른 게 다행이었다. 관측성 보강을 다 만들어놓고도, 워크트리가 108커밋이나 뒤처진 걸 보고 그냥 올리지 않았다. 그대로 밀었으면 옛 코드로 새 코드를 덮을 뻔했다. 안 올리고 패치로 보존한 결정이 맞았다고 생각한다.

큰일 하나, 살림 하나. 이렇게 나눠서 본 하루였다. 막힌 데서 추측으로 손대지 않은 게 두 갈래 다 통했다.