Novato 프로젝트 문서 (마스터)
Novato 농구 리그 관리 서비스의 웹(React) + 앱(Flutter) 기능 종합 문서. 현재 상태 지도 + 변경 이력.
세부는 각 페이지 참고. 이 페이지는 전체 지도 + 요약만.
문서 구조
웹 (novato.kr · novato_react)
- 웹-개요 — 스택·라우트 구조 요약
- 웹-메뉴트리 — 메인 탭/서브탭 트리 (일반 사용자 동선)
- 웹-독립페이지 — 메뉴에 없는 직접 URL 페이지 (방송 등)
- 라이브스트리밍-방송 — PRISM 오버레이 방송 운영법
- AI-경기프리뷰 — AI 승부 예측 + 프리뷰 기사 (주 1회 스킬 생성)
앱 (novato_app · Flutter)
- 앱-개요 — 웹뷰 셸 + 버전/업데이트
- 앱-더보기메뉴 — ”…” 팝업 메뉴 (5개)
- 앱-StatPad — 핵심 네이티브 기능(스탯 입력→업로드→방송)
- 앱-푸시알림 — FCM 푸시 + 알림함 체계(알림 종류/스케줄/운영법)
- 앱-정리후보 — 제거 완료 기록
공통
- 아키텍처 — 웹·앱·Supabase·R2 연동 구조
검토 / 의사결정
- Capacitor-네이티브-전환-검토 — 앱을 Flutter WebView → Capacitor 네이티브로 전환할지 검토 (Play Store·OTA·구글로그인·싸이닝·대시보드 카드화)
- Capacitor-PoC-검증결과 — 위 검토의 PoC 실행 결과 (스캐폴딩·로그인·카드대시보드·edge-to-edge·OTA 실기기 검증 완료)
- RLS-정책-설계-검토 — Supabase RLS 정책 설계·확정 (로그인 조회 제한 + 역할별 CRUD). 결정 완료(§6) — 웹 로그인 강제, 감독=로스터 coach 팀단위, 스탯입력은 로그인 전원, Flutter StatPad 폐기. SQL: novato_react
supabase/rls_phase2_member_lockdown.sql(main 배포 후 적용)
한눈에 보기
| 구분 | 화면 / 메뉴 |
|---|---|
| 웹 탭 (novato.kr) | 대시보드 · 일정 · 순위 · 팀/선수 · 라운지 (5개) |
| 웹 직접 URL | broadcast(PRISM방송) · highlights(유튜브 스탯입력) · 예측 · 게시판 · 공지 · 통계(DAU) |
| 앱 (novato_app) | 웹뷰(위 웹앱) + ”…” 메뉴: 새로고침 · 공지관리 · StatPad · 공유 · 정보 |
- 웹 = 일반 기능 전부. 스탯 입력은
/highlights(유튜브), 경기 상세는 일정 카드에서 진입(경기 탭 제거됨). - 앱 = 웹뷰 + 특수기능. 현재 v1.0.2.
정리 현황 (대부분 완료)
| 대상 | 상태 |
|---|---|
웹 /broadcast24·/tvbroadcast·/scoreboard·/mobile-scoreboard·/mobile-broadcast | ✅ 제거 (PR #29) |
웹 /upload(Google Sheets/Excel) 페이지·서비스 | ✅ 제거 (PR #29) |
| 웹 경기 탭(하단/상단) | ✅ 제거 (PR #32) — 일정 카드에서 진입 |
| 앱 스탯업로드·신문기사·전광판 메뉴 + Streamlit·갤러리·전광판 화면 | ✅ 제거 (v1.0.0) |
| 앱 TV 방송채널 메뉴, undo/redo·미사용 코드 | ✅ 제거 (v1.0.1) |
| 유지 | 웹 /broadcast(PRISM), /highlights(유튜브 스탯), /stats(DAU), /admin |
변경 이력 (2026-07)
웹
- +1점 규칙(녹색 견장) — 통계 원본, 점수만 +1. 앱-StatPad
- 방송/스코어보드 5종·업로드 페이지 폐기 (PR #29)
- 일정 카드 ”…” 메뉴 재설계(모드 토글·롱프레스 제거), 바디클릭=상세/예측 (PR #30) → 웹-메뉴트리
- 일정 예정경기 2주 폴딩(그 이후 접기) (PR #31)
- 브로드캐스트 득점리더 라이브스탯 일치 수정(항상 원시카운트+보너스) (PR #31)
- 경기 탭 제거, 팀 메뉴 역할 지정(감독/코치 등), 프로필 수정 시 기본정보 탭, 카드 메뉴 z-index (PR #32)
- AI 경기 프리뷰 — 승부예측 페이지에 AI 승률+기사 표시, 주 1회
/game-preview스킬로 생성 (PR #33) → AI-경기프리뷰 - NovaTalk 로그인 계정 글쓰기 복구 —
posts/comments의password_hashNOT NULL 해제. 계정(user_id) 글은 비밀번호가 없어 작성이 전부 실패하던 것 - 태블릿·폴드 펼침 대비 수정 — 하단 탭 내비가 안드로이드 3버튼 네비바에 가리고 글씨가 회색이라 안 보이던 문제. 네이티브 그라데이션 처리가 모바일 분기에만 있었음 (일정 화면 대비 1.3 → 6.27)
- 사진 확대 뷰어 — 핀치 줌/더블탭/드래그. 게시글·경기 사진·선수 사진 공용(
ImageViewer), 기존 줌 없는 모달 3곳 대체 - 게시글 화면 정리 — 작성 폼 하단 잘림(
pb-tabbar누락), 상세를 제목/본문/댓글 카드로 분리,/board단독 라우트 → 라운지 board 탭 리다이렉트
앱 (v0.9.9 → v1.0.2)
- v1.0.0: 메뉴 8→5, 레거시 제거
- v1.0.1: StatPad 심플모드 스탯 전면 확장(모든 스탯+실패·리바운드), 카드에 리바운드/스틸 표시, 업데이트 확인 전체버전 감지 + 강제 APK 다운로드 앱-개요
- v1.0.2: 심플모드 비활성 선수 서버 업로드 제외 버그 수정 앱-StatPad
Capacitor 앱 (novato_react 네이티브 셸, 2026-07-23)
- 릴리스 서명키 개통 —
novato-release.keystore생성(로컬NovatoProject/keys/보관), GitHub Actions 시크릿 4종 등록. 릴리스 APKsigned:"release"확인. 기존 디버그 서명 APK 위에는 업데이트 설치 불가 → 재설치 필요. - 가입 승인 대기(pending) 대시보드 오버레이 — 미승인 계정은 대시보드 데이터 로드를 통째로 스킵하고, 블러 처리된 정적 스크린샷 배경 + 반투명 딤 + “가입 승인 대기중입니다” 카드 표시 (
PendingDashboardOverlay,useAppData({enabled})).
알림 고도화 + 계정 카드 (2026-07-28~29)
- 경기 전날 22시 개인 알림 — 내일 본인 팀 경기 + 우리 팀 유니폼 색(hex→한글). 기존 2일 전 아침 알림 대체. → 앱-푸시알림
- 가입요청 알림 허브 딥링크 — super_admin 알림 탭 시 커스텀 탭으로 hub.novato.kr/members. 알림 route 가 외부 URL 이면 브라우저로 여는 공통 처리 추가.
- 내 계정 연결 선수 카드 — 사진/이름/팀, 탭 시 선수 상세. “내 프로필 아니면 운영자에게 수정 요청” 안내.
- 스크롤 복원 보강(일정·라운지·팀상세·경기기록 — 실스크롤러에 훅), 공지 ‘오늘 더 보지 않기’ localStorage 화(웹뷰 재시작 초기화 버그), 알림함 세션 레이스 수정.
관리 기능 허브 일원화 (2026-07-25)
- 앱(novato_react)에서 제거:
/admin(공지 등록) ·/stats(DAU) ·/management(리그 관리) ·/highlights/:gameId(유튜브 스탯 입력) — 모두 novato_hub 로 이관 완료 (공지 관리는 동영상 지원 포함). 앱에는 공지 ‘열람’(팝업/배너/상세, 동영상 재생)과 하이라이트 재생만 유지.
푸시 알림 체계 (2026-07-25) → 앱-푸시알림
- 알림함 — 앱 상단 🔔, 최근 7일 수신 알림 최신순 + 탭 시 딥링크 이동.
app_notifications(RLS 본인만) + 7일 정리 크론. send-push 가 발송 시 유저별 자동 기록. - 알림 4종 —
notify-eventsEdge Function(문구 조합) + 크론/트리거: ① 아침(KST 09) 월요일 주간 일정·매일 오늘 경기·2일 전 본인 팀 경기 개인 알림 ② 결과(KST 08) 어제 결과+팀순위 ③ 커피타임 등록 시 별명+농담 ④ AI 프리뷰/리뷰 등록 시. 수신 대상은 승인+player 연결 계정만(push_audience()RPC). - 정기 테스트 알림(2시간 간격)은 별명 개인화. 앱 재설치 공지(announcements id 23) 게시.
OTA 트러블슈팅 (2026-07-23 저녁)
- OTA 미반영 원인 = R2 CORS — pub-*.r2.dev 가 CORS 헤더를 안 보내 웹뷰 fetch 의 manifest 조회가 조용히 실패.
selfHostedUpdater의 manifest 조회를 CapacitorHttp(네이티브, CORS 무관)로 교체(b91e48d)해 해결. 실기기(Z Fold)에서 다운로드→적용까지 logcat 검증 완료. - 적용 시점 주의: capgo 는 next 번들을 앱이 백그라운드로 갈 때 적용(installNext). 최근앱에서 강제 종료(force-stop)하면 적용 단계가 스킵됨 — 홈으로 나갔다가 다시 열면 반영.
허브 (novato_hub, 2026-07-23)
- 스탭 임명 회원 선택화 — 회원관리의 리그 역할 임명 폼: 이메일 자유입력 → 승인 회원 드롭다운(이름+이메일, 한글 정렬).
- 전 메뉴 테이블 정렬 — 공용
useSortable훅 +SortableTh컴포넌트로 선수관리·게임관리·리그관리·회원관리·커피타임·매니지먼트(경기·스탭)·관리자 승인 표 헤더 클릭 정렬(오름/내림차순, null 후순위).
남은 아이디어
- admin 통합 관리:
/stats(DAU)·/admin(공지) 등 관리 기능을 한 곳으로 통합(운영자 희망) → 웹-독립페이지
작성: 코드베이스(novato_react, novato_app) 분석 기반. 파일:line 근거는 각 세부 페이지 참조.