2026-09-01 PulseUp 작업일지입니다. 오늘은 8건의 작업을 진행했습니다.
회원앱
현상/기능
- 앱의 초기화면은 이렇게. 로그는 웹의 로그를 적당히 변형해서 사용
- 파일 · 변경
- `src/components/` · 웹 브랜드 변형 로고
- `src/screens/` · 초기 화면
- `src/screens/` · 로그인 없이 둘러보기
- `src/app/` · 비로그인 → `/welcome`
현상/기능
- 시작하니 로그인 화면이 나온다. 웹페이지도 로그인화면 아래 회원가입링크 있는데 여긴 없다
- 파일 · 변경
- `계정이 없으신가요? 회원가입` 링크
- `src/screens/register/*` · 가입 폼, 중복확인, 약관 동의
- `src/legal/` · 웹과 같은 약관 버전 `2026-06-01`
- `register`, `check-duplicate`
- `src/app/` · `/register` 라우트
현상/기능
- member-app 를 mobile-app 으로 이름을 변경
- 파일 · 변경
- 으로 이동
- name `mobile-app`
- slug `pulseup-mobile`
- 루트 `package.json` · `dev:app` prefix를 으로 변경
현상/기능
- 하나의 소스로 안드로이드, ios 둘다 사용가능한게 맞지? 그럼 진행
작업
- 파일 · 변경
- `package.json` · workspaces를 기존 3패키지 명시. `dev:app` 추가. 회원앱은 React 19라 웹(React 18)과 호이스트하지 않음
- `*` · Expo SDK 57 신규. `src/api`, `src/auth`, `src/screens`, `src/app`
- `*` · 기존 `/api/auth/login · me · refresh · logout` 호출
- `*` · SecureStore 토큰, 세션 복원
- 로그인
- 로그인 후 홈(다음 기능 안내)
주요 규칙
- 앱은 웹과 같은 API를 쓴다. 회원용 서버를 따로 두지 않는다
- 실기기 API 주소는 Expo 호스트 IP:3001 을 쓰고, `EXPO_PUBLIC_API_URL`이 있으면 우선한다
- 회원가입·지점신청·수업예약 화면은 아직 없다
지점 홍보·요금 (`/admin/branch-promo`)
현상/기능
- 지점에서 등록/관리하는 값이 있다. 어떻게 하지? (지점 등록비용 같은거..)
- branch-promo 에 지점관리자가 직접고친다
작업
- 파일 · 변경
- `api-server/src/services/` · 요금 매핑·저장 (`updateBranchPromoSettings`)
- `api-server/src/routes/` · `PATCH /me/promo` 에 등록비·월 이용료 수신
- `web-app/.../BranchPromo/*` · 홍보문구 + 요금 입력
- `suggestPaymentAmount` — 신규=등록비+월×개월, 연장=월×개월
- `ApproveVisitDialog` / `RenewPaymentDialog` · 지점 요금을 기본 금액으로 채움. 직접 수정 가능
주요 규칙
- 지점 설정은 기준가이고, 결제 이력에는 실제로 받은 금액을 남긴다
- 요금을 비우면 예전처럼 결제 금액을 손으로 넣는다
지점 신청목록 · 승인 결제 (`/admin/branch-applications`)
현상/기능
- 1. branch-applications 에서 목록에 닉네임 넣어주고
- 2. 개인 심박계 등록시 기기별에 기본값은 "닉네임"_개인심박계 이렇게 넣어줘
- 3. 결제 금액 아래 5%, 10%, 20%, 30% 조그만 버튼을 만들어서 누르면 전체 금액의 % 만큼 할인한다
- 결제메모에는 % 할인 적용 이렇게 추가한다
작업
- 파일 · 변경
- 신청 DTO 에 nickname
- 닉네임 컬럼
- 기기명 기본 `닉네임_개인심박계`, 할인 버튼
- 금액 아래 5/10/20/30% 버튼
- 전체 금액 기준 할인·메모 `N% 할인 적용`
- 같은 할인 버튼
지점 신청 (`/account/branches`)
현상/기능
- account/branches 에 체크박스는 뺀다. 상태에 버튼을 넣어서 그 버튼으로 신청하게 한다
작업
- 파일 · 변경
- 체크박스·일괄 신청 제거. 상태 칸에 신청 버튼
- 지점 하나씩 `applyToBranch`
- 다중선택 유틸 삭제
수업예약 관리 (`/booking/manage`)
현상/기능
- booking/manage 에서 예약자 출석체크에서 출석처리가 코드값으로 나온다
현상/기능
- 슬롯개념이 필요없다. 지우고, 슬롯 옆의 현재는 뭐지
작업
- 파일 · 변경
- 출석 처리 Select에 `labels`를 넘겨 닫힌 상태에서도 예약중/출석/노쇼로 표시
- 심박계·운동 Select에도 `labels`를 넘겨 기기명/운동명으로 표시
- ANT+ 슬롯 입력칸 제거. 헤더를 `현재 심박`으로 바꿈
지점 심박계 관리 (`/admin/heart-rate-devices`)
현상/기능
- admin/heart-rate-devices 의 상하 높이를 1:1 로
현상/기능
- admin/heart-rate-devices 여기에 현재 심박계가 예약된 목록도 필요하다
작업
- 파일 · 변경
- 목록 `flex-[2]` / 폼 `flex-[1.2]` → 둘 다 `flex-1`
- 예약 배정 DTO·정규화
- `listBranchHeartRateReservations` (미종료 수업, 예약중/출석)
- `GET /devices/reservations`
- (web) · `getDeviceReservations`
- 신규. 기기명·회원·수업 일시
- 하단 오른쪽 예약 배정 목록
지점 수입분석 (`/admin/branch-revenue`)
현상/기능
- admin/branch-revenue 에 기능추가
- 1. 조회기간 매출을 클릭하면 조회기간내 결제목록이 팝업으로 나온다
- 2. 이용중 회원을 클릭하면 이용중인 유효회원 목록이 팝업으로 나온다. 회원을 클릭하면 admin/branch-members 이 페이지의 해당해원으로 가야 한다
- 3. 만료임박 회원을 클릭하면 만료임박 회원의 목록이 팝업으로 나온다. 회원을 클릭하면 admin/branch-members 이 페이지의 해당해원으로 가야 한다
작업
- 파일 · 변경
- `listPayments` — 조회기간 유효 결제 목록
- `GET /payments`
- `fetchRevenuePayments`
- 매출·이용중·만료임박 카드 클릭
- 신규. 결제 목록 팝업
- 신규. 회원 목록 팝업
- 팝업 연결, 회원 클릭 시 이동
- `?memberId=` 로 해당 회원 선택
지점 회원관리 (`/admin/branch-members`)
현상/기능
- 1. 회원 클릭 시 회원가입 때 입력한 모든 정보 표시 (비밀번호 제외)
- 2. 결제 이력은 간단하게, 클릭하면 하단에서 세부내역이 열리게
- 3. 추가로 회원을 선택하면 선택된 회원이 select 표현되게 한다
현상/기능
- 결제이력을 클릭하면 말풍선 형태로 바로 밑에 붙도록 할 수 없을까
현상/기능
- 좌우 넓이를 1.5 : 1 로 하고 우측의 높이를 1:1로
- 파일 · 변경
- 좌 `flex-[1.5]` / 우 `flex-1`. 우측 가입정보·결제이력 각 `flex-1`
현상/기능
- 가입정보를 좀 더 정돈되고 깔끔하게 표시
- 파일 · 변경
- 기본 / 신체·운동 / 부상·주의 / 약관 구역, 칸 정렬
- 키·몸무게·나이 단위, 약관 문구
- 단위·약관 표시 케이스
현상/기능
- 가입정보에 약관동의 내용은 필요없다
- 파일 · 변경
- 약관 동의 구역 제거
- `displayTermsText` 제거
현상/기능
- 가입정보에 기본, 신체/운동, 부상/주의사항 등 타이틀은 표나게. 배경색과 글자크기 등만 조금 바꾼다
- 파일 · 변경
- 구역 제목 `text-xs` + 헤더톤 배경
현상/기능
- 적용기간이 9/1일부터이고 오늘이 9/1일이면 결제취소가 안되어야 하지 않나
- 파일 · 변경
- `20260906_membership_payment_cancel_period.sql` · `sp_cancel_membership_payment` 시작일 <= 오늘이면 `PAYMENT_PERIOD_STARTED`
- `canCancelMembershipPayment` — `today < startsAt` 만 허용
- 시작 당일부터 취소 버튼 숨김
- 같은 조건으로 저장 비활성
- 화면용 동일 판별
현상/기능
- 지점회원 페이지에서
- 1. 현재 좌우 1.5:1 인데 1:8:1 로 수정
- 2. 좌측 회원목록에 '정지' 버튼. 예약 불가. 만료도 예약 불가. 다시 활성화 가능
- 3. datatable 컬럼을 fit
- 파일 · 변경
- `20260907_branch_membership_suspend.sql` · `branch_memberships.is_suspended`, 목록 프로시저
- `canReserveFromMembership` 에 정지 여부
- 정지 회원 예약 차단
- `setMembershipSuspended`
- `POST /:id/suspend`
- 정지/활성화 컬럼, 컬럼 폭 `%`
- 좌 `flex-[1.8]` / 우 `flex-1`
현상/기능
- 예약정지하니 "Unknown column 'is_suspended' in 'SET'" 에러가 난다
- 그리고, 예약정지 확인을 alert 으로 하지말고 snack bar 형태로
- 파일 · 변경
- `20260907_branch_membership_suspend.sql` · `ADD COLUMN IF NOT EXISTS`, `sp_set_membership_suspended`
- `sp_branch_membership.sql` · `sp_set_membership_suspended`
- 정지 전에 `is_suspended` 컬럼 보장
- 컬럼 없으면 정지 아님으로 예약 검사
- `onConfirm`/`onCancel` 확인 스낵바
- `window.confirm` 제거
- 정지/활성화 확인을 스낵바로
현상/기능
- 정지 했다는데 버튼은 계속 정지로 나온다
- 파일 · 변경
- 목록에 `is_suspended` 재조회, 정지 응답에 반영
- 저장 후 해당 행 버튼을 활성화/정지로 맞춤
현상/기능
- 정지한 회원으로 접속하니 여전히 예약이 되고 있다
- 파일 · 변경
- `toFlag` — TINYINT/Buffer 정지 판별
- 내 가입/지점 목록에 정지 재조회
- 회원은 예약 가능 지점만. JWT 지점 폴백 제거
- active 가입이 정지면 예약 차단
- 예약 가능 지점이 아니면 슬롯/예약을 막음
현상/기능
- account/branches 하단에는 예약불가라 나오는데 상단에 지점 회원이라고 나온다. 정지 된 회원은 지점 정지 라고 나오게
- 아래 가입목록에도 상태를 지점 정지로 변경
- 파일 · 변경
- 지점/가입 DTO에 `isSuspended`
- 화면 타입에 `isSuspended`
- `getMembershipStatusLabel`
- 상단 상태 `지점 정지`
- 하단 가입 상태 `지점 정지`
작업
- 파일 · 변경
- `getMemberProfile` — 가입 입력값 DTO
- `GET /:id/profile` (`/:id/payments` 보다 위)
- `fetchMemberProfile`
- 성별·운동목표 한글 라벨, 빈 값 `-`
- 가입 정보 읽기 전용
- 구분·결제일·금액 한 줄. 행 클릭으로 세부 선택
- 결제 행 바로 아래 말풍선 세부내역 + 유효 건 취소
- 선택 행 강조(`bg-primary/20` + 체크), 헤더 `회원 선택` Select 동기화
- 왼쪽 목록 / 오른쪽 가입정보·간단이력. 결제 클릭 시 행 아래 말풍선