Skip to content

feat(reports): 회의록 목록 페이지네이션 및 캐시 도입 - #37

Merged
yuchem2 merged 11 commits into
developfrom
CNV-52
Sep 3, 2026
Merged

yuchem2 merged 11 commits into
developfrom
CNV-52

Conversation

@yuchem2

@yuchem2 yuchem2 commented Sep 3, 2026 •

Copy link
Copy Markdown
Member

회의록 목록에 전통적인 방식의 페이지네이션을 추가하고, 목록 응답을 클라이언트 캐시를 도입하여 1시간동안 캐시한다. 이를 통해 뒤로가기 등의 작업으로 목록 api 요청을 다시 재요청하는 등의 행위를 줄인다. 새로고침 시 캐시를 무효화하여 변경사항을 즉시 확인할 수 있도록 돕는다.

yuchem2 and others added 11 commits September 3, 2026 17:56
page/size/sort 쿼리와 페이지 메타를 실은 목록 응답, 조회 조건을 통째로 나르는
ReportListCriteria·findPage 계약, 목록 페이저 렌더를 spec으로 먼저 고정한다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
GET /reports가 page/size/sort를 받아 items와 페이지 메타(number·size·
totalItems·totalPages)를 함께 돌려준다.

조회 조건은 ReportListCriteria 하나로 묶어 Repository.findPage까지 그대로
흐르게 했다. 정렬은 이름 있는 프리셋(latest)이라 축이 늘어나면
REPORT_SORT_OPTIONS와 REPORT_SORT_SPECS에만 더하면 되고, 검색이 붙으면
criteria에 조건을 더해 같은 경로로 filter를 만든다.

프론트는 ViewModel이 현재 페이지를 들고 목록 하단에 페이저를 그린다.
정적 export라 페이지 번호는 URL이 아니라 컴포넌트 상태로만 둔다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
?page= 쿼리를 읽어 조회하고, 페이지 이동은 URL을 바꾸는 계약을 spec으로
먼저 고정한다. 쿼리 값이 정수가 아니면 첫 페이지로 본다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
ViewModel이 ?page= 쿼리를 읽어 조회하고 페이지 이동은 router.push로 URL을
바꾼다. 새로고침·뒤로가기·링크 공유가 그대로 살아난다. 첫 페이지는 쿼리 없이
/reports로 둔다.

useSearchParams가 정적 export에서 Suspense 경계를 요구하므로 목록 본문을
ReportListPageClient로 떼어내고 page.tsx가 껍데기와 경계를 갖는다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
기본값 적용·page/size/sort → criteria 변환·빈 페이지 메타를 유닛으로 덮는다.
지금까지 이 경로는 pnpm test에 포함되지 않는 e2e로만 확인됐다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
같은 조건의 재요청을 TTL 동안 캐시가 흡수하고, 아직 끝나지 않은 같은 요청은
하나로 합치며, 실패는 캐시하지 않는 계약을 spec으로 먼저 고정한다.
"다시 시도"는 캐시를 우회한다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
회의록은 회의가 끝나는 순간에만 바뀌므로 같은 조건의 목록 요청을 TTL 1시간
동안 클라이언트에서 흡수한다. 캐시는 결과가 아니라 Promise를 담아 아직 끝나지
않은 같은 요청도 하나로 합치고, 실패한 요청은 남기지 않는다.

"다시 시도"는 캐시를 버리고 다시 받아온다. 그 사이 새로 끝난 회의록은 다시
시도나 새로고침으로 보인다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
hover 배경이 글자에 바로 붙지 않도록 항목 안쪽 좌우 여백을 키우고,
배경과 어긋나 보이던 항목 사이 구분선을 걷어냈다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
구분선은 li에 둬서 hover 배경이 선을 덮지 않는다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YSE2AjYBMmEAdjMjaqCUYu
@yuchem2 yuchem2 self-assigned this Sep 3, 2026
@notion-workspace

Copy link
Copy Markdown

@yuchem2
yuchem2 merged commit 149ab97 into develop Sep 3, 2026
2 checks passed
@yuchem2
yuchem2 deleted the CNV-52 branch September 3, 2026 09:48
@yuchem2 yuchem2 mentioned this pull request Sep 3, 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.

1 participant