bandmate 개발기록

Ethan·2026년 1월 22일

1/21
PWA 아이콘과 푸시 알림 배지 수정 작업이 완료후 배포

수정된 내용:

  1. iOS PWA 지원 강화 (index.html):

    • apple-mobile-web-app-capable, apple-mobile-web-app-status-bar-style
      메타 태그 추가
    • 다양한 크기의 apple-touch-icon 링크 추가
    • 모든 iPhone/iPad 기기 크기에 맞는 스플래시 화면 링크 추가
  2. 푸시 알림 배지 (firebase-messaging-sw.js):

    • 배지 아이콘을 /badge-72x72.png로 변경
  3. 매니페스트 아이콘 (manifest.webmanifest):

    • maskable 아이콘, apple touch icon, badge 아이콘 추가
  4. Cloud Functions FCM 설정 (functions/src/index.ts):
    - webpush, android, apns 플랫폼별 알림 설정 추가
    - 각 플랫폼에 맞는 배지, 아이콘, 사운드 설정

    테스트 방법:

  5. iOS에서 테스트:

    • Safari에서 사이트 열기
    • "홈 화면에 추가" 실행
    • 새로 추가된 앱 아이콘 확인
    • 앱 실행 시 스플래시 화면 확인
    • 푸시 알림 수신 시 배지 확인
  6. Android에서 테스트:

    • Chrome에서 사이트 열기
    • PWA 설치 또는 홈 화면에 추가
    • 푸시 알림 수신 시 배지 확인

    참고사항:

  • iOS Safari에서 PWA를 다시 설치해야 새 아이콘이 적용됩니다 (기존 앱 삭제
    후 재설치)
  • 브라우저 캐시를 지워야 변경사항이 반영될 수 있습니다
  • Android 배지는 기기/런처에 따라 지원 여부가 다를 수 있습니다

개발 회고록: RSVP와 출석 관리 시스템의 분리 및 고도화

날짜: 2026년 1월 22일

1. 개요 (Context)

오늘의 주요 업데이트는 밴드 운영의 핵심인 '참석 파악' 로직을 한 단계 더 발전시킨 것 이다. 이전까지는 모호하게 관리되었을 수 있는 '참석 의사'와 '실제 현장 출석'을 분리하여, 데이터의 신뢰도를 높이고 관리자의 운영 부담을 줄이는 데 집중했다.

RSVP, 출석확인 분리, 관리자 출석확인, 참석희망자 페이지 제작

  • 핵심 목표: 예정된 일정에 대한 부원들의 수요 조사(RSVP)와 실제 현장 기록(Attendance)의 이원화.

2. 주요 구현 사항

2.1 RSVP(참석 예정) 관리 페이지 신설

  • 목적: 일정 시작 전, 부원들의 상태(참석, 지각, 불참)를 미리 파악하여 합주나 공연 준비에 활용.
  • 기술 포인트:
    • rsvps 컬렉션 도입을 통해 '예정 데이터'를 별도로 관리.
    • 미응답자(Unknown) 카운팅 로직을 추가하여 관리자가 부원들의 참여를 독려할 수 있는 근거 제공.
    • 오늘 이후의 일정만 필터링하여 보여주는 효율적인 데이터 핸들링.

2.2 현장 출석 관리 페이지 고도화

  • 목적: 실제 현장에서 매니저가 부원들의 출석 상태를 실시간으로 기록.
  • 기술 포인트:
    • attendances 컬렉션을 활용한 기록 시스템.
    • 사용자 경험(UX)을 고려하여 '버튼 클릭'만으로 즉시 상태를 전환하는 직관적 인터페이스 구현.
    • 중복 데이터 방지를 위한 문서 ID 전략(예: scheduleId_userId) 활용.

2.3 라우팅 및 권한 제어

  • App.tsx 내에서 매니저 전용 라우트를 분리하여 일반 멤버의 접근을 원천 차단하는 보안성 강화.

3. 잘 된점, 개선할 점

🟢 잘된 점 (Keep)

  1. 타입 안전성: types/index.ts에 정의된 AttendanceStatusUserRole을 적극적으로 활용하여 코드 전반의 안정성을 확보했다.
  2. 명확한 책임 분리: RSVP와 실제 출석을 분리한 것은 데이터 모델링 측면에서 매우 훌륭한 결정이다. 이는 추후 '출석률 통계'를 낼 때 "참석한다고 하고 안 온 사람"과 같은 정교한 분석을 가능하게 한다.
  3. PWA 최적화: 모바일 웹 환경에서 쉽게 조작할 수 있도록 카드 형태의 UI와 큰 버튼을 배치한 점이 인상적이다.

🟡 개선 제안 (Problem & Feel)

  1. 코드 중복 (DRY 원칙): RsvpManagePageAttendanceManagePage를 보면 일정 목록을 불러오고 멤버 리스트를 렌더링하는 로직이 거의 동일하다.
    • Action: useFetchSchedules, useFetchMembers와 같은 Custom Hook을 만들어 로직을 공용화할 필요가 있다.
  2. 에러 핸들링: Firestore에 데이터를 쓰는 과정에서 발생할 수 있는 네트워크 오류 등에 대한 대응이 아직 부족하다.
    • Action: try-catch 블록과 연동된 Toast 알림을 통해 사용자에게 작업 성공/실패 여부를 명확히 알려주어야 한다.

4. 향후 과제 (Next Step)

  • 데이터 페칭 로직 Custom Hook으로 리팩토링.
  • RSVP 미응답자에게 자동으로 푸시 알림을 보내는 기능 검토.
  • 누적된 출석 데이터를 바탕으로 한 '개인별 참석 통계' 대시보드 제작.

마무리하며:
단순한 기능 구현을 넘어 데이터 모델의 설계를 고민한 흔적이 보이는 업데이트였다. 시스템이 점점 커짐에 따라 공통 로직을 어떻게 추상화할 것인지가 다음 성장의 핵심이 될 것이다. 🎸

Lucidus

profile
코딩하는 알파카

0개의 댓글