Skip to content

[FEAT] 투두 메모 날짜별 수정 API 연동 - #288

Open
jjangminii wants to merge 3 commits into
developfrom
feat/web/287-per-date-memo-update-api
Open

[FEAT] 투두 메모 날짜별 수정 API 연동#288
jjangminii wants to merge 3 commits into
developfrom
feat/web/287-per-date-memo-update-api

Conversation

@jjangminii

Copy link
Copy Markdown
Contributor

ISSUE 🔗

close #287



What is this PR? 🔍

투두 메모 수정이 날짜에 상관없이 투두 전체를 덮어쓰는 범용 API를 타고 있던 것을, 백엔드가 새로 제공하는 날짜별 메모 전용 엔드포인트로 교체했습니다. 겸사겸사 4개 훅에 반복되던 쿼리 캐시 무효화 로직도 공유 훅으로 정리했습니다.

배경

  • 기존 구조: 메모 수정이 title/subtasks와 함께 PATCH /api/v1/todos/{todoId} 범용 수정 API에 묶여 나갔습니다.
  • 발생 문제: 백엔드가 이 API의 TodoUpdateRequest에서 memo 필드를 제거하면서, 반복 투두의 날짜별 메모 분리 요구사항(해당 date 인스턴스에만 저장, 없으면 규칙 메모로 폴백)을 범용 API로는 더 이상 처리할 수 없게 됐습니다.
  • 해결 방향: 백엔드가 새로 제공하는 PATCH /api/v1/todos/{todoId}/memo?date= 전용 엔드포인트를 연동하고, 메모 자동저장을 title/subtasks 저장과 분리했습니다.

투두 메모 API 연동

  • 변경 요약: pnpm gen:apiuseUpdateMemo 훅을 코드젠에 반영하고, 메모 수정만 담당하는 use-update-todo-memo-submit.ts를 새로 추가했습니다.
  • 이유: 메모 저장에 현재 조회 중인 date를 실어 보내야 날짜별 인스턴스에만 저장되는 백엔드 동작을 프론트에서 정확히 트리거할 수 있습니다.
  • 구현 방식: use-detail-todo-text-auto-save.ts에서 title/subtasks 시그니처와 memo 값을 각각 별도로 추적해, 2초 디바운스 시점에 변경된 것만 독립적으로 전송하도록 했습니다. 컨테이너(DetailTodoModalContainer.tsx)가 열려 있는 모달의 currentDate를 클로저로 잡아 updateMemo(memo) 호출에 실어 보냅니다.
  • 경계 · 제약: 메모는 생성 시에만 전체 날짜에 공유되고 이후 수정은 date 인스턴스에만 저장된다는 백엔드 의미론을 그대로 따랐습니다. 이 폴백 동작 자체는 백엔드 책임이라 프론트에서 별도 처리를 추가하지 않았습니다.

쿼리 캐시 무효화 정리

  • 변경 요약: 홈/투데이/상세/포커스 invalidate 호출이 use-update-todo-submit, use-delete-todo-submit, use-toggle-subtask-submit, 새로 추가한 use-update-todo-memo-submit 4곳에 반복되고 있어 hooks/todo/use-todo-query-invalidation.ts로 통합했습니다.
  • 이유: memo 훅을 추가하면서 동일한 5줄짜리 invalidate 블록이 4번째로 복사되는 상황이라, 코드 리뷰 과정에서 공유 훅으로 뽑는 게 낫다고 판단했습니다.
  • 구현 방식: useStatisticsQueryInvalidation과 동일한 패턴으로 invalidateHome/invalidateToday/invalidateTodoDetail/invalidateFocus를 개별 함수로 노출하고, 각 훅이 실제로 필요한 조합만 호출하도록 했습니다 (예: use-toggle-subtask-submit은 통계/포커스를 건드리지 않고, use-delete-todo-submit은 상세를 건드리지 않습니다). 무조건 5개 전부 무효화하는 단일 함수 대신 개별 함수로 만든 이유는 액션마다 실제로 영향받는 화면이 달라, 하나로 묶으면 불필요한 재요청이 생기기 때문입니다.



To Reviewers

메모 저장이 date 인스턴스 단위로 정확히 스코프되는지는 로그인 세션에서 직접 확인하지 못했습니다 (타입체크/린트만 통과 확인). 반복 투두에서 날짜별로 다른 메모를 저장·조회하는 시나리오를 리뷰 시 한 번 확인해주시면 좋겠습니다.

캐시 무효화 리팩토링은 이번 이슈 범위를 넘어 기존 파일 3개(use-update-todo-submit, use-delete-todo-submit, use-toggle-subtask-submit)까지 건드렸는데, 각 훅이 무효화하는 쿼리 키 조합은 리팩토링 전후로 동일하게 유지했습니다.



Screenshot 📷



Test Checklist ✔

  • pnpm check-types 통과
  • pnpm lint 통과
  • 반복 투두 날짜별 메모 저장/조회 시나리오 — 미실행: 로그인 세션 필요, 리뷰 시 확인 요청
  • pnpm build — 미실행

jjangminii and others added 3 commits September 14, 2026 01:37
- orval로 PATCH /api/v1/todos/{todoId}/memo 엔드포인트를 codegen에 반영했습니다
- 백엔드가 TodoUpdateRequest에서 memo 필드를 제거함에 따라 일반 투두 수정 요청에서 memo를 분리했습니다
- 메모 수정을 date 인스턴스에 스코프된 전용 엔드포인트로 호출하도록 use-update-todo-memo-submit 훅을 추가하고 자동저장 로직을 분리했습니다

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011a4CUkqSModZ8xjXsptKjv
- memo가 primitive라 ref로 최신값을 따로 추적할 필요가 없어 latestMemoRef와 임시 변수를 제거했습니다
- 훅이 반환하는 함수가 이제 memo도 같이 저장하므로 submitTextUpdate를 submitPendingUpdates로 이름을 바꿨습니다

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011a4CUkqSModZ8xjXsptKjv
- 홈/투데이/상세/포커스 invalidateQueries 호출이 update, delete, toggle-subtask, memo 4개 훅에 반복되고 있어 use-todo-query-invalidation.ts로 통합했습니다
- 각 훅은 useStatisticsQueryInvalidation처럼 필요한 invalidate 함수만 골라 쓰도록 했습니다 (액션마다 무효화 대상이 달라 필요한 것만 조합)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011a4CUkqSModZ8xjXsptKjv
@vercel

vercel Bot commented Sep 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
timo Ready Ready Preview Sep 13, 2026 5:47pm UTC

@coderabbitai

coderabbitai Bot commented Sep 13, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 2a512513-38a2-4d16-8890-7365edbae63d


Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

Timo Performance Report

Bundle Size — timo-web
라우트 크기 First Load JS
/[locale]/home 275.15 kB 🔴 480.97 kB
/[locale]/today 259.33 kB 🔴 465.14 kB
/[locale]/focus 221.77 kB 🔴 427.58 kB
/[locale]/settings 228.40 kB 🔴 434.21 kB
/[locale]/statistics 210.09 kB 🔴 415.91 kB
/[locale]/[...rest] 0 B 🟡 205.82 kB
/[locale]/login 281.73 kB 🔴 487.54 kB
/[locale]/oauth/calendar/callback 120.82 kB 🟡 326.64 kB
/[locale]/oauth/callback 120.48 kB 🟡 326.30 kB
/[locale]/onboarding 294.21 kB 🔴 500.02 kB
/[locale] 119.80 kB 🟡 325.62 kB
/[locale]/policy 120.77 kB 🟡 326.58 kB
/robots.txt/route 0 B 🟡 205.82 kB
/sitemap.xml/route 0 B 🟡 205.82 kB

공유 번들: 205.82 kB
🟢 < 200kB  |  🟡 < 350kB  |  🔴 ≥ 350kB (First Load JS · gzip)

Lighthouse — timo-web
URL Perf A11y LCP CLS TBT
/en/home 🔴 67 🟢 96 🔴 16.3s 🟢 0.000 🟡 330ms
/en/today 🔴 64 🟢 96 🔴 16.2s 🟢 0.000 🟡 431ms
/en/focus 🔴 66 🟢 96 🔴 16.1s 🟢 0.000 🟡 353ms
/en/statistics 🔴 64 🟢 96 🔴 16.0s 🟢 0.000 🟡 404ms

Perf ≥ 70 / A11y ≥ 85 목표
LCP 🟢 < 2.5s 🟡 < 4s 🔴 ≥ 4s  |  CLS 🟢 < 0.1 🟡 < 0.25 🔴 ≥ 0.25  |  TBT 🟢 < 200ms 🟡 < 600ms 🔴 ≥ 600ms

Image Optimization — timo-web
파일 크기 포맷 상태
favicon.png 27.84 kB PNG ⚠️ 🟢
images/google-calendar.png 36.20 kB PNG ⚠️ 🟢
images/google-logo.png 26.79 kB PNG ⚠️ 🟢
og.png 437.44 kB PNG ⚠️ 🟡

총 4개 · 528.28 kB  |  🟢 < 200KB  |  🟡 < 500KB  |  🔴 ≥ 500KB
⚠️ 4개 파일 WebP/AVIF 변환 권장

측정 커밋: fb1b7b4

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

Labels

✨ Feature 새로운 기능(기능성) 구현 ⏰ Timo-web Timo 웹 서비스 ♠️ 정민 정민양

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 투두 메모 날짜별 수정 API 연동

1 participant