# 25. Draft Recovery And Message Reliability ## 문서 목적 이 문서는 `KoTalk`의 신뢰 경험을 정의한다. 메신저에서 신뢰란 단순히 서버가 살아 있는 상태가 아니라, 사용자가 아래를 믿을 수 있는 상태다. - 쓴 내용이 사라지지 않는다 - 보낸 내용이 중복되지 않는다 - 실패하면 복구 방법이 바로 보인다 - 다시 열었을 때 이어서 할 수 있다 ## 기본 철학 - 초안 보존은 부가 기능이 아니라 기본 기능이다. - 실패는 숨길 대상이 아니라, 사용자가 직접 회복할 수 있게 드러내야 하는 상태다. - 전송 상태는 시스템 로그가 아니라, 대화 문맥 안의 일부여야 한다. - 사용자는 “메시지가 갔는지 안 갔는지”를 고민하면 안 된다. ## 메시지 상태 모델 메시지는 아래 상태를 가진다. - 작성 중 - 초안 저장됨 - 전송 중 - 전송 성공 - 전송 실패 - 재전송 대기 - 재전송 성공 ## 초안 보존 정책 ### 저장 기준 - 사용자가 입력을 멈춘 뒤 500~1000ms - 창 비활성화 시점 - 대화 전환 시점 - 앱 종료 직전 - 모바일 웹 새로고침 또는 백그라운드 진입 직전 ### 저장 단위 - 대화별 초안 - 창별 상태 - 첨부 예정 자산 메타데이터 ### 복구 기준 - 같은 대화를 다시 열면 즉시 복구 - 세션 복구 이후에도 초안은 남아 있어야 함 - 여러 창에서 같은 대화를 열었을 때 충돌 정책이 필요함 ## 전송 실패 UX ### 기본 규칙 - 실패는 토스트 한 줄로 끝나면 안 된다 - 실패 버블은 대화 안에 남아 있어야 한다 - 실패 이유는 기술 용어 없이 짧게 보여 준다 - 바로 옆에 `다시 보내기`가 있어야 한다 ### 실패 버블 액션 - 다시 보내기 - 초안으로 되돌리기 - 삭제 ### 금지 UX - 실패 메시지를 자동으로 숨김 - 원인을 설명하지 않음 - 입력창에서 작성했던 원문을 잃게 함 ## 중복 방지 정책 - 모든 메시지는 고유한 `clientRequestId`를 가진다 - 재전송은 새 메시지가 아니라 기존 요청의 재시도여야 한다 - 서버와 클라이언트 모두 중복 방지를 처리해야 한다 ## 네트워크 흔들림 UX ### 연결 약화 - 사용자에게 큰 경고를 남발하지 않는다 - 상태 표시만 얇게 보여 준다 - 전송 버튼은 상황에 따라 대기열 또는 재시도 모드로 바뀔 수 있다 ### 재연결 - 대화 맥락은 유지 - 초안은 유지 - 최근 실패 메시지는 재시도 가능 상태 유지 ## 세션 만료와 초안 관계 - 세션 만료 때문에 초안을 버리면 안 된다 - 먼저 초안을 저장하고, 그다음 인증 복구를 시도한다 - 인증 복구 실패 시에도 초안은 남는다 ## 플랫폼별 신뢰 UX ### Windows - 로컬 보호 저장소 기반 세션 유지 - 앱 재실행 후 초안 즉시 복구 - 멀티 윈도우 충돌 정책 필요 ### Mobile Web - 새로고침, 탭 복구, 브라우저 재시작에 강해야 함 - 네트워크 변화가 잦으므로 전송 실패 UX가 더 중요 ### Android - 오프라인 큐와 백그라운드 복귀가 중요 - 푸시와 연계된 재전송 모델 필요 ## UX 카피 원칙 권장: - `전송하지 못했습니다` - `다시 보내기` - `초안으로 되돌리기` - `네트워크가 불안정합니다` - `작성 중이던 내용은 محفوظ` 같은 외래 표현 금지 권장 대체: - `작성 중이던 내용은 남아 있습니다` - `연결이 다시 되면 이어서 보낼 수 있어요` ## 신뢰 지표 - 초안 복구 성공률 - 세션 복구 성공률 - 전송 실패 후 재시도 성공률 - 중복 전송 비율 - 초안 유실 제보 수 - 실패 후 이탈률 ## 현재 산출물과의 차이 현재 문서 기준 기대치는 높지만, 실제 구현은 아래가 비어 있다. - 초안 영속 저장 - 인라인 재전송 - 세션 자동 갱신 - 실패 버블 액션 이 차이는 `CURRENT_LIMITATIONS`와 사용자 리뷰 문서에서 계속 추적해야 한다. ## 스크린샷 기준 - 성공한 대화만 보여 주면 신뢰 문서는 의미가 없다 - 실패 후 재전송, 초안 복구, 네트워크 약화 같은 상태 스크린샷이 필요하다 ## 결론 사용자가 메신저를 믿는 순간은 평소가 아니라 실패 순간이다. `KoTalk`는 “잘 될 때 깔끔한 메신저”를 넘어서, “망가져도 다시 일을 시키지 않는 메신저”를 목표로 해야 한다.