You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재 #714
타임레터의 서버 실패·지연이 정상 빈 상태, 빈 화면, 빈 작성 폼 또는 무음 상태로 수렴한다. develop20d7d10d debug APK를 Pixel 7 API 35에서 정상·오프라인·무응답 조건으로 실측하고 정적 상태 전이를 함께 확인했다.
발신 목록: GET /time-letters 실패 뒤 실제 0건과 같은 “아직 등록된 타임레터가 없어요”를 표시하며 Retry가 없다.
임시저장 목록: Loading과 Error 분기가 모두 Unit이라 빈 화면이고, 선택 삭제 실패도 무음이다.
수신인 선택: cache miss 조회가 실패·지연돼도 Loading/Error/Retry 없이 빈 목록만 보인다.
수정 prefill: 대상 조회 실패 뒤 editingTimeLetterId가 null인 빈 “등록” 폼으로 전환되어, 사용자가 다시 작성하면 PATCH가 아니라 POST 신규 생성으로 분기한다.
저장·등록 한도 조회: isSaving과 isCheckingRegisterLimit가 진행 UI에 연결되지 않아 요청 중에도 버튼이 그대로 보이고 재탭은 무반응으로 끝난다.
정상 빈 상태와 실패를 분리하고 각 경로에 오류 문구·Retry를 제공해야 한다. 수정 prefill 실패 시 저장 가능한 빈 폼으로 전환하지 말고, 저장·한도 확인·삭제 중에는 진행 표시와 액션 잠금을 함께 제공해야 한다.
실측 화면
목록 조회 실패가 정상 0건 문구로 표시
수신인 조회 무응답이 빈 목록으로 표시
저장 요청 대기 중 진행 표시 없음
관련 지점: TimeletterScreen.kt:71, DraftLetterScreen.kt:78, DraftLetterViewModel.kt:49, RecipientListViewModel.kt:20, TimeLetterWriteViewModel.kt:242,297, TimeLetterWriteScreen.kt:337.
📌 Child Issue(Optional)
No response
📍 Note (Optional)
#703은 성공 조회 후 재진입 갱신 문제다. #570은 수신자 없는 임시저장 400, #571은 임시저장 레이아웃·진입점, #437은 미디어 첨부·수정 저장 오류라 범위가 다르다.
#609가 해소되기 전 수신 전용 타임레터 화면은 별도 게이트에 막혀 있다.
시안 미대조. 디자인 대조가 아니라 서버 실패·지연 상태가 정상값으로 오표시되는 동작 결함이다.
2026-10-03 발신 목록 오프라인 재현 확인
기존 발신 목록 항목을 756e456f1f4d280a630fcbe119bb1645e683f97e의 debug APK(1.0+756e456)에서 다시 확인했습니다. Android API 36 에뮬레이터(1080×2400, 420dpi)에서 실제 화면을 조작했습니다.
홈에 진입한 QA 세션에서 비행기 모드를 켜고 Wi-Fi와 모바일 데이터를 끕니다.
하단 타임레터 탭으로 이동합니다.
목록 조회가 실패한 뒤 표시 문구와 재시도 수단을 확인합니다.
실제 결과: "아직 등록된 타임레터가 없어요. 소중한 사람을 위해 작성해 보세요."가 표시되고 오류 안내와 다시 시도 버튼이 없습니다. 기대 결과는 실패와 정상 0건을 구분하고, 조회 실패에서 복구할 수 있는 경로를 제공하는 것입니다.
확인한 빌드의 오류 분기는 TimeletterUiState.Error를 EmptyTimeLetterContent로 그립니다. 이슈 보강 시점의 develop 8db2d75 원문에도 같은 분기가 남아 있습니다.
기존 수정 PR #1365의 HEAD 2409ef8에는 오류 화면과 재시도 연결이 포함돼 있으나 아직 열려 있습니다. 이번 APK는 develop 빌드이므로 PR의 수정 결과를 재현 검증한 것은 아닙니다. 정상 서버 응답과 재연결 후 복구는 이번 오프라인 검사에서 확인하지 않았습니다.
아래는 2026-10-03 오전 오프라인 상태에서 촬영한 원본 화면입니다. 우측 기기 화면이 검증 대상이며, 좌측 IDE에 열린 다른 체크아웃은 설치 APK의 리비전 근거가 아닙니다.
최신 develop b834c11 소급 QA(2026-08-23, Pixel 7 에뮬 · Android 15 · 오프라인)에서 본문 첫 항목을 재확인했습니다.
발신 목록: GET /time-letters 실패 시 여전히 "아직 등록된 타임레터가 없어요" + Retry 없음 (TimeletterScreen.kt:106의 Error -> EmptyTimeLetterContent). 수신자용 RecipientTimeletterScreen은 오류 문구+다시 시도를 정상 표시하는 것과 대조적입니다.
추가 확인: 네트워크 실패뿐 아니라 200 응답의 계약 불일치(DTO 파싱 실패)도 같은 경로로 "없어요"가 됩니다. debug 목업이 200으로 2건을 반환해도 블록 필드 누락으로 파싱이 실패하면 빈 목록으로 위장됨을 재현했습니다(임시저장 목업은 파싱돼 카운트 1 표시 — 대조 증명).
수신인 선택 항목은 당시 "빈 목록"에서 현재 크래시로 악화 — #884로 분리 추적합니다.
changed the title [-]fix(timeletter): 서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재[/-][+]서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재[/+]on Aug 28, 2026
Activity
OnlyReadOneBook commentedon Aug 22, 2026
최신 develop
b834c11소급 QA(2026-08-23, Pixel 7 에뮬 · Android 15 · 오프라인)에서 본문 첫 항목을 재확인했습니다.GET /time-letters실패 시 여전히 "아직 등록된 타임레터가 없어요" + Retry 없음 (TimeletterScreen.kt:106의Error -> EmptyTimeLetterContent). 수신자용RecipientTimeletterScreen은 오류 문구+다시 시도를 정상 표시하는 것과 대조적입니다.fix(core): 수신인 조회 실패를 빈 목록으로 낮춰 flow 예외 전파를 끊는다
OnlyReadOneBook commentedon Aug 24, 2026
재현 확인 (develop
4e0a648eb, 2026-08-25 04:35 KST)GET /api/v1/time-letters가 SocketTimeout(10s)으로 실패했는데 화면은 빈 상태 문구를 표시합니다.오류 표시도 재시도 수단도 없어, 사용자는 자신이 등록해 둔 타임레터가 사라졌다고 오인합니다. 실패를 성공(0건)으로 바꿔 보여주는 것이라 무음 실패 중에서도 위험도가 높은 쪽입니다.
같은 조건에서 홈과 노트 탭은 "…불러오지 못했습니다." + "다시 시도" 를 정상 노출하므로, 실패 상태 결선이 타임레터에만 빠져 있는 것으로 보입니다.
부수 확인 — 2차 QA #3(타임레터 우상단 아이콘 무반응) 중 설정(톱니) 아이콘은 정상 동작하게 됐고, 프로필(사람) 아이콘은 여전히 무반응입니다.
docs(qa): 3차 QA 예비 순회 결과를 현황에 반영한다
fix(core): 갱신 실패가 보고 있던 수신인 목록을 지우지 않게 (#884 리뷰)
[-]fix(timeletter): 서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재[/-][+]서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재[/+]fix(timeletter): 리뷰 지적 6건과 컴파일 블로커를 해소한다
fix(timeletter): 발신 목록 조회 실패 시 재시도 UI를 되살린다
fix(timeletter): 수신인 선택 소실과 로그아웃 신호 유실을 고친다 (#714)
test(timeletter): 수신인 선택 유지를 uiState 순환으로 검증한다 (#714)
fix(timeletter): androidTest를 RecipientListScreen의 상태 없는 시그니처에 맞춘다 (#714
fix(timeletter): 수신인 선택을 receiverListStateFlow 로 옮겨 실패를 빈 목록과 가른다 (#714)