Repository navigation
feat(afternote): 추억 노트에 추모 음성 첨부·녹음 경로를 연다 (#1118 분리) #1734
Copy link
Copy link
Closed as not planned
Labels
Description
작업 유형
enhancement — 신규 기능·기존 기능 개선
주 담당 모듈
afternote — 애프터노트
개요
부모 #1118 (추억 노트 미디어 음성 녹음 첨부) 에서 첨부·녹음 경로 몫만 분리한 이슈다. PR #1625 가 구현한다.
문제 — 서버 playlist.memorialAudioUrl 자리는 생겼는데(Afternote-BE#268, 2026-08-30) FE 는 MediaKind 에 AUDIO 가 없고, 편집 화면에 음성을 붙일 슬롯·시트 옵션·녹음 인텐트·업로드 경로가 없다.
변경
MediaKind.AUDIO추가,MemorialMediaUploadRepositoryImpl.resolve의when으로 누락을 컴파일 에러로 잡는다ResolveMemorialMediaForSaveUseCase오디오 갈래 +playlist.memorialAudioUrl저장·프리필 결선 (AfternoteTypeForm.Memorial.audioUrl)- POST는 전체 값으로 생성하고 PATCH는 #1617의
MemorialPatchPayload/FieldPatch로 음성 유지(키 생략)·삭제(null)·교체(URL)를 구분한다. 원본 상세 기준값과 현재 폼을 비교해 음성만 바꾸면 사진·영상·곡을 재전송하지 않는다 - fix(afternote): 프로세스 사망 복원 뒤 상세 재조회 프리필이 미저장 편집을 덮는다 (#1617 후속) #1732 복원 가드를 먼저 포함해 음성을 지운 폼이 프로세스 재생성 뒤 서버 프리필로 덮이지 않고 삭제 PATCH로 저장되도록 한다
- 녹음 인텐트
RecordSoundContract—RECORD_SOUND_ACTION은 결과 URI 를 돌려주는 계약이라TakePicture/CaptureVideo와 반대. 녹음 앱 없는 기기는 기존ActivityNotFoundException갈래 재사용 MemorialMediaSourceBottomSheet에MemorialMediaTarget.AUDIO(파일 선택·녹음·삭제), 아이콘은core_ui_ic_mic재사용- 업로드는
MemorialAudioUploadRepository(feature 로컬) — 공용 업로드의jpg확장자 폴백을 피한다. 지원 형식 판정MemorialAudioFormats를 도메인 한 벌로 두고amr·3gpp는 첨부 시점에 스낵바로 막는다 - UI 자리는 시안 부재로 FE 확정 — 「장례식에 남길 영상」 뒤 「남기고 싶은 목소리」 섹션, 영상 슬롯 규격 그대로
완료 조건
- 추억 노트 편집기에서 파일 선택·녹음으로 음성을 첨부·삭제할 수 있다
- 저장 요청에
playlist.memorialAudioUrl이 실리고, 수정 진입 시 프리필로 되돌아온다 - 서버 미허용 형식(
amr·3gpp등)은 첨부 단계에서 차단된다 — 저장 400 으로 미루지 않는다 - 녹음 앱 없는 기기에서 크래시 없이 안내된다
- 위 규칙이 JVM 단위 테스트로 고정된다 (
MemorialAudioFormatsTest의 서버AUDIO_EXTENSIONS대칭 포함)
참고
- 부모 추억 노트 미디어 음성 녹음 첨부 — #369 에서 서버 계약 부재로 빠진 갈래 #1118 에 남는 몫: 재생·표시 UI — 붙인 음성을 다시 듣는 수단(작성자 상세·수신자 열람 화면). 영상과 함께 다뤄야 일관되므로 부모가 추적한다
- 구현 선행: fix(afternote): 수정 시 변경하지 않은 필드를 부분 PATCH에서 생략한다 #1617 / PR #1626의 변경 필드 PATCH → fix(afternote): 프로세스 사망 복원 뒤 상세 재조회 프리필이 미저장 편집을 덮는다 (#1617 후속) #1732 / PR #1839의 복원 가드 → 이 이슈 / PR feat(afternote): 추억 노트에 추모 음성 첨부·녹음 경로를 연다 (#1734) #1625 → feat(afternote): 임시저장 저장·발행 전환과 이어쓰기 프리필 코어 #808 / PR #1768의 임시저장 이어쓰기. #1625가 #1839를 포함하고, 음성 슬롯도 동일한 기준값·복원 계약에 맞춘다
- 발행 PLAYLIST의 음성만 바꾸는 PATCH는 Afternote-BE#277의
songs생략 검증 수정·배포가 선행되어야 한다. 기존 곡을 다시 보내는 우회는 다른 기기의 변경을 덮으므로 하지 않는다 - Afternote-BE#248은 CLOSED이며 음성 필드 자체의 부재는 더 이상 블로커가 아니다
- 실기기 QA 미완: 녹음 앱이 돌려준
MediaStoreURI 읽기 권한(API 33+SecurityException가능성) —READ_MEDIA_AUDIO선언 여부는 실측 후 판단
구현 검증
PR #1625 51d18d177에서 afternote domain/data/presentation 단위 테스트 417건(실패·오류·skip 0), 3개 모듈 ktlint, 앱 main/unitTest/androidTest Kotlin 컴파일을 통과했다. 음성 전용 PATCH와 타 슬롯 보존, 음성 삭제 후 재진입 및 복원한 음성 편집의 저장을 회귀 테스트로 확인했다. 실기기 녹음·서버 왕복 QA와 BE#277 배포 게이트는 남아 있다.
Reactions are currently unavailable
Activity
test(afternote): 평탄화된 패키지로 추모 음성 스크린샷 골든 경로를 옮긴다 (#1734)
fix: adapt memorial audio to dirty-field PATCH (#1734)
fix: preserve restored audio edits above prefill guard (#1734)
merge: 음성 첨부를 최신 상세·Nav3·부분 PATCH 기반에 통합 (#1734)
1hyok commentedon Sep 11, 2026
시안에 없는 기능이라 닫습니다. 판정 근거는 PR #1625 의 닫는 코멘트에 있습니다. 본문의 "UI 자리는 시안 부재로 FE 확정" 은 시안 부재를 착수 사유로 읽은 오독이었습니다. FE 재량은 시안에 있는 화면의 세부까지이고, 시안에 없는 기능을 재량으로 만들지 않습니다.