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
모든 기록 내려받기 data 계층 미구현 — 스텁이 성공만 반환해 사용자에게 성공으로 보임 #589
"모든 기록 내려받기" 의 data 계층이 스텁이라 실제로는 아무 일도 하지 않습니다. 화면·ViewModel·도메인 인터페이스는 모두 연결돼 있어 사용자에게는 성공한 것처럼 보입니다.
ReceiverRepositoryImpl
downloadReceivedExport() → 서버 호출 없이 빈 ReceivedExportBundle() 을 success 로 반환
saveReceivedExportToFile(bundle) → 파일 쓰기 없이 Unit 을 success 로 반환
호출부는 두 곳입니다 — 수신자 홈(ReceiverHomeViewModel), 내려받기 화면(ReceiverDownloadAllViewModel).
선행 조건: 서버에 해당 엔드포인트가 없습니다. BE 실측(release 브랜치) 결과 수신자 컨트롤러는 ReceivedController(목록 조회 4개)와 ReceiverAuthController 뿐입니다. Afternote-BE #90 으로 요청해 둔 상태이고, 응답 형태(단일 JSON vs zip)와 포함 범위가 확정돼야 구현 가능합니다.
📌 Child Issue(Optional)
No response
📍 Note (Optional)
현재 ReceivedExportBundle(payloadJson: String = "{}")는 확정 서버 계약이 아닙니다. JSON 또는 zip 선택과 FE 모델 재정의를 미리 작업으로 예약하지 않습니다. 이 이슈는 BE#90의 응답 범위·형태 및 저장 위치 계약을 확인하고 현재 스텁과의 차이를 기록하는 범위로 둡니다. 실제 다운로드·저장 구현은 확정 뒤 필요한 범위만 정합니다.
#544 에서 이 두 단계에 실패 계측(RECEIVED_EXPORT_DOWNLOAD·RECEIVED_EXPORT_SAVE)을 넣어 뒀습니다. 스텁이 항상 성공을 반환하므로 지금은 발화하지 않고, 구현이 들어오는 시점부터 동작합니다.
저장 단계는 Android 저장소 권한·SAF 경로 결정이 필요합니다(앱 전용 저장소 vs 사용자 선택 위치).
changed the title [-]fix(afternote): 모든 기록 내려받기 data 계층 미구현 — 스텁이 성공만 반환해 사용자에게 성공으로 보임[/-][+]모든 기록 내려받기 data 계층 미구현 — 스텁이 성공만 반환해 사용자에게 성공으로 보임[/+]on Aug 28, 2026
본문의 「호출부는 두 곳 — 수신자 홈(ReceiverHomeViewModel), 내려받기 화면(ReceiverDownloadAllViewModel)」이 현행과 어긋난다. 살아 있는 호출부는 수신자 홈 하나뿐이다.
ReceiverDownloadAllViewModel 을 쓰는 화면(summary/ReceiverAfternoteScreen.kt 의 ReceiverAfterNoteEntry)은 레포 전체에서 호출부 0건이다. 수신자 애프터노트 목록 라우트(ReceiverRoute.AfternoteListRoute)가 세우는 것은 afternotelist/ReceiverAfternoteHomeEntry 로 다른 구현이고, 그 상태가 31ee4b6d0(수신자 흐름 :feature:receiver 이전) 이후 줄곧 유지돼 왔다.
BE#90 이 도착해 data 계층을 구현할 때 배선 대상이 한 곳으로 줄어든다는 뜻이다. 다만 「전체 내려받기 전용 화면」이 시안에 있는데 배선만 안 된 것이라면 반대로 그 화면을 살려야 하므로, 시안 대조를 포함한 처분 판정을 #1424 에서 다룬다. 이 이슈의 data 계층 구현 범위 자체는 그대로다.
PR #1629(브랜치 fix/589-export-fail-closed, 커밋 cda955b7f)가 2026-09-06 에 머지했다. Closes 대상은 #1726 이라 이 이슈는 열린 채 남았고, 타임라인에는 교차 참조로만 걸려 있다. 회귀는 feature/receiver/data/src/test/kotlin/com/afternote/feature/receiver/data/repositoryimpl/ReceiverRepositoryImplExportTest.kt 의 두 테스트가 고정한다.
사용자에게 보이는 것도 성공이 아니다. ReceiverHomeViewModel 의 toDownloadFailure 가 ExportNotSupported 를 ReceiverDownloadState.Failed(home_receiver_download_all_failed) 로, 저장 단계는 Failed(home_receiver_download_all_save_failed) 로 보내고 재시도 팝업은 주지 않는다.
따라서 이 이슈에 남은 범위는 "성공으로 보이는 것을 고치는 일" 이 아니라 실제 내려받기와 저장 구현 하나다. 제목도 그에 맞춰 바꾸는 편이 다음 착수자에게 정확하다.
2. 본문이 develop 실태와 어긋나는 항목
본문의 "downloadReceivedExport() 가 빈 ReceivedExportBundle() 을 success 로 반환": 위 :80 대로 실패를 반환한다.
본문의 "saveReceivedExportToFile(bundle) 이 파일 쓰기 없이 Unit 을 success 로 반환": :82-83 에서 같은 실패를 반환한다.
본문 Note 의 "feat(core): non-fatal 오류 계측 확대 — 홈·애프터노트 흐름의 handled 실패 기록 #544 계측은 스텁이 항상 성공을 반환하므로 발화하지 않는다": 사유가 바뀌었다. 이제 실패 경로를 타므로 ReceiverHomeViewModel.kt:230, :242 가 RECEIVED_EXPORT_DOWNLOAD 와 RECEIVED_EXPORT_SAVE 로 리포터를 호출하기는 한다. 기록되지 않는 이유는 feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/reporting/ReceiverFailureReporting.kt:54 가 ExportNotSupported 를 명시적으로 걸러 내기 때문이다(장애가 아니라 기능 상태라는 판단). 실제 구현이 들어와 다른 실패 타입이 생기는 시점부터 두 단계가 기록된다.
본문의 "BE 실측(release) 결과 ReceivedController(목록 조회 4개)": 조회가 아니라 생성이다. release 의 ReceivedController 4개는 전부 @PostMapping(/time-letters, /deep-thought, /diary, /daily-question)이다. ReceiverAuthController 는 16개다. 같은 오류가 Afternote-BE#90 본문에도 복사돼 있어 그쪽도 정정이 필요하다.
본문 자체는 고치지 않았다. 앞선 코멘트들도 본문을 남긴 채 코멘트로 정정해 왔고, 어긋남의 이력이 이 이슈의 기록 가치라서다.
3. 블로커 재확인
Afternote-BE#90 은 2026-09-13 현재 OPEN 이고 2026-08-08 이후 갱신이 없다. blocked_by 도 그대로 걸려 있다.
원격 트리 실조회 결과 export 또는 download 계열 엔드포인트는 두 브랜치 어디에도 없다.
main: ReceivedController(/api/v1/received, POST 4개), ReceivedRecordController(/api/v1/received-records, 13개), ReceiverInvitationController(/api/v1/receiver-invitations, 3개)
응답 형태가 단일 JSON 인지 zip 인지, 포함 범위가 어디까지인지도 미확정이라 구현 착수 조건은 아직 아니다.
4. main 에서 수신자 조회 구조가 바뀌었다
release 의 ReceiverAuthController 가 main 에는 없고, 수신자 조회가 /api/v1/received-records/{receiverId}/... 로 옮겨졌다. FE 는 아직 feature/receiver/data/src/main/kotlin/com/afternote/feature/receiver/data/service/ReceiverAfternoteApiService.kt:14, :18 에서 receiver-auth/after-notes 를 부른다. 이 이관 자체는 이 이슈 범위가 아니므로 사실만 적는다.
BE#90 에는 변수가 하나 는다. 전체 내려받기의 "전체" 가 계정 단위인지 record-box(receiverId) 단위인지가 main 구조에서는 먼저 정해져야 한다.
5. 지금 코드로 뗄 독립 범위는 없다
서버 계약 없이 할 수 있던 일은 #1726 으로 끝났다. ReceivedExportBundle(payloadJson) 은 확정 계약이 아니라 임시 형태라 지금 다듬을 값이 없고, 반대로 걷어내면 시안에 있는 버튼과 이미 배선된 소비처를 되살릴 때 다시 만들어야 한다. 저장 위치와 SAF 결정도 확인 팝업 이후 시안이 없어 FE 단독 결정 대상이 아니다(BE#90 코멘트에 남긴 시안 노드 1728-26376 기준으로 확인 팝업까지만 그려져 있다).
제목의 결함(스텁이 성공을 돌려줌)은 #1726 과 PR #1629 로 해결됐다. 지금 develop 은 내려받기를 ReceiverFailure.ExportNotSupported 실패로 돌려준다.
남은 범위(실제 다운로드와 저장, ReceivedExportBundle 재정의, #544 계측)는 무엇을 만들지가 정해지지 않았다. Afternote/Afternote-BE#90 의 응답 형태(JSON 인지 zip 인지), 포함 범위, 계정 단위인지 기록함 단위인지가 미정이고 BE 쪽 답이 없다. BE origin/main 7c961ec 에는 내려받기 엔드포인트가 없다. 기능을 둘지와 확인 뒤 흐름(진행, 완료, 실패, 저장 위치)도 시안이 없어 PM 결정 대상이다. 결정이 나면 남은 범위만 새로 연다.
Activity
OnlyReadOneBook commentedon Jul 30, 2026
코드 확증 (2026-07-30)
ReceiverRepositoryImpl의 두 메서드가 서버·파일 접근 없이 성공만 반환한다.열람 승인된 수신자 화면에서 "모든 기록 내려받기" 버튼이 실제로 노출되는 것을 확인했다(수신자 홈 요약 하단). 서버에는 내려받을 데이터가 실제로 있는 상태다 — 애프터노트 3건·일기 1건·타임레터 1건 전부 200 으로 조회된다.
BE 엔드포인트는 BE#90(수신자 받은 기록 전체 내려받기)으로 등록돼 있다.
같은 파일의
getReceivedAfterNotes(:56)·loadMindRecordsCount(:76)·loadTimeLettersCount(:78) 도 동일한 성공 stub 이라 수신자 홈 카운트가 전부 0 으로 뜬다 — #610.OnlyReadOneBook commentedon Jul 30, 2026
실기기 동작 — "성공으로 보인다" 가 아니라 아무 피드백도 없다 (2026-07-30)
버튼을 실제로 눌러 확인했다. 이슈 제목은 "스텁이 성공만 반환해 사용자에게 성공으로 보인다" 인데, 화면 동작은 그보다 한 단계 더 나쁘다.
성공 메시지조차 뜨지 않아 사용자는 요청이 접수된 것인지, 실패한 것인지, 어디에 저장됐는지 알 수 없다. 서버에는 내려받을 데이터가 실제로 있는 상태였다(애프터노트 3건·일기 1건·데일리질문 1건·타임레터 1건 전부 200).
ReceiverDownloadState는Confirming·InProgress·Idle을 갖고 있어 진행/완료 표시를 붙일 자리는 있다 — 현재는 stub 이 즉시 성공을 반환해InProgress가 사실상 스쳐 지나간다.[-]fix(afternote): 모든 기록 내려받기 data 계층 미구현 — 스텁이 성공만 반환해 사용자에게 성공으로 보임[/-][+]모든 기록 내려받기 data 계층 미구현 — 스텁이 성공만 반환해 사용자에게 성공으로 보임[/+]OnlyReadOneBook commentedon Aug 28, 2026
본문의 「호출부는 두 곳 — 수신자 홈(
ReceiverHomeViewModel), 내려받기 화면(ReceiverDownloadAllViewModel)」이 현행과 어긋난다. 살아 있는 호출부는 수신자 홈 하나뿐이다.ReceiverDownloadAllViewModel을 쓰는 화면(summary/ReceiverAfternoteScreen.kt의ReceiverAfterNoteEntry)은 레포 전체에서 호출부 0건이다. 수신자 애프터노트 목록 라우트(ReceiverRoute.AfternoteListRoute)가 세우는 것은afternotelist/ReceiverAfternoteHomeEntry로 다른 구현이고, 그 상태가31ee4b6d0(수신자 흐름:feature:receiver이전) 이후 줄곧 유지돼 왔다.BE#90 이 도착해 data 계층을 구현할 때 배선 대상이 한 곳으로 줄어든다는 뜻이다. 다만 「전체 내려받기 전용 화면」이 시안에 있는데 배선만 안 된 것이라면 반대로 그 화면을 살려야 하므로, 시안 대조를 포함한 처분 판정을 #1424 에서 다룬다. 이 이슈의 data 계층 구현 범위 자체는 그대로다.
OnlyReadOneBook commentedon Sep 2, 2026
«스텁이 성공을 돌려줘 성공으로 보인다»는 하위 결함을 #1726 로 분리했고 PR #1629 가 그 이슈를 Closes 합니다. 두 스텁이
ExportNotSupported로 실패해 기존 실패 안내가 뜨고, 이 갈래는 텔레메트리에서 제외됩니다.이 이슈에는 실제 다운로드·파일 저장 구현,
ReceivedExportBundle재정의, #544 계측 발화가 남고 전부 Afternote-BE#90 응답 계약 확정 뒤라blocked_by는 유지합니다.본문의 «호출부 두 곳» 중
ReceiverDownloadAllViewModel은 #1424 로 정리돼 현행 호출부는 수신자 홈 하나입니다.OnlyReadOneBook commentedon Sep 13, 2026
실측 재확인 (2026-09-13)
기준은
origin/develop7d87aa3f4와 Afternote-BE 원격 트리(main,release) 실조회다. 앞선 코멘트와 겹치는 부분은 줄 번호만 새로 박고, 나머지는 정정과 추가 사실이다.1. 제목이 말하는 증상은 develop 에서 닫혀 있다
feature/receiver/data/src/main/kotlin/com/afternote/feature/receiver/data/repositoryimpl/ReceiverRepositoryImpl.ktPR #1629(브랜치
fix/589-export-fail-closed, 커밋cda955b7f)가 2026-09-06 에 머지했다.Closes대상은 #1726 이라 이 이슈는 열린 채 남았고, 타임라인에는 교차 참조로만 걸려 있다. 회귀는feature/receiver/data/src/test/kotlin/com/afternote/feature/receiver/data/repositoryimpl/ReceiverRepositoryImplExportTest.kt의 두 테스트가 고정한다.사용자에게 보이는 것도 성공이 아니다.
ReceiverHomeViewModel의toDownloadFailure가ExportNotSupported를ReceiverDownloadState.Failed(home_receiver_download_all_failed)로, 저장 단계는Failed(home_receiver_download_all_save_failed)로 보내고 재시도 팝업은 주지 않는다.따라서 이 이슈에 남은 범위는 "성공으로 보이는 것을 고치는 일" 이 아니라 실제 내려받기와 저장 구현 하나다. 제목도 그에 맞춰 바꾸는 편이 다음 착수자에게 정확하다.
2. 본문이 develop 실태와 어긋나는 항목
downloadReceivedExport()가 빈ReceivedExportBundle()을 success 로 반환": 위:80대로 실패를 반환한다.saveReceivedExportToFile(bundle)이 파일 쓰기 없이Unit을 success 로 반환"::82-83에서 같은 실패를 반환한다.feature/home/presentation/src/main/kotlin/com/afternote/feature/home/presentation/receiver/ReceiverHomeViewModel.kt:227(다운로드)과:239(저장) 한 곳이다.ReceiverDownloadAllViewModel은 커밋7a355e215(수신자 summary 패키지 8파일이 도달 불가 — afternotelist 가 대체, 내려받기 전용 화면은 시안 대조 후 판정 #1424, PR refactor(receiver): 도달 불가한 summary 패키지 8파일 제거 — home 이 대체한 옛 수신자 홈 (#1424) #1428 / refactor(receiver): 도달 불가한 summary 패키지 8파일 제거 — home 이 대체한 옛 수신자 홈 (#1424) #1430)에서summary패키지째 지워져 develop 프로덕션 코드에 없다. 남은 흔적은 생성물인app/src/main/generated/baselineProfiles/baseline-prof.txt와startup-prof.txt의 Hilt 클래스 각 6줄(16269 부근)뿐이라 손댈 값이 없다.ReceiverHomeViewModel.kt:230,:242가RECEIVED_EXPORT_DOWNLOAD와RECEIVED_EXPORT_SAVE로 리포터를 호출하기는 한다. 기록되지 않는 이유는feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/reporting/ReceiverFailureReporting.kt:54가ExportNotSupported를 명시적으로 걸러 내기 때문이다(장애가 아니라 기능 상태라는 판단). 실제 구현이 들어와 다른 실패 타입이 생기는 시점부터 두 단계가 기록된다.ReceivedController(목록 조회 4개)": 조회가 아니라 생성이다. release 의ReceivedController4개는 전부@PostMapping(/time-letters,/deep-thought,/diary,/daily-question)이다.ReceiverAuthController는 16개다. 같은 오류가 Afternote-BE#90 본문에도 복사돼 있어 그쪽도 정정이 필요하다.본문 자체는 고치지 않았다. 앞선 코멘트들도 본문을 남긴 채 코멘트로 정정해 왔고, 어긋남의 이력이 이 이슈의 기록 가치라서다.
3. 블로커 재확인
Afternote-BE#90 은 2026-09-13 현재 OPEN 이고 2026-08-08 이후 갱신이 없다.
blocked_by도 그대로 걸려 있다.원격 트리 실조회 결과 export 또는 download 계열 엔드포인트는 두 브랜치 어디에도 없다.
main:ReceivedController(/api/v1/received, POST 4개),ReceivedRecordController(/api/v1/received-records, 13개),ReceiverInvitationController(/api/v1/receiver-invitations, 3개)release:ReceivedController(POST 4개),ReceiverAuthController(/api/v1/receiver-auth, 16개)응답 형태가 단일 JSON 인지 zip 인지, 포함 범위가 어디까지인지도 미확정이라 구현 착수 조건은 아직 아니다.
4. main 에서 수신자 조회 구조가 바뀌었다
release의ReceiverAuthController가main에는 없고, 수신자 조회가/api/v1/received-records/{receiverId}/...로 옮겨졌다. FE 는 아직feature/receiver/data/src/main/kotlin/com/afternote/feature/receiver/data/service/ReceiverAfternoteApiService.kt:14,:18에서receiver-auth/after-notes를 부른다. 이 이관 자체는 이 이슈 범위가 아니므로 사실만 적는다.BE#90 에는 변수가 하나 는다. 전체 내려받기의 "전체" 가 계정 단위인지 record-box(
receiverId) 단위인지가 main 구조에서는 먼저 정해져야 한다.5. 지금 코드로 뗄 독립 범위는 없다
서버 계약 없이 할 수 있던 일은 #1726 으로 끝났다.
ReceivedExportBundle(payloadJson)은 확정 계약이 아니라 임시 형태라 지금 다듬을 값이 없고, 반대로 걷어내면 시안에 있는 버튼과 이미 배선된 소비처를 되살릴 때 다시 만들어야 한다. 저장 위치와 SAF 결정도 확인 팝업 이후 시안이 없어 FE 단독 결정 대상이 아니다(BE#90 코멘트에 남긴 시안 노드 1728-26376 기준으로 확인 팝업까지만 그려져 있다).OnlyReadOneBook commentedon Sep 26, 2026
보류로 닫는다.
제목의 결함(스텁이 성공을 돌려줌)은 #1726 과 PR #1629 로 해결됐다. 지금 develop 은 내려받기를
ReceiverFailure.ExportNotSupported실패로 돌려준다.남은 범위(실제 다운로드와 저장,
ReceivedExportBundle재정의, #544 계측)는 무엇을 만들지가 정해지지 않았다. Afternote/Afternote-BE#90 의 응답 형태(JSON 인지 zip 인지), 포함 범위, 계정 단위인지 기록함 단위인지가 미정이고 BE 쪽 답이 없다. BEorigin/main7c961ec 에는 내려받기 엔드포인트가 없다. 기능을 둘지와 확인 뒤 흐름(진행, 완료, 실패, 저장 위치)도 시안이 없어 PM 결정 대상이다. 결정이 나면 남은 범위만 새로 연다.OnlyReadOneBook commentedon Sep 26, 2026
2026-09-26 정정. 위 코멘트의 「확인 뒤 흐름은 시안이 없어」는 틀렸다. 정리 Screen Design 의 최종 수신자 프로토타입 화면(4327:73596) 아래에 확인 팝업 뒤 흐름이 두 안으로 있다.
디자이너가 8월 2일 댓글(1867937771)에서 안드로이드 기본 공유 창을 제안한 것도 있어 셋 중 무엇으로 갈지가 미정이다. 보류 판정 자체는 그대로다. 받는 단위(보고 있는 발신자 한 명인지 전체인지)와 확인 뒤 화면은 오늘 PM 질문방에 올렸다.