MSG-408 feat: FCM 웹 푸시 기반 + 토큰 API 2종 실연동 — 프로필 알림 토글 옵트인·로그아웃 fcmToken 동봉 - #60
Conversation
|
Claude finished @gyuhochoime's task in 5m 24s —— View job 🔍 PR #60 코드 리뷰 완료작업 목록
요약32개 변경 파일 전체를 diff + 주변 코드까지 순차로 확인했습니다. 순수 로직/부수효과 분리, test-first 커버리지, codex 리뷰 반영(AC 7 정정·경쟁 가드)이 잘 되어 있는 견고한 구현입니다. 🟡 이슈 2건을 인라인 코멘트로 남겼습니다 (병합을 막을 수준은 아닙니다):
전체 리뷰는 PR 코멘트에 게시했습니다. |
|
React Doctor found 2 new issues in 1 file · 2 warnings · score 91 / 100 (Great) · 1 fixed · vs 2 warnings
Reviewed by React Doctor for commit |
🔍 코드 리뷰 요약 — PR #60 (MSG-408 FCM 웹 푸시)리뷰 범위: 👍 잘한 점
🟡 발견한 이슈 (인라인 코멘트 참고)
두 건 모두 확실한 버그라기보다 재현 조건이 좁은 엣지 케이스라 🟡(권장)로 표시했습니다 — 병합을 막을 정도는 아니라고 판단합니다. 참고 (블로킹 아님)
|
|
Claude finished @gyuhochoime's task in 2m 45s —— View job 🔍 PR #60 코드 리뷰 완료작업 목록
요약이번 리뷰는 최신 fix 커밋( 이전 지적 2건 — 모두 정정 확인
추가로 react-doctor가 지적한 남은 react-doctor 경고 2건 ( 추가로 확인한 부분 (기존에 잘 되어 있음, 신규 이슈 없음)
결론: 이번 fix 커밋은 이전 리뷰에서 나온 2건의 🟡 이슈와 react-doctor 경고 1건을 모두 정확하게 해소했고, 각각 재현 테스트로 회귀를 고정했습니다. 새로 발견된 이슈는 없습니다. 병합에 지장 없는 상태로 판단합니다. |
| const showNotice = usePushNoticeStore((s) => s.showToggleNotice); | ||
| const dismissNotice = usePushNoticeStore((s) => s.dismissToggleNotice); | ||
|
|
||
| const enable = useMutation({ |
There was a problem hiding this comment.
React Doctor · react-doctor/query-mutation-missing-invalidation (warning)
useMutation with no cache update here can leave your users looking at stale data after it runs.
Fix → Add onSuccess: () => queryClient.invalidateQueries({ queryKey: ['...'] }) so cached data stays in sync after the mutation
| onError: () => showNotice("error"), | ||
| }); | ||
|
|
||
| const disable = useMutation({ |
There was a problem hiding this comment.
React Doctor · react-doctor/query-mutation-missing-invalidation (warning)
useMutation with no cache update here can leave your users looking at stale data after it runs.
Fix → Add onSuccess: () => queryClient.invalidateQueries({ queryKey: ['...'] }) so cached data stays in sync after the mutation
🔍 코드 리뷰 요약 — PR #60 (MSG-408 FCM 웹 푸시, 재검토)리뷰 범위: 👍 잘한 점
🟢 확인했으나 대응 불필요로 판단 (사소한 제안)
🟡/🔴 신규 이슈
참고 (블로킹 아님, 확신 없음)
결론: 이번 fix 커밋은 지적된 이슈를 정확한 근본 원인 수정 + 회귀 테스트로 해소했습니다. 병합에 지장 없는 상태로 판단합니다. |
🎫 관련 티켓
📌 작업 내용
FCM 웹 푸시 기반 구축 + 푸시 토큰 API 2종 실연동.
features/notifications/신설 (FSD 신규 도메인): Firebase config·VAPID 공개키 상수 정본 모듈(config/firebase.ts— 공개 설계 값, SW가 env를 못 읽어 코드 상수로 커밋: VITE_ env 컨벤션의 승인된 예외), 브라우저 지원 판별·동기화 액션 판정·토글 표시 파생 순수 로직(test-first), firebase 동적 import 격리 경계, 자동 동기화·토글·포그라운드 수신 훅, 우하단 토스트 호스트getToken(VAPID)→POST /api/notifications/tokens→ 보관 / OFF =DELETE성공 시에만 보관 삭제(실패 시 ON 유지 + 오류 안내). 기존 "알림 설정" 준비 중 행을 대체useLogout이shared/storage.ts의fcmTokenStorage(auth↔notifications 매개 어댑터) 경유로 body 동봉 + onSettled 보관 비움public/firebase-messaging-sw.js: 쿼리스트링 config 파싱 →onBackgroundMessage최소 표시. env 무의존커밋 전 codex 리뷰 1회 반영: OFF 실패 시 보관 삭제 확정버그 정정(AC 7 개정), 동기화 경쟁 가드, 등록 실패 안내 — 각 RED 재현 후 수정.
✅ 체크리스트
pnpm lint/pnpm typecheck/pnpm --filter web test run통과docs/STATUS.md·docs/spec/MSG-408.md·docs/decisions/DECISIONS.md🔍 검증 요약
자동 검증 (풀 게이트 6종)
/* eslint-disable */1건 — 번들 비대상 워커 스크립트 정당 판정)수용 기준 판정: 13/13 통과, 실패 0
전 구간 콘솔 에러 0. a11y: switch role·접근 이름·키보드(Tab+Space) 실확인, Toast role="status". 병렬 스코프 준수(features/map-home·widgets/cell-detail 무변경).
검증 범위 밖: 백그라운드 푸시 실수신 E2E(BE/Firebase 콘솔 발송 필요 — 합동 확인 사항), 토글 granted 실완주(브라우저 크롬 "허용" 클릭 자동화 불가 — vitest가 정본 커버), 권한 변경 실시간 감지(스펙 범위 밖).
📸 스크린샷 (선택)
💡 추가 논의할 사항
importScripts의존(Vite public/ 번들 불가 제약의 표준 우회) — 차단 환경에서는 백그라운드 표시만 영향🤖 Generated with Claude Code