Skip to content

fix(mindrecord): 주차 드롭다운 선택지를 1년으로 넓히고 메뉴를 5개 높이로 묶는다 - #937

Merged
Sadturtleman merged 5 commits into
developfrom
fix/729-week-dropdown-scroll
Aug 24, 2026
Merged

Sadturtleman merged 5 commits into
developfrom
fix/729-week-dropdown-scroll

Conversation

@Sadturtleman

Copy link
Copy Markdown
Collaborator

Closes #729

무엇이 문제였나

WEEK_OPTION_COUNT = 5 는 "한 화면에 보이는 항목 수" 를 그대로 "선택지 개수" 로
쓴 값이었다. 두 개념이 붙어 있어서 선택지가 5개에서 끝났고, 더 내려갈 항목이 없으니
시안이 표현한 세로 스크롤도 나타나지 않았다.

두 값을 분리했다.

종전 이후 정하는 곳
선택 가능한 범위 5주 52주 (1년) WEEK_OPTION_COUNT
한 화면 가시 항목 5개 (범위와 동일) 5개 DropdownMenu 의 heightIn(max = 48dp × 5 + 16dp)

DropdownMenu 의 내용은 이미 세로 스크롤이라, 높이만 묶으면 나머지 47개가 스크롤로
넘어간다. 항목 높이는 Material3 기본 최소 높이와 같은 48.dp 로 못 박아, 가시 항목
수가 문구 길이에 따라 흔들리지 않게 했다.

범위를 52주로 정한 근거

명세·시안 어디에도 "과거 몇 주까지" 가 없다. 계정 생성 주까지로 좁히는 쪽이 가장
정확하지만 서버에 가입일이 없다 — GET /users/me 는 이름·이메일·전화·프로필만 준다.

{"data":{"name":"adamtia","email":"...","phone":null,"profileImageUrl":null}}

기록이 없는 주를 골라도 GET /mind-record 는 0 건으로 정상 응답하므로 빈 주차를
보여주는 것 자체는 안전하다. 추측으로 진행한 항목이라 docs/qa/assumptions.md (#897) 에
뒤집는 방법과 함께 적어 뒀다 — 가입일 API 가 생기면 buildWeekOptions(today, count) 의
count 만 가입 주까지의 주 수로 계산해 넘기면 되고, 메뉴 높이는 이 값과 무관하다.

구조 변경

buildWeekOptions 와 상수를 WeeklyReportViewModel 의 private companion 에서
WeeklyReportWeekOptions.kt 로 옮겼다. 같은 패키지의 WeeklyReportRecordedDays.kt 가
이미 쓰는 방식이라, ViewModel·Hilt 없이 순수 함수로 직접 검증할 수 있다.

시연 (에뮬레이터 + 실서버)

1. 열린 메뉴는 여전히 5개에서 잘린다 — 시안대로.

보이는 메뉴 항목: 5
   8월 3주차 리포트 (y 671~732)
   8월 2주차 리포트 (y 797~858)
   8월 1주차 리포트 (y 923~984)
   7월 4주차 리포트 (y 1049~1110)
   7월 3주차 리포트 (y 1175~1236)

2. 메뉴 안에서 스크롤된다 — 종전에는 항목이 5개뿐이라 이 동작 자체가 불가능했다.

스크롤 1 → 7월 3주차 / 7월 2주차 / 7월 1주차 / 6월 5주차 / 6월 4주차 / 6월 3주차
스크롤 2 → 6월 3주차 / 6월 2주차 / 6월 1주차 / 5월 4주차 / 5월 3주차
스크롤 3 → 5월 3주차 / 5월 2주차 / 5월 1주차 / 4월 4주차 / 4월 3주차
스크롤 4 → 4월 3주차 / 4월 2주차 / 4월 1주차 / 3월 5주차 / 3월 4주차 / 3월 3주차

3. 스크롤 뒤 고른 주차로 재조회되고 선택 상태가 갱신된다.

GET https://afternote.kro.kr/api/v1/mind-record?date=2026-03-16
화면: WEEKLY SUMMARY | 3월 3주차 리포트 | 2026.03.16. - 2026.03.22. | 0 데일리 질문 | 0 일기

4. 최하단까지 스크롤해 고른 주차도 동일. 2026-08-17 기준 51주 전 = 2025-08-25.

GET https://afternote.kro.kr/api/v1/mind-record?date=2025-08-25
화면: WEEKLY SUMMARY | 8월 4주차 리포트 | 2025.08.25. - 2025.08.31.

테스트

:feature:mindrecord:presentation 29개 통과 (기존 22 → 29).

WeeklyReportWeekOptionsTest (순수 JUnit)

  • 선택지가 가시 항목 수(5)를 넘는다 / 52개다
  • 이번 주 월요일부터 과거로 최신순, 전부 월요일
  • 최하단 선택지가 1년 전 주다
  • 월요일 당일에 들어와도 그 주가 첫 선택지다

WeeklyReportWeekMenuTest (Robolectric + Compose UI test) — 실제로 메뉴를 열고 스크롤한다

  • 6번째 항목까지 스크롤해 닿는다
  • 스크롤해서 최하단 주차를 고르면 그 월요일이 onWeekSelect 로 전달된다
  • 이미 보고 있는 주를 다시 고르면 재조회하지 않는다

회귀 방향 고정 확인

WEEK_OPTION_COUNT 를 5 로 되돌리면 4개가 실패한다.

✗ 선택지는 한 화면 가시 항목 수보다 많다  | 선택지가 가시 항목 수(5)를 넘어야 스크롤이 생긴다
✗ 열린 메뉴에 5개를 넘는 선택지가 실린다  | IndexOutOfBoundsException: Index 5 out of bounds for length 5
✗ 스크롤해서 최하단 주차를 고르면 ...     | expected:<2025-08-25> but was:<2026-07-20>
✗ 최하단 선택지는 1년 전 주다             | expected:<2025-08-25> but was:<2026-07-20>

빌드 설정 변경

:feature:mindrecord:presentation 에 Compose UI 테스트를 JVM 에서 돌리기 위한 의존성을
추가했다 (robolectric, androidx-compose-ui-test-junit4, ui-test-manifest) — 열린
메뉴의 스크롤·최하단 선택은 실제로 렌더해야 검증되기 때문이다. robolectric 은
#898(fix/732-weekly-summary-spacing)도 같은 모듈에 추가하므로 머지 순서에 따라
build.gradle.kts 충돌이 날 수 있다.

남는 것

#269 의 QA 체크리스트가 기대값을 현재 구현값인 "과거 5주" 로 적어 둔 것은 그대로 남는다.
#269 이 별도 이슈라 이 PR 에서는 건드리지 않았다.

주차 드롭다운이 이번 주 포함 5개로 끝나, 시안(node 700-35071)이 표현한 추가 과거
리포트와 세로 스크롤을 쓸 수 없었다. 원인은 "한 화면에 보이는 항목 수" 를 그대로
선택지 개수(`WEEK_OPTION_COUNT = 5`)로 쓴 것이다 — 5개뿐이라 더 내려갈 항목이 없어
스크롤도 나타나지 않았다.

두 값을 분리했다. 선택 가능한 범위는 `WEEK_OPTION_COUNT = 52`(1년)로 넓히고, 가시
항목 수는 `DropdownMenu` 의 `heightIn(max = 항목 5개 + 여백)` 이 정한다. 메뉴 내용은
이미 세로 스크롤이라 높이만 묶으면 나머지가 스크롤로 넘어간다.

`buildWeekOptions` 와 상수는 `WeeklyReportWeekOptions.kt` 로 옮겨, 같은 패키지의
`WeeklyReportRecordedDays.kt` 처럼 ViewModel 없이 직접 검증할 수 있게 했다.

Closes #729

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

승인합니다. [normal] 1건(최하단 작년 주차의 연도 없는 라벨 — WeeklyReportWeekOptions.kt:16)과 시안 대조 재량 기록(스크롤바 인디케이터·메뉴 폭·항목 높이 — WeeklyReportReviewCard.kt:132)은 해당 라인의 인라인 스레드로 남겼습니다.

검증:

  • exact-HEAD(98ac361) CI 전부 green + 로컬 :feature:mindrecord:presentation:testDebugUnitTest(29개 전부 통과) · :app:compileDebugUnitTestKotlin 통과

  • 실기동 QA (에뮬레이터 Pixel_7_Claude_QA + 실서버, QA823 계정):

    • 열린 메뉴 완전 노출 5개, 6번째부터는 스크롤로만 도달 — 시안(노드 700-35071 직접 렌더·메타데이터 실측)과 일치. 선택 항목만 진한 색(0.9/0.3 알파)도 일치
    • 메뉴 내부 세로 스크롤로 최하단 도달(2025년 9월→8월 구간), 최하단 "8월 4주차 리포트" 선택 → 헤더·범위 "2025.08.25. - 2025.08.31." 갱신·재조회, 기록 없는 주 0건 정상 렌더
    열린 메뉴(5개) 최하단 스크롤 최하단 선택 결과
    열린 메뉴 5개 최하단 2025년 구간 2025.08.25 주 선택
  • WEEK_OPTION_COUNT=52 재량 가정이 #897 의 docs/qa/assumptions.md 에 뒤집는 방법과 함께 실재하는 것을 확인

  • buildWeekOptions 파일 이동은 동작 등가(호출부 diff 대조, 기본값 count = WEEK_OPTION_COUNT 로 호환), WeekMenuMaxHeight 의 상하 여백 16dp 가정은 M3 DropdownMenuVerticalPadding(8dp×2)과 일치

  • #946 과 merge-tree 실측 충돌 없음

참고: 본문 예고대로 #898(아직 open)과 같은 모듈 build.gradle.kts 에 robolectric 계열을 각각 추가하므로, 늦게 머지되는 쪽에서 충돌 해소가 필요합니다.

* 서버에 가입일이 없어(`GET /users/me` 는 이름·이메일·전화·프로필만 준다) 계정 생성 주까지로
* 좁힐 수 없다. 기록이 없는 주를 골라도 리포트는 0 건으로 정상 응답하므로 1년을 상한으로 뒀다.
*/
internal const val WEEK_OPTION_COUNT = 52

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.

[normal] 최하단 구간 라벨에 연도가 없어 작년 주차가 올해 것처럼 읽힙니다.

범위가 1년이 되면서 메뉴 하단은 2025년 8·9월 구간인데 라벨 포맷(%1$d월 %2$d주차 리포트)에 연도가 없어, 오늘 기준 최하단 "8월 4주차 리포트"(2025-08-25)가 열린 메뉴 안에서는 이번 달의 다른 주차처럼 읽힙니다(상단은 "8월 3주차"). 연도는 선택한 뒤 dateRange("2025.08.25. - 2025.08.31.")로만 드러납니다.

라벨 중복은 없습니다 — 52주 창에서 달 이름이 겹치는 건 상·하단의 같은 달뿐이고, 하단(작년) 주차 인덱스는 항상 상단(올해) 같은 달의 최대 인덱스보다 큽니다(52주=364일이라 최하단이 같은 달 8~9일 뒤 날짜로 떨어짐). 에뮬레이터 실측도 상단 8월 1·2·3주차 ↔ 하단 8월 4주차로 분리돼 나왔습니다.

시안 라벨 포맷 자체가 연도 없는 형태라 미확정 영역이고, FE 재량 규약대로 비차단입니다 — 작년 구간에만 연도를 병기할지는 후속 판단거리로 남깁니다.

expanded = expanded,
onDismissRequest = { expanded = false },
containerColor = Color.White,
modifier = Modifier.heightIn(max = WeekMenuMaxHeight),

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.

시안 대조 재량 기록 (조치 불요, 노드 700-35071 직접 렌더·메타데이터 실측):

  • 시안 우측의 세로 스크롤바 인디케이터는 미구현 — Compose DropdownMenu 에 네이티브 스크롤바가 없고, 위 주석의 "가시 항목 수보다 선택지가 많다는 표현" 해석에 동의합니다.
  • 시안 메뉴는 카드 전폭(350pt)·항목 54pt, 구현은 내용 폭·48dp — 폭은 이 PR 이전부터의 편차(메뉴 폭 미지정)라 범위 밖이고, 항목 높이는 M3 기본과 정합한 재량으로 봅니다.

OnlyReadOneBook and others added 4 commits August 24, 2026 14:48
# Conflicts:
#	feature/mindrecord/presentation/build.gradle.kts
develop 에서 넘어온 컴파일 깨짐(#1013 과 같은 건) 을 이 브랜치에서도 해소한다.

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
@Sadturtleman
Sadturtleman merged commit 2b0a1be into develop Aug 24, 2026
11 of 12 checks passed
@Sadturtleman
Sadturtleman deleted the fix/729-week-dropdown-scroll branch August 24, 2026 08:03
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): 주간리포트 주차 드롭다운이 5개로 끝나 시안의 추가 이력·스크롤 미노출

2 participants