204e3b6975
마지막 외부연동 영역(푸시)을 채널=FCM HTTP v1 로 확정해 서버측 완전 구현.
Toast/KFTC 와 동일 패턴: 실 API·config-gated(app.adapter.push, 기본 mock)·fail-fast.
- ga-common: PushAdapter 인터페이스 + PushRequest/PushResponse
- ga-external-adapter: MockPushAdapter(기본) + FcmPushAdapter(POST /v1/projects/{id}/messages:send,
Bearer, notification+data 매핑, name→messageId) + FcmProperties. 의존성 추가 없음.
- V107 user_device_token(user_id/token/platform/is_active, UNIQUE token) + UserDeviceTokenVO/Mapper(upsert/selectActiveByUser/deactivate)
- ga-api:
- PushDispatchService.sendToUser — 사용자 활성 토큰 전부에 best-effort 푸시(예외 흡수)
- MobileMe: POST /api/mobile/me/device-tokens (등록 upsert) + /unregister (본인검증 deactivate)
- WithdrawBankSettleService.notify 에 푸시 디스패치 연동(출금 SETTLED/FAILED 시 인앱+푸시)
- ExternalCallLoggingAspect 에 PushAdapter 포인트컷 추가(외부호출 감사로그)
- application.yml app.adapter.push + app.adapter.fcm.* 설정
- ga-mobile-pwa: api/push.ts(register/unregister) + push/initPush.ts(config-gated, VITE_FCM_* 미설정 시 no-op) + 로그인 성공 시 initPush() 훅
- AdapterFailFastTest 에 FCM fail-fast 케이스 추가
검증: 전체 ./gradlew build(test) SUCCESSFUL, PWA 빌드 OK, Flyway V107 success,
디바이스토큰 등록/해제/검증 라이브 e2e PASS(등록200·해제200·is_active=N·빈토큰400).
실 푸시 발송은 Firebase 프로젝트(서버 FCM_PROJECT_ID/ACCESS_TOKEN + PWA VITE_FCM_* + firebase SDK) 주입 후 가능.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ga-mobile-pwa
설계사 전용 모바일 셀프 조회 PWA 스캐폴드.
스택
- Vite + React 18 + TypeScript
- antd-mobile@5 (모바일 UI)
- vite-plugin-pwa (manifest + service worker autoUpdate)
- React Query (서버 상태) + Zustand (인증)
- 백엔드: 기존
ga-api(8082) 그대로 재사용. 로그인 후/api/auth/me의agentId로 본인 데이터 필터링.
화면
| 경로 | 화면 | 백엔드 API |
|---|---|---|
/login |
로그인 | POST /api/auth/login, GET /api/auth/me |
/ |
홈 (요약 카드 + 메뉴) | 위 3개 카운트 |
/statement |
정산 명세서 | GET /api/statements?agentId=… |
/withdraw |
출금 신청 이력 | GET /api/withdraw-requests?agentId=… |
/notice |
공지사항 | GET /api/notices/active |
실행
cd ga-mobile-pwa
npm install
npm run dev # http://localhost:3001
vite.config.ts 의 /api 프록시가 localhost:8082 로 전달하므로 ga-api 가 가동 중이어야 한다.
빌드 / 프리뷰
npm run build # tsc --noEmit + vite build (dist/)
npm run preview # 3001 에서 production 번들 서빙
PWA
manifest.webmanifest자동 생성 (vite-plugin-pwa)- 서비스워커:
registerType=autoUpdate. 신규 빌드 시 사용자 새로고침 시점에 갱신. - 런타임 캐시:
/api/**NetworkFirst, 5초 타임아웃, 5분 유효 (오프라인 시 직전 응답 반환) - 아이콘:
public/pwa-{192,512}.svg(스캐폴드 — 본 배포 시 PNG 권장)
잔여 작업 (스캐폴드 이후)
- 로그인 응답에서 직접 profile 추출 (현재
/me추가 호출) - 백엔드
/api/mobile/me/*전용 endpoint — 본인 agentId 자동 필터 (현 클라이언트 필터는 변조 가능) - 출금 신청 작성 화면 (현재 이력 조회만)
- 정산 명세서 상세 + PDF 다운로드
- 공지 상세 + 본인 알림(
user_notification) 표시 - 토큰 만료 자동 refresh (
/api/auth/refresh) - 푸시 알림 (FCM 등) — 외부 채널 결정 후
- 실 아이콘 PNG (192/512/512 maskable)