Skip to content

fix(mindrecord): 기록일수를 일기만으로 세지 않는다 - #946

Merged
Sadturtleman merged 3 commits into
developfrom
fix/590-recorded-days-nondiary
Aug 24, 2026
Merged

Sadturtleman merged 3 commits into
developfrom
fix/590-recorded-days-nondiary

Conversation

@Sadturtleman

@Sadturtleman Sadturtleman commented Aug 23, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #590

이슈가 "미대조" 로 남겨 둔 서버 응답 대조를 먼저 하고, 그 결과로 수정 범위를 정했습니다.
대조 전문은 이슈 코멘트에 있습니다.

⚠️ 기획 변경 반영 — 깊은 생각이 완전히 제거되기로 하면서 집계 규칙을 한 번 더 좁혔습니다.
처음 올린 버전은 «종류를 가리지 않고 센다» 였으나, 지금은 깊은 생각만 제외하고 센다 입니다.

대조 결론

week[] 는 레코드 배열이 아니라 날짜 배열이다. 하루 1개(최대 7개)만 실리고, 같은 날 일기가 여러 건이면 가장 큰 diaryId 하나만 남는다. 일기가 없는 날은 DAILY_QUESTION·DEEP_THOUGHT 가 실린다.

만든 상태 상단 카운트 week[]
일기 1건 일기 1 [{day:23, type:"DIARY", emotion:"HAPPY"}]
+ 같은 날 일기 1건 더 일기 2 여전히 1개
일기 없이 데일리질문만 데일리질문 1 [{day:23, type:"DAILY_QUESTION"}]

그래서 diaryAmount(레코드 수)와 week[](날짜 수)는 단위가 달라 나란히 비교할 값이 아니고, diaryAmount ≥ 1 인데 그 날이 week[] 에 없는 상태는 재현되지 않았다. QA 15번의 "일기 1 … 0일" 은 #563·#524 로 이미 해소된 것으로 보인다.

대조 중 찾은 결함

countRecordedDays 가 week[] 에서 isDiary 인 날만 세고 있었다.

val diaryDates = aggregateWeekRecordsByDate(monday, week)
    .filterValues { it.isDiary }   // ← 일기가 아닌 원소가 여기서 버려진다
    .keys

문구가 세는 것은 "일기를 쓴 날" 이 아니라 "마음을 기록한 날" 이다.

수정 — 종류로 거르되, 기준을 도메인으로 올린다

일기만 세던 것을 고치되 깊은 생각은 제외한다. 기획에서 제거된 기능이라 서버가 week[] 에 계속 실어 보내도 앱은 없는 것으로 다룬다.

종류 판단은 화면이 아니라 매퍼가 한다 — 와이어의 type 문자열 해석이 presentation 으로 새지 않도록.

// data/mapper
countsAsRecord = WEEK_RECORD_TYPES_NOT_COUNTED.none { it.equals(type, ignoreCase = true) }

// presentation
val recordDates = aggregateWeekRecordsByDate(monday, week)
    .filterValues { it.countsAsRecord }
    .keys

isDiary 는 달력 점 표시에만 계속 쓴다 — 표시 규칙은 그대로다.

테스트

WeeklyReportRecordedDaysTest 12 → 17개, 모듈 전체 통과.

  • 일기가 아닌 기록도 기록일로 센다 (원래 결함)
  • 깊은 생각만 있는 날은 세지 않는다 (기획 반영)
  • 같은 날에 깊은 생각과 일기가 함께 있으면 센다 — 제외 대상은 "깊은 생각뿐인 날" 이지 그 날짜 자체가 아니다
  • week 의 비일기 기록과 같은 날 데일리질문은 1일로 접힌다 (이중 계산 없음)
  • 종류를 가려도 달력 점은 여전히 일기만 찍는다 (표시 규칙 회귀 가드)

회귀 방향 고정 확인

깊은 생각 제외를 되돌리면 실패한다.

✗ 깊은 생각만 있는 날은 세지 않는다 | expected:<0> but was:<1>

시연

처음 올릴 때는 «깊은 생각만 있는 주» 를 만들어 0일 → 1일 을 확인했었다. 그 시나리오는 이제 의도적으로 0일이 맞다. 남는 사용자 영향은 «데일리질문만 있는 날» 인데, 그 날짜는 daily-question[] 로도 복구되므로 화면 수치가 달라지지 않는다 — 이 PR 의 값은 집계 기준을 종류로 명시해 둔 것과 깊은 생각 유입을 막는 데 있다.

서버 쪽에 남는 것

week[] 가 하루 1개로 접히는 규칙은 명세에 없다. 같은 날 일기 2건 중 하나만 실리는 것이 의도인지, 그때 어느 원소가 남는지(현재는 가장 큰 diaryId)를 확정해 두면 좋겠다 (Afternote-BE#131).

주간리포트 요약의 "N일의 마음을 기록하셨네요" 가 `week[]` 에서 `isDiary` 인 날만 세고
있었다. 실서버 대조(2026-08-23) 결과 `week[]` 는 일기 외에 `DAILY_QUESTION`·
`DEEP_THOUGHT` 원소도 싣는다. 데일리질문만 있는 날은 `daily-question[]` 로 되살아났지만
깊은 생각만 있는 날은 어디에서도 복구되지 않아, 기록이 있는데도 "0일" 이 나왔다.

문구가 세는 것은 "일기를 쓴 날" 이 아니라 "마음을 기록한 날" 이므로 종류를 가리지 않고
날짜 단위로 센다. `isDiary` 는 달력 점 표시에만 계속 쓴다.

Closes #590

@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.

승인합니다. 비차단 1건 참고해 주세요.

  1. [normal] "깊은 생각만 있는 주" 는 이제 일수는 맞지만, 상단 카운트는 여전히 그 기록을 안 보여줍니다 — 시안은 3열입니다.
    • 시안 700-35071의 상단 카운트는 데일리 질문·일기·깊은 생각 3열이고, 서버도 이미 deepThoughtAmount 를 내려줍니다(오늘 실측 응답에서 확인). 이 PR 반영 후 "깊은 생각만 1건" 화면은 데일리 질문 0 · 일기 0 + "1일의 마음" 조합이라(아래 실측 스크린샷), #590 의 원래 증상이던 카운트↔일수 불일치가 시각적으로는 한 갈래 남습니다.
    • FE 에는 깊은 생각 개념 자체가 아직 없어(MindRecordCategory 는 DAILY_QUESTION·DIARY·WEEKLY_REPORT 3값, WeeklyReportDto 에 deepThoughtAmount 없음) 이 PR 범위(집계 함수)를 한참 벗어납니다 — 후속 이슈 분리를 권합니다.

검증:

  • exact-HEAD(ef21fe7) CI 전부 green + 로컬 모듈 테스트 25개 · :app:compileDebugUnitTestKotlin 통과

  • 실기동 QA (실서버 + 에뮬레이터 Pixel_7_Claude_QA, QA823 계정) — 본문 시연과 같은 서버 상태를 재구성해 수정 전·후를 같은 데이터로 실측했습니다:

    • 상태: week=[{"day":23,"type":"DEEP_THOUGHT","emotion":null}], daily-question=[] — 본문 대조표(날짜당 1원소·비일기 타입 포함)와 오늘 실측도 일치
    • 946 미포함 빌드(#937 head): "0일의 마음을 기록하셨네요" — 결함 재현
    • 이 PR 빌드: "1일의 마음을 기록하셨네요" — 수정 확인 (아래)
    • 같은 화면에서 달력 23일 칸은 점 없는 숫자 — isDiary 달력 점 규칙 유지도 화면으로 확인
    • 테스트 데이터(깊은 생각·카테고리)는 삭제 완료(week=[] 복귀 확인)
    깊은 생각만 있는 주 — 1일 표기
  • aggregateWeekRecordsByDate 의 일자 매칭·주 범위 밖 제외가 keys 에 그대로 적용되므로 종류 필터 제거로 유령 날짜가 유입될 경로 없음, isDiary 소비처 전수 확인(잔존은 달력 점 mapWeekDays 뿐)

  • 시안 문구 취지 대조: 요약이 세는 대상이 "N일의 마음" 이라 종류 불문 날짜 집계가 문구·시안 취지와 정합

  • #937 과 같은 패키지지만 merge-tree 실측 충돌 없음

주간리포트 요약의 "N일의 마음을 기록하셨네요" 가 week[] 에서 isDiary 인 날만 세고
있었다. week[] 는 일기 외 종류도 싣는데, 문구가 세는 것은 "일기를 쓴 날" 이 아니라
"마음을 기록한 날" 이다.

다만 깊은 생각은 제외한다 — 기획에서 제거된 기능이라 서버가 week[] 에 계속 실어
보내도 앱은 없는 것으로 다룬다. 종류 판단은 매퍼가 countsAsRecord 로 접어 도메인에
올리고, 집계는 그 값만 본다. isDiary 는 달력 점 표시에만 계속 쓴다.

Closes #590
@Sadturtleman Sadturtleman changed the title fix(mindrecord): 기록일수를 기록 종류로 거르지 않는다 — 깊은 생각만 있는 날이 0일로 샌다 fix(mindrecord): 기록일수를 일기만으로 세지 않는다 Aug 24, 2026
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): 주간리포트 상단 카운트와 요약 기록일수 불일치 — diaryAmount 는 1인데 week[] 에 미포함

2 participants