2026-07-15 PulseUp 작업일지입니다. 오늘은 6건의 작업을 진행했습니다.

운동 중 자동 로그아웃(90분 세션벽) 개선

현상/기능

  • 운동 시작 후 40~50분 경과 시 로그아웃되는 원인 분석
  • 분석 결과 추천 방향대로 수정
  • 슬라이딩 세션 적용

작업

  • 액세스 토큰/DB 세션이 로그인 후 90분 고정 만료(활동해도 연장 안 됨), 리모컨 팝업에 refreshToken 미복사, 두 axios 클라이언트의 독립 리프레시가 단일 세션 토큰을 상호 무효화하는 구조를 확인
  • 공용 토큰 리프레시 모듈 신설(single-flight + BroadcastChannel 창 간 토큰 동기화 + `X-Token-Expiring-Soon` 선제 갱신), 두 axios 클라이언트가 공용 모듈을 사용하도록 통합, 리모컨 팝업 토큰 복사에 refreshToken 추가
  • 인증 성공 요청마다 `user_sessions.expires_at`을 현재+90분으로 연장(슬라이딩 세션), CORS `exposedHeaders`에 `X-Token-Expiring-Soon` 추가
  • **분석**
  • **Web** · `services/`(신규), `services/`, `services/`, `pages/RemoteControl/components/`
  • **API** · `src/services/`, `src/`

Electron EXE 아이콘 갱신 (Windows ICO 직접 생성)

현상/기능

  • 빌드 후에도 EXE 아이콘이 예전 아이콘으로 보이는 문제

작업

  • `build-scripts/copy-icon.js`, `package.json`
  • Windows용 `build/icon.ico`를 16~256px 다중 해상도로 직접 생성하고 `win.icon`을 `icon.ico`(buildResources 기준)로 지정. NSIS 설치/포터블용 `installerIcon.ico`·`uninstallerIcon.ico`도 동일 ICO로 생성. `dist-electron/.icon-ico` 캐시 삭제 포함. `win-unpacked` EXE 아이콘은 정상 적용 확인 — Setup/Portable은 NSIS 래퍼 아이콘 별도 지정 및 재빌드 필요

Electron 패키지 아이콘 2.png 적용

현상/기능

  • `web-app/public/2.png`를 electron-app 빌드 시 패키지 아이콘으로 사용

작업

  • `build-scripts/copy-icon.js`
  • 아이콘 소스를 `logo.png`에서 `2.png`로 변경하고, 1920×500 가로 배너를 512×512 정사각형(`fit: contain`, 투명 배경)으로 변환해 `build/icon.png` 생성. electron-builder의 win/mac/linux `icon` 설정은 기존 `build/icon.png` 경로를 그대로 사용

Electron V2 환경변수 V1 충돌 방지 리네이밍

현상/기능

  • V1 사용 후 V2 설치한 PC에서 인증코드가 표시되지 않는 문제 — V1이 레지스트리에 남긴 `API_SERVER_URL`(옛 linkhiit 도메인)·`LINKHIIT_DIRECT_MODE`를 V2가 그대로 읽어 서버 릴레이 연결이 실패/우회되는 원인 차단

작업

  • `main/`, `main/`, `main/`, `package.json`, `build/installer-env.nsh`
  • V2 전용 변수명으로 분리: `API_SERVER_URL`→`API_SERVER2_URL`, `LINKHIIT_DIRECT_MODE`→`PULSEBOX_DIRECT_MODE`. dev/dev:local 스크립트와 NSIS 설치 스크립트(설치 시 기록/제거 시 삭제)도 새 변수명으로 교체. V1 잔여 변수는 V2가 읽지 않으므로 무해해짐

연동 관리 선택삭제 권한 오류 수정

현상/기능

  • `/admin/linkage-management` 선택 삭제 시 서버 403 및 `Uncaught (in promise) Object` 발생

작업

  • 목록은 `GET /admin/linkages`(관리자 권한)인데 삭제는 `DELETE /api/devices/:id`(매장 branch_id 일치만 허용)를 호출해 super_admin·타 매장 디바이스에서 403 발생. `DELETE /admin/linkages/:id` 추가 및 Web에서 `adminService.deleteLinkage` 사용으로 목록·삭제 권한 규칙 통일, 서버 오류 메시지 표시 개선
  • **API**

운동 설정 Web 빌드 오류 수정

현상/기능

  • COMBO 설정 파싱 호출의 TypeScript 타입 불일치로 실패한 Web 프로덕션 빌드 복구

작업

  • COMBO 운동 방식 전용 타입을 정의하고 `isComboMethod`를 타입 가드로 변경하여 분기 내부 타입을 안전하게 축소했으며, Web 프로덕션 빌드와 수정 파일 린트 검증을 완료
  • **Web**