2026-07-18 PulseUp 작업일지입니다. 오늘은 2건의 작업을 진행했습니다.
1Monitor Main Stress 저장 (Singleexercises)
현상/기능
- 1모니터(Singleexercises) MAIN Stress 저장을 `workout_exercises_logic.md` §8(MOVE 고정·SET 순환·6MOVE 물보충) 규칙에 맞춤
- 1Monitor MAIN Loop 저장을 `workout_exercises_logic.md` §9(RND 순환·6MOVE lap 1,2,3,6,5,4·RND3 물보충) 규칙에 맞춤
작업
- linear stress 생성 시 6MOVE마다 물보충·마지막 SET 휴식/물보충 분기를 grid Main Stress와 동일하게 적용하고, 시간 합산·화면 표시에 `circuitType`을 전달하도록 수정. 단위 테스트 추가
- 6MOVE 블록마다 RND1→3 재시작, 블록 내 B/D 역순 lap 정렬, 각 블록 RND3 종료 시 물보충(후반전 포함) 생성 및 시간 합산 반영. loop 단위 테스트 추가
- **Web** · `shared/save-workout/`
심박 저장 오류 및 서버 CPU 포화 분석
현상/기능
- 심박계 저장 중 오류와 서버 CPU 100% 발생 가능 원인 및 보완 항목 점검
- 심박 배치 저장 DB 부하와 무제한 요청·로그 증폭 방지
- 실패 큐 200건과 신규 10건의 반복 전송 및 CPU 포화 차단
- 원격 제어 중복 폴링·요청 중첩과 웹 심박 메모리/병렬 전송 위험 보완
- 200건 저장·재전송 게이트·폴링 안정화 회귀 검증
작업
- Electron 10건 배치가 API에서 행별 프로시저 호출과 저장 확인 SELECT로 최대 21회 DB 작업으로 확대되는 구조, 장애 큐 재전송 증폭, 무제한 본문·배치·DB 대기열, 원격 제어 중복 폴링과 요청 중첩 위험을 확인. 운영 로그에서 과거 데이터 200건 큐 drain과 신규 10건 배치가 반복되며 동일 과거 시각이 재처리되는 현상을 추가 확인하고 P0~P2 개선 순서와 계측 항목을 정리
- 행별 프로시저/검증 SELECT를 제거하고 최대 200건을 단일 parameterized multi-row UPSERT로 저장. 심박 전용 256KB 본문 제한, user/master 단위 동시 요청 429+Retry-After, 입력 범위 검증, 메타데이터 로그 및 인증정보·심박 원문 마스킹을 적용
- `src/main/heart-rate-modules/`
- 큐 drain 성공 전 신규 배치를 전송하지 않는 게이트, 401/429/5xx/network 지수 backoff+jitter, Retry-After, 큐 중복 제거·비동기 파일 처리·instanceId·재시도 진단을 구현하고 기존 큐 데이터는 성공 응답 전까지 보존
- 부모 연결 폴링으로 통합하고 응답 완료 후 예약, 실패 backoff, 숨김 탭 중단을 적용. 진단은 펼친 동안 15초마다 조회하며 WorkoutControl을 600줄 이하로 분리하고 심박 포인트 3000건 상한·증분 통계·순차 전송·listener cleanup을 추가
- API 200건이 매핑 조회+UPSERT 2회 DB 호출로 처리됨을 검증하고 Electron 200건 실패 시 신규 10건 미전송, Retry-After, Web 요청 중첩 방지 테스트 추가. API/Electron/Web 빌드와 대상 테스트 통과, Electron 53개·Web 45개 전체 테스트 통과
- **분석**
- **API** · `src/services/`, `src/routes/`, `src/schemas/`, `src/`, `src/middleware/`
- **Web**
- **Test**