“채팅 기능도 넣어주세요.” 견적 요청에서 자주 나오는 한 줄입니다. 화면으로 보면 메시지가 오가는 게 전부라 간단해 보입니다. 실제로 만들어 보면, 눈에 안 보이는 부분에서 일이 훨씬 많습니다.
기본은 하루면 됩니다
메시지를 보내고 상대 화면에 뜨게 하는 건 어렵지 않습니다. 웹소켓으로 연결해서 주고받으면 됩니다. 여기까지는 정말 금방입니다.
문제는 실제 서비스에서 필요한 나머지입니다.
1. 연결은 계속 끊깁니다
모바일은 지하철에 들어가면 끊깁니다. 앱을 잠깐 내렸다 올려도 끊깁니다. 와이파이에서 데이터로 넘어가도 끊깁니다.
그래서 “끊기면 다시 붙는다”가 아니라 “끊긴 동안 온 메시지를 받아온다”까지 만들어야 합니다. 안 그러면 사용자는 메시지를 조용히 놓칩니다. 이게 채팅에서 가장 치명적인 버그입니다.

2. 안 읽음 표시가 은근히 어렵습니다
읽음 표시는 세 곳이 같이 맞아야 합니다.
- 채팅방 목록의 안 읽음 개수
- 앱 아이콘의 빨간 배지
- 방에 들어갔을 때 읽음 처리
한 곳만 어긋나도 사용자는 바로 알아챕니다. 안 읽은 게 없는데 배지가 남아 있으면 짜증이 납니다. 여러 기기에서 같은 계정을 쓰면 더 복잡해집니다.
채팅의 완성도는 메시지 전송이 아니라 읽음 처리에서 갈립니다.
3. 알림과 겹치지 않게
메시지가 오면 알림을 보내야 합니다. 그런데 지금 그 방을 보고 있는 사용자에게는 보내면 안 됩니다.
“앱이 켜져 있는가”, “그 방에 들어와 있는가”, “화면이 잠겨 있는가”를 구분해야 합니다. 이걸 대충 만들면 대화하는 내내 알림이 울립니다.

4. 목록을 빠르게 띄우기
채팅방 목록에는 마지막 메시지와 안 읽음 개수가 필요합니다. 이걸 매번 전체 메시지에서 계산하면 방이 늘수록 느려집니다.
그래서 마지막 메시지와 개수는 따로 저장해 두고 갱신합니다. 데이터가 두 곳에 생기니, 어긋나지 않게 관리하는 게 일이 됩니다.
5. 신고와 차단
사람이 대화하는 기능에는 반드시 필요합니다. 차단하면 상대 메시지가 안 보여야 하고, 신고 내역은 운영자가 확인할 수 있어야 합니다.
특히 앱은 이게 없으면 스토어 심사에서 지적받을 수 있습니다. 사용자 간 소통이 있는 앱은 신고 수단을 요구합니다.
그래서 견적에 뭘 넣어야 하나
채팅을 넣는다면 최소한 이 정도는 범위에 있어야 합니다.
- 재접속 시 놓친 메시지 동기화
- 안 읽음 개수와 배지
- 알림 조건 처리
- 이미지 전송
- 신고와 차단
- 운영자용 조회 화면
“채팅 기능”이라는 한 줄이 실제로는 이만큼입니다. 견적을 비교하실 때 이 항목들이 들어 있는지 보시면, 왜 어떤 곳이 유난히 싼지 알 수 있습니다.
