# SPRINT-005 QA Review — Iteration 1 (최종 Sprint) - **검증일시:** 2026-04-04 03:33 UTC - **검증자:** 다랑이 (Evaluator) - **결과:** ✅ PASSED ## 검증 항목 | 항목 | 결과 | |------|------| | git clone + checkout | ✅ | | npm install (BE/FE) | ✅ | | prisma generate | ✅ | | npm test (backend) | ✅ 22/22 pass | | npm run build (backend) | ✅ | | npm run build (frontend) | ✅ 12 routes | ## 설계 대조 | 설계 항목 | 일치 | |-----------|------| | CostLog 모델 + 인덱스 | ✅ | | GET /api/admin/costs (period=day/week/month) | ✅ | | POST /api/admin/costs/record/:name | ✅ | | @UseGuards(ApiKeyGuard) on costs API | ✅ | | WebSocket Gateway (/ws namespace) | ✅ | | EventsScheduler 30초 브로드캐스트 | ✅ | | sisters:update + activity:new 이벤트 | ✅ | | ActivityService 실시간 연동 | ✅ | | /admin/costs 비용 대시보드 (BarChart+요약) | ✅ | | 기간 필터 (day/week/month) | ✅ | | FE useSocket 훅 | ✅ | | 메인 대시보드 실시간 반영 | ✅ | ## Sprint 004 non-blocking 수정 확인 | 항목 | 상태 | |------|------| | null byte 방지 (셸 escape) | ✅ | ## Non-blocking 이슈 ### 코드 품질 (code-reviewer) | ID | 이슈 | 심각도 | |----|------|--------| | N1 | WebSocket Gateway 인증 없음 — handleConnection에 token 검증 추가 권장 | Medium | | N2 | useSocket stale closure — useRef 패턴으로 개선 권장 | Low | | N3 | recordCosts python3 의존 — jq 또는 Node.js 대안 권장 | Low | | N4 | estimatedUsd Float 정밀도 — Decimal 또는 정수(cents) 저장 권장 | Low | | N5 | MODEL_PRICING 하드코딩 — config/DB 분리 권장 | Low | | N6 | recordAll Promise.all → Promise.allSettled 권장 | Low | | N7 | EventsScheduler setInterval → setTimeout 재스케줄링 권장 | Low | | N8 | WebSocket + REST 이중 폴링 — connected 시 간격 조절 권장 | Low | | N9 | POST record/:name 응답 body 없음 — {recorded: true} 반환 권장 | Low | ### 보안 감사 (security-auditor) | ID | 이슈 | 심각도 | |----|------|--------| | SEC-001 | WebSocket Gateway 무인증 — origin/token 검증 추가 권장 | Medium | | SEC-002 | lodash 의존성 취약점 (Prototype Pollution) — @nestjs/config 업그레이드 권고 | High (실제 악용 Low) | ## 판정 근거 - 테스트/빌드 전부 통과 - 설계 문서와 코드 일치 - blocking 0건 (code-reviewer B1~B3 재검증 후 non-blocking 하향) - CostLog API 인증 적용, CORS 일관, Helmet, ValidationPipe 등 보안 기반 양호 - WebSocket 인증은 내부망 대시보드 특성상 non-blocking으로 판정