Skip to content

fix(afternote): 추모 영상 썸네일 실패에 재시도 수단이 없다 — 결손이 저장으로 영구 확정된다 (#705 5번 분리) #1550

Closed

Description

@OnlyReadOneBook

작업 유형

bug — 버그·오동작

주 담당 모듈

afternote — 애프터노트

개요

#705 의 5번 항목을 착수 단위로 분리한다. 우산의 나머지(목록 refresh 무음 · 상세 재조회 부재 · prefill 실패 빈 폼 · 진행 상태 미전달 · LoadState 계측)는 #705 에 남는다.

추모 영상 썸네일이 실패하면 되돌릴 수단 없이 결손이 저장으로 확정된다. 실패는 두 갈래이고 둘 다 복구 경로가 없다.

1. 프레임 추출 실패 — 완전 무음

MemorialVideoUpload L89-L128 이 MediaMetadataRetriever 로 프레임 0 을 못 뽑으면 onMemorialThumbnailExtractionFailed L353-L361 이 ErrorReporter(MEMORIAL_THUMBNAIL_EXTRACT) 에 기록만 한다. 화면에는 스낵바조차 없다.

2. 업로드 실패 — 액션 없는 스낵바 한 줄

uploadMemorialThumbnail L332-L351 의 실패는 AfternoteEditorError.Upload(Target.THUMBNAIL) 로 오류 이벤트에 실리고, NavGraph L188-L205 가 액션 없는 스낵바 한 줄로 흘린다. 그동안 편집기에는 로컬에서 뽑은 비트맵이 그대로 떠 있어 «썸네일이 붙었다» 로 읽힌다 — 저장하면 사라진다.

결손은 영구다

  • 재시도 트리거가 없다. 추출은 LaunchedEffect(videoUrl) 키라 같은 영상이 폼에 있는 한 다시 돌지 않는다. 영상을 처음부터 다시 골라야 썸네일이 생긴다.
  • 저장하면 확정된다. payload 의 memorialThumbnailUrl 이 null 인 채로 나가고, 서버는 채워 주지 않는다 — BE AfternotePlaylist.MemorialVideo 는 videoUrl·thumbnailUrl 두 칸을 nullable 로 저장만 하고 영상에서 프레임을 뽑는 로직이 없다(2026-08-30 Afternote-BE origin/main 실측).
  • 재편집으로도 못 고친다. prefill 된 영상은 원격 URL 이라 MemorialVideoUpload 가 isLocalContentUri() 검사 L95 에서 추출 자체를 건너뛴다.
  • 결과는 시안에 없는 상태다. 수신자 상세 ReceiverMemorialVideoThumbnail L302 는 AsyncImage 를 건너뛰고 회색 그라디언트 + 재생 아이콘만 그린다. 시안에는 «영상 있음(썸네일 채워짐)» 과 «영상 없음(+ 카드)» 두 상태뿐이다 — 서버 실패가 무음·빈 정상 화면으로 수렴 — 목록·상세·에디터 복구 수단 부재 #705 에서 2026-08-24 대조 완료.

필요한 동작

  1. 업로드 실패 시 추출한 바이트를 유지하고, 영상 재선택 없이 재업로드하는 사용자 액션을 준다.
  2. 추출 실패도 같은 재시도 경로에 태운다. 바이트가 없으므로 재추출부터 다시 돌아야 한다(LaunchedEffect 재발화 키 추가).
  3. 저장 시점에 미해결 썸네일이 남아 있으면 자동으로 한 번 더 시도한다. 영상은 이미 저장 시점에 업로드하므로(resolveMemorialMediaForSave) 이 편이 대칭이다. 실패해도 저장 자체는 막지 않는다.
  4. 회귀 테스트로 고정한다 — 업로드 실패 후 재시도 성공 시 저장 payload 에 thumbnailUrl 이 실리는 것, 추출 실패 후 재시도로 추출이 다시 도는 것.

자식 이슈

No response

참고

Activity

  1. github-actions commented on Aug 30, 2026

    @github-actions
    Contributor

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

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

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

  2. added
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Aug 30, 2026
  3. github-actions commented on Aug 30, 2026

    @github-actions
    Contributor

    이 이슈를 맡은 PR 은 #1567 다 (base refactor/1561-memorial-media-value-object).

    base 가 기본 브랜치(develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에
    아무것도 표시하지 않는다. 본문에 Closes #N 이 있어도 마찬가지다 — 그 링크는 기본 브랜치를
    target 하는 PR 에서만 만들어진다.

    PR 이 닫히거나 머지되면 이 이슈의 pr-open 라벨은 다음 리컨사일에서 떨어진다.

  4. removed
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Sep 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:afternote애프터노트 기능 영역bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions