# 25. Draft Recovery And Message Reliability

## 문서 목적

이 문서는 `KoTalk`의 신뢰 경험을 정의한다.  
메신저에서 신뢰란 단순히 서버가 살아 있는 상태가 아니라, 사용자가 아래를 믿을 수 있는 상태다.

- 쓴 내용이 사라지지 않는다
- 보낸 내용이 중복되지 않는다
- 실패하면 복구 방법이 바로 보인다
- 다시 열었을 때 이어서 할 수 있다

## 기본 철학

- 초안 보존은 부가 기능이 아니라 기본 기능이다.
- 실패는 숨길 대상이 아니라, 사용자가 직접 회복할 수 있게 드러내야 하는 상태다.
- 전송 상태는 시스템 로그가 아니라, 대화 문맥 안의 일부여야 한다.
- 사용자는 “메시지가 갔는지 안 갔는지”를 고민하면 안 된다.

## 메시지 상태 모델

메시지는 아래 상태를 가진다.

- 작성 중
- 초안 저장됨
- 전송 중
- 전송 성공
- 전송 실패
- 재전송 대기
- 재전송 성공

## 초안 보존 정책

### 저장 기준

- 사용자가 입력을 멈춘 뒤 500~1000ms
- 창 비활성화 시점
- 대화 전환 시점
- 앱 종료 직전
- 모바일 웹 새로고침 또는 백그라운드 진입 직전

### 저장 단위

- 대화별 초안
- 창별 상태
- 첨부 예정 자산 메타데이터

### 복구 기준

- 같은 대화를 다시 열면 즉시 복구
- 세션 복구 이후에도 초안은 남아 있어야 함
- 여러 창에서 같은 대화를 열었을 때 충돌 정책이 필요함

## 전송 실패 UX

### 기본 규칙

- 실패는 토스트 한 줄로 끝나면 안 된다
- 실패 버블은 대화 안에 남아 있어야 한다
- 실패 이유는 기술 용어 없이 짧게 보여 준다
- 바로 옆에 `다시 보내기`가 있어야 한다

### 실패 버블 액션

- 다시 보내기
- 초안으로 되돌리기
- 삭제

### 금지 UX

- 실패 메시지를 자동으로 숨김
- 원인을 설명하지 않음
- 입력창에서 작성했던 원문을 잃게 함

## 중복 방지 정책

- 모든 메시지는 고유한 `clientRequestId`를 가진다
- 재전송은 새 메시지가 아니라 기존 요청의 재시도여야 한다
- 서버와 클라이언트 모두 중복 방지를 처리해야 한다

## 네트워크 흔들림 UX

### 연결 약화

- 사용자에게 큰 경고를 남발하지 않는다
- 상태 표시만 얇게 보여 준다
- 전송 버튼은 상황에 따라 대기열 또는 재시도 모드로 바뀔 수 있다

### 재연결

- 대화 맥락은 유지
- 초안은 유지
- 최근 실패 메시지는 재시도 가능 상태 유지

## 세션 만료와 초안 관계

- 세션 만료 때문에 초안을 버리면 안 된다
- 먼저 초안을 저장하고, 그다음 인증 복구를 시도한다
- 인증 복구 실패 시에도 초안은 남는다

## 플랫폼별 신뢰 UX

### Windows

- 로컬 보호 저장소 기반 세션 유지
- 앱 재실행 후 초안 즉시 복구
- 멀티 윈도우 충돌 정책 필요

### Mobile Web

- 새로고침, 탭 복구, 브라우저 재시작에 강해야 함
- 네트워크 변화가 잦으므로 전송 실패 UX가 더 중요

### Android

- 오프라인 큐와 백그라운드 복귀가 중요
- 푸시와 연계된 재전송 모델 필요

## UX 카피 원칙

권장:

- `전송하지 못했습니다`
- `다시 보내기`
- `초안으로 되돌리기`
- `네트워크가 불안정합니다`
- `작성 중이던 내용은 محفوظ` 같은 외래 표현 금지

권장 대체:

- `작성 중이던 내용은 남아 있습니다`
- `연결이 다시 되면 이어서 보낼 수 있어요`

## 신뢰 지표

- 초안 복구 성공률
- 세션 복구 성공률
- 전송 실패 후 재시도 성공률
- 중복 전송 비율
- 초안 유실 제보 수
- 실패 후 이탈률

## 현재 산출물과의 차이

현재 문서 기준 기대치는 높지만, 실제 구현은 아래가 비어 있다.

- 초안 영속 저장
- 인라인 재전송
- 세션 자동 갱신
- 실패 버블 액션

이 차이는 `CURRENT_LIMITATIONS`와 사용자 리뷰 문서에서 계속 추적해야 한다.

## 스크린샷 기준

- 성공한 대화만 보여 주면 신뢰 문서는 의미가 없다
- 실패 후 재전송, 초안 복구, 네트워크 약화 같은 상태 스크린샷이 필요하다

## 결론

사용자가 메신저를 믿는 순간은 평소가 아니라 실패 순간이다.  
`KoTalk`는 “잘 될 때 깔끔한 메신저”를 넘어서, “망가져도 다시 일을 시키지 않는 메신저”를 목표로 해야 한다.
