Skip to content

[fix] #751 날짜 파싱 실패를 오늘 날짜로 덮지 않는다 - #908

Merged
Sadturtleman merged 7 commits into
developfrom
fix/751-date-parse-fallback
Aug 24, 2026
Merged

Sadturtleman merged 7 commits into
developfrom
fix/751-date-parse-fallback

Conversation

@Sadturtleman

Copy link
Copy Markdown
Collaborator

📌𝘐𝘴𝘴𝘶𝘦𝘴

Closes #751

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

이슈가 제시한 세 선택지 중 "그 항목을 목록에서 제외" 를 골랐습니다. 같은 파일의 Diary.toUi() 가 이미 그 규칙을 쓰고 있고, KDoc 에 근거까지 적혀 있어서입니다.

// MindRecordUiMapper.kt (기존)
/**
 * 날짜를 못 정하면 `null` 을 돌린다 — 호출부가 그 항목을 목록에서 뺀다.
 * 오늘 날짜로 폴백하지 않는다. … 그걸 오늘로 메우면 날짜 없는 항목이 오늘 칸에
 * 정상 기록처럼 앉아 필드 누락을 감춘다.
 */
fun Diary.toUi(): DailyDiary? { … }

규약은 이미 문서화돼 있었고 데일리질문 경로만 그것을 어기고 있었습니다. 새 정책을 만든 게 아니라 갈라진 쪽을 맞춘 것입니다.

두 곳을 함께 고쳤습니다.

경로 영향 화면
MindRecordUiMapper.DailyQuestionDomain.toUi() 데일리질문 목록 · 임시저장 목록
WeeklyReportViewModel.WeeklyReportDailyQuestion.toUi() 주간리포트 HISTORY 카드

이슈가 요구한 로그도 실패 지점에 남겼습니다 (Log.w).

🧪 검증 — 수정 전 실패 · 수정 후 통과

✔ 날짜를 해석할 수 없으면 오늘로 메우지 않고 항목을 버린다
✔ 빈 날짜도 오늘로 메우지 않는다
✔ 요일이 붙은 서버 형식은 그대로 해석한다      ← "2026.07.29 수"
✔ ISO 형식도 해석한다

오늘 폴백으로 되돌리면 앞의 두 건이 FAILED 로 떨어지는 것까지 확인했습니다.

앱 실측 — 정상 데이터가 그대로 보이는지도 확인했습니다.

데일리 질문 | 2026.08.23 | 일 | 타임머신이 있다면 … | 날짜 표시 시연

💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴

  • 검증: :feature:mindrecord:presentation:testDebugUnitTest + ktlintCheck + :app:assembleDebug BUILD SUCCESSFUL.
  • Robolectric 을 이 모듈에 추가했습니다 — 매퍼가 android.util.Log 를 타서 순수 JVM 테스트로는 돌지 않습니다. fix(mindrecord): 주간리포트 요약 문구 공백 소실 — '이번 주,이름님은N일의…'로 붙어 표시 #732 브랜치도 같은 의존을 추가하므로, 두 PR 이 함께 들어가면 build.gradle.kts 에서 같은 줄이 겹칠 수 있습니다(충돌 시 한쪽만 남기면 됩니다).
  • 항목을 버리는 선택의 대가: 날짜가 깨진 답변은 목록에서 보이지 않게 됩니다. "틀린 날짜로 정상처럼 표시" 보다 낫다고 판단했지만, 내용을 살리고 날짜 자리만 비우는 쪽이 낫다고 보시면 DailyQuestion.date 를 nullable 로 바꾸는 방향으로 다시 잡겠습니다.

`parseLocalDateOrNull(raw) ?: LocalDate.now()` 라, 서버가 형식을 바꾸면 지난 주
답변이 오늘 날짜로 표시됐다. 네트워크는 성공했고 값만 못 읽은 상황인데 화면에는
틀린 날짜가 정상처럼 앉고, 로그도 남지 않아 제보를 받아도 재현 지점을 찾을 수 없다.

같은 파일의 `Diary.toUi()` 가 이미 쓰는 규칙을 따른다 — 날짜를 못 정하면 `null` 을
돌리고 호출부가 그 항목을 뺀다. 그 KDoc 이 "오늘 날짜로 폴백하지 않는다" 를 이미
적어 두었는데 데일리질문 경로만 규약을 어기고 있었다.

실패 지점에 `Log.w` 를 남겨 추적할 수 있게 한다.

두 곳을 함께 고친다 — `MindRecordUiMapper.DailyQuestionDomain.toUi()`(목록·임시저장)와
`WeeklyReportViewModel.WeeklyReportDailyQuestion.toUi()`(HISTORY 카드).

Closes #751

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@OnlyReadOneBook OnlyReadOneBook left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

승인합니다. 지적 없습니다.

검증:

  • PR head 55105838에서 :feature:mindrecord:presentation:testDebugUnitTest 로컬 통과 — CI "Run Unit Tests"는 develop의 lint.yml 캐싱 정책테스트 모순으로 Kotlin 테스트 도달 전에 실패 중이라(전 PR 공통) 로컬로 실측했습니다
  • LocalDate.now() 폴백이 저장소에 정확히 2곳(MindRecordUiMapper·WeeklyReportViewModel)뿐이었고 둘 다 제거됨을 확인
  • toUi() nullable 전환의 호출부 전수 조사 — DailyQuestionListViewModel:140·DraftListViewModel:141·WeeklyReportViewModel:227 전부 mapNotNull 전환, DiaryScreen·DiaryWriteViewModel 무영향, 기존 MindRecordUiMapperTest는 diary 픽스처만 써서 안 깨짐
  • "항목 제외" 정책은 이슈가 제시한 선택지 중 하나이고 같은 파일 Diary.toUi()의 문서화된 기존 규약과 일치 — recordedDays 집계(원래 mapNotNull)와 HISTORY 카드 목록이 오히려 일관돼짐
  • createdAt이 non-null 필수 필드라 "필드 누락"은 역직렬화 실패(별개 경로)로 빠지고 이 코드는 형식 어긋남만 처리함을 확인 — 임시저장 증발 우려는 제한적이며 이슈가 승인한 정책
  • DailyQuestionDateFallbackTest는 폴백을 복원하면 확실히 실패하는 구성(assertNull)임을 확인. robolectric + isIncludeAndroidResources는 매퍼의 Log 실호출에 필요(timeletter 모듈 선례 동일)
  • "Review dependency changes" 실패는 base 스냅샷 0건 인프라 문제 — robolectric은 develop 카탈로그에 이미 있는 의존
  • 참고: #898과 build.gradle.kts 같은 줄을 각각 추가해 나중 머지 쪽에서 충돌 1회 예상(본문 공지대로 내용 동일, 한쪽만 남기면 됨)

OnlyReadOneBook and others added 6 commits August 23, 2026 16:40
# Conflicts:
#	feature/mindrecord/presentation/build.gradle.kts
#	feature/mindrecord/presentation/src/main/kotlin/com/afternote/feature/mindrecord/presentation/viewmodel/DraftListViewModel.kt
develop 이 이 브랜치와 별개로 들여온 두 지점이 #751 의 nullable toUi() 와 맞지 않았다.
MemorySpaceViewModel 의 데일리질문 카드는 일기 쪽과 같은 방식으로 제외하고,
DraftListDeleteTest 는 #769 가 늘린 loader 생성자에 맞춘다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	feature/mindrecord/presentation/src/test/kotlin/com/afternote/feature/mindrecord/presentation/viewmodel/DraftListDeleteTest.kt
# Conflicts:
#	feature/mindrecord/presentation/build.gradle.kts
@Sadturtleman
Sadturtleman merged commit a21d311 into develop Aug 24, 2026
13 checks passed
@Sadturtleman
Sadturtleman deleted the fix/751-date-parse-fallback branch August 24, 2026 08:13
@github-actions

Copy link
Copy Markdown
Contributor

🚀 QA 배포 권장

QA 포인트

이 판단은 배포를 자동 실행하지 않습니다. deploy일 때 Release Distribution을 수동 실행하세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(mindrecord): 주간리포트 데일리질문 날짜 파싱 실패가 오늘 날짜로 무음 폴백 — 틀린 날짜를 정상처럼 표시

2 participants