Skip to content

fix(timeletter): 크기 초과(1803) 첨부 실패가 일반 저장 실패로 뭉개져 재시도를 권한다 (#1868 표시 몫 분리) #2081

Open

Description

@OnlyReadOneBook

작업 유형

bug — 버그·오동작

주 담당 모듈

timeletter — 타임레터

개요

#1868 의 타임레터 표시 몫이다. 타임레터 작성의 이미지 블록도 같은 PhotoUploadRepository 를 타므로, 10 MiB 를 넘는 사진을 고르면 서버가 code 1803 으로 거절한다. 그런데 작성 화면은 그 거절을 일반 저장 실패로 접어 재시도를 권한다. 파일 크기가 그대로인 한 재시도는 같은 거절을 다시 받는다.

현행 실측 (origin/develop 7d87aa3, 2026-09-13)

usecase/ResolveTimeLetterBlocksUseCase.kt:38 이 업로드 실패를 getOrElse { throw it } 로 그대로 다시 던지고, viewmodel/TimeLetterWriteViewModel.kt:499 가 TimeLetterServerRejectionException 이 아닌 실패를 전부 TimeLetterWriteError.SaveFailed 로 접는다. 화면은 screen/sender/TimeLetterWriteScreen.kt:603 에서 그 상태를 문자열 하나로 그린다.

feature/timeletter/presentation/src/main/res/values/strings.xml:6

<string name="timeletter_write_save_failed">저장에 실패했어요. 다시 시도해주세요.</string>

같은 UseCase 의 validateLocalMedia 는 MIME 만 검사하고 크기는 보지 않는다. 업로드가 저장 시점에 일어나므로 사용자는 편지를 다 쓰고 저장을 누른 뒤에야 실패를 만나며, 안내는 어느 블록이 문제인지도 알려주지 않는다.

실기기 재현은 #1868 이 마음의 기록 경로에서만 했다. 여기는 같은 저장소 구현을 타고 같은 contentLength 를 그대로 실어 보낸다는 코드 대조까지다. 착수 시점에 실기기로 한 번 확인할 것.

선행

#2089 가 core:domain 에 FileUploadFailure.FileSizeExceeded 를 세우고 PhotoUploadRepository, VideoUploadRepository 의 실패를 그 타입으로 옮긴다. 그 타입이 서야 여기서 가를 수 있으므로 blocked_by 로 건다. 처음에는 #1868 에 걸었는데, 그 타입 수립분이 #2089 로 떨어져 나가 선행을 그 번호로 옮겼다.

문구는 #446 이 PM 에게 확인 중이고 완료 조건이 그 답변에 걸려 있으므로 #446 도 blocked_by 로 건다. 종전에는 #1868 을 거쳐 전이로 걸려 있었는데, 선행을 #2089 로 옮기면 그 전이가 끊겨 문구 게이트가 사라진다. #446 이 확정한 공통 팝업 4종에 크기 초과 경우가 없고, 그중 "업로드 실패" 팝업은 버튼이 "다시 시도하기"라 이 결함을 그대로 물려받는다.

완료 조건

  • 업로드 실패가 저장 실패와 갈려 전달된다. UseCase 가 던지는 예외를 ViewModel 이 SaveFailed 로 뭉개지 않는다
  • FileUploadFailure.FileSizeExceeded 가 다른 업로드 실패와 다른 안내로 표시된다
  • 크기 초과 안내가 재시도를 권하지 않는다
  • 표시할 문구는 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 이 PM 답변으로 확정한 값을 쓴다. 확정 전에 FE 재량으로 문안을 정하지 않는다

참고

Activity

  1. github-actions commented on Sep 13, 2026

    @github-actions
    Contributor

    bug 이슈는 사이드바 Fields > Priority 로 심각도를 지정해야 합니다. 판정 기준:

    • Urgent: 치명 — 크래시·데이터 소실·보안 무력화·핵심 경로 차단·가짜 성공
    • High: 심각 — 실패·틀린 값의 정상 위장, 핵심 기능 무동작
    • Medium: 불편 — 우회로가 있는 오동작·틀린 표시, 핵심 흐름은 유지
    • Low: 경미 — 문구·정렬·마감 품질 흠, 기능 영향 없음

    값이 비어 있어도 이슈를 닫지는 않습니다. 이 안내는 이슈당 한 번만 답니다.

  2. OnlyReadOneBook commented on Sep 13, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    선행을 #1868 에서 #2089 로 옮겼다

    이 이슈가 기다리던 선행분은 core:domain 에 FileUploadFailure.FileSizeExceeded 를 세우고 두 업로드 저장소의 실패를 그 타입으로 옮기는 일이다. 그 몫이 #1868 에서 #2089 로 떨어져 나갔다. #1868 에는 애프터노트 에디터 표시 연결과 #446 문구 결정 대기가 남는다. 그래서 blocked_by 를 #1868 에서 #2089 로 바꿨다.

    함께 #446 을 직접 걸었다. 종전에는 #1868 을 거쳐 전이로 걸려 있었는데 선행을 옮기면 그 전이가 끊긴다. 이 이슈의 완료 조건 마지막 줄이 "표시할 문구는 #446 이 PM 답변으로 확정한 값을 쓴다" 라 #446 없이는 닫을 수 없으므로, 문구 게이트가 관계에서 그대로 읽히게 두는 편이 맞다.

    본문의 선행 문단과 분리 출처 줄도 새 번호로 고쳤다. 착수 순서는 #2089 가 먼저 들어오고 #446 의 답변이 온 뒤다. 판단 근거 전문은 #1868 코멘트에 있다.

  3. OnlyReadOneBook commented on Sep 30, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    10MB 초과 사진의 안내 문구·버튼과 자동 축소 여부를 PM 질문방에 올렸습니다(2026-09-30, #1868·#2080·#2081 공통): https://discord.com/channels/1423516014330646760/1425390413128138862/threads/1554867003897028780

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 working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions