자영업자를 위한 개인 웹 가계부 서비스 (PWA)
배포 URL: https://budget-3wb.pages.dev
| 영역 | 기술 | 선택 이유 |
|---|---|---|
| Frontend | React 19 + TypeScript | 화면이 많은 앱을 컴포넌트 단위로 관리 + 타입 안정성 |
| 스타일 | Tailwind CSS v4 | 다크모드·반응형을 빠르게 처리 |
| 빌드 | Vite | 빠른 개발 서버 + PWA 플러그인 지원 |
| 백엔드 | Cloudflare Pages Functions (Edge) | 프론트/API 한 프로젝트 배포, 서버리스라 운영 부담 최소화 Pages Functions가 서버리스 백엔드 역할 |
| DB | Cloudflare D1 (SQLite) | Pages와 같은 생태계라 바로 연동, 가볍고 저비용 |
| 스토리지 | Cloudflare R2 | 카드 이미지(공개)/메모 첨부(비공개) 접근 제어 필요해서 채택 |
| 인증 | PBKDF2 + 세션 쿠키 | 외부 서비스 의존 없이 직접 구현 ("왜 자체 구현했나" → "비용/의존성 줄이려고" + "왜 안전한가" → "PBKDF2 반복 해싱 + salt”) |
| 알림 | Web Push (VAPID) + Service Worker | 앱 설치 없이 브라우저 푸시 알림 구현 |
| 스케줄링 | Cloudflare Workers Cron | 매일 정해진 시간 배치 작업(정산 알림) 처리 |
| 내보내기 | xlsx (SheetJS) | 원금/할인/실결제 분리해서 엑셀 다운로드 |
컴포넌트 구조
components/ 하위에 화면 단위 컴포넌트 분리 (TransactionForm, OverviewView, CardManager, BudgetManager, NotesView 등)ui/Card.tsx 등으로 재사용재사용 UI 패턴
ReorderableChipList.tsx 공용 컴포넌트로 통일전역 상태 관리 (Context API)
AuthContext: 로그인 상태ThemeContext: 라이트/다크 테마ToastContext: 토스트 알림(Undo 액션 버튼 지원)ConfirmContext: PWA standalone 모드에서 window.confirm()이 안 먹는 문제 대응용 커스텀 확인 다이얼로그API/캐시 레이어 (lib/)
api.ts: 공통 API 호출 + 에러 처리billing.ts, cardDateUtils.ts: 카드 청구 기간 계산 로직categories.ts, merchants.ts, paymentMethods.ts 등: 서버 동기화 데이터 캐시exportExcel.ts: 엑셀 내보내기PWA 처리
sw.ts(커스텀 Service Worker)에서 프리캐시 + Push 알림 핸들러 직접 구현반응형
main 브랜치 push 시 GitHub Actions가 자동 빌드 → Cloudflare Pages 배포npm run deploynpx wrangler d1 execute 직접 실행 필요workers/card-settlement-notifier, 동일 D1 DB 공유)