Skip to content

서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재 #714

Description

@OnlyReadOneBook

📜 Overview (Required)

타임레터의 서버 실패·지연이 정상 빈 상태, 빈 화면, 빈 작성 폼 또는 무음 상태로 수렴한다. develop 20d7d10d 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건 문구로 표시

    타임레터 목록 조회 실패가 정상 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)에서 실제 화면을 조작했습니다.

  1. 홈에 진입한 QA 세션에서 비행기 모드를 켜고 Wi-Fi와 모바일 데이터를 끕니다.
  2. 하단 타임레터 탭으로 이동합니다.
  3. 목록 조회가 실패한 뒤 표시 문구와 재시도 수단을 확인합니다.

실제 결과: "아직 등록된 타임레터가 없어요. 소중한 사람을 위해 작성해 보세요."가 표시되고 오류 안내와 다시 시도 버튼이 없습니다. 기대 결과는 실패와 정상 0건을 구분하고, 조회 실패에서 복구할 수 있는 경로를 제공하는 것입니다.

확인한 빌드의 오류 분기는 TimeletterUiState.Error를 EmptyTimeLetterContent로 그립니다. 이슈 보강 시점의 develop 8db2d75 원문에도 같은 분기가 남아 있습니다.

기존 수정 PR #1365의 HEAD 2409ef8에는 오류 화면과 재시도 연결이 포함돼 있으나 아직 열려 있습니다. 이번 APK는 develop 빌드이므로 PR의 수정 결과를 재현 검증한 것은 아닙니다. 정상 서버 응답과 재연결 후 복구는 이번 오프라인 검사에서 확인하지 않았습니다.

아래는 2026-10-03 오전 오프라인 상태에서 촬영한 원본 화면입니다. 우측 기기 화면이 검증 대상이며, 좌측 IDE에 열린 다른 체크아웃은 설치 APK의 리비전 근거가 아닙니다.

2026-10-03 오프라인 타임레터 목록이 정상 빈 상태로 표시된 원본 화면

Activity

  1. OnlyReadOneBook commented on Aug 22, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    최신 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로 분리 추적합니다.
  2. OnlyReadOneBook commented on Aug 24, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    재현 확인 (develop 4e0a648eb, 2026-08-25 04:35 KST)

    GET /api/v1/time-letters 가 SocketTimeout(10s)으로 실패했는데 화면은 빈 상태 문구를 표시합니다.

    아직 등록된 타임레터가 없어요.
    소중한 사람을 위해 작성해 보세요.

    오류 표시도 재시도 수단도 없어, 사용자는 자신이 등록해 둔 타임레터가 사라졌다고 오인합니다. 실패를 성공(0건)으로 바꿔 보여주는 것이라 무음 실패 중에서도 위험도가 높은 쪽입니다.

    같은 조건에서 홈과 노트 탭은 "…불러오지 못했습니다." + "다시 시도" 를 정상 노출하므로, 실패 상태 결선이 타임레터에만 빠져 있는 것으로 보입니다.

    부수 확인 — 2차 QA #3(타임레터 우상단 아이콘 무반응) 중 설정(톱니) 아이콘은 정상 동작하게 됐고, 프로필(사람) 아이콘은 여전히 무반응입니다.

  3. changed the title [-]fix(timeletter): 서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재[/-] [+]서버 실패가 빈 정상 화면·무음 상태로 수렴 — 목록·수정·임시저장·수신인 선택 복구 수단 부재[/+] on Aug 28, 2026
  4. added
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Aug 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:timeletter타임레터 기능 영역bugSomething isn't workingpr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions