“돈의 흐름을 보이게 만들고, 목표는 진행률로 느끼게 하자.”
TL;DR
-
🎯 목표: 수입·지출 기록 + 목표(적립형) 진행률 시각화
-
⚙️ 스택: Spring Boot + JWT + MariaDB / React Native(Expo)
-
🧱 MVP 범위: 계정/카테고리/트랜잭션/목표 CRUD + 월별 통계 + 목표 진행률 API
-
🔒 보안: 비밀번호 해시(BCrypt), JWT 만료/재발급(추가 예정), 최소 데이터 수집
-
🪜 진행 방식: 백엔드 → RN 테스트 화면(카드/리스트) → 반복
1) 왜 이 앱인가? (Problem & Insight)
- ✍️ 기록의 번거로움: 입력은 간단해야 하고, 바로 요약/피드백이 보여야 지속된다.
- 👀 목표 체감의 부재: “얼마 모았는지”를 퍼센트/바로 즉시 가시화.
- 🧩 개인화 필요: 카테고리/계정은 사람마다 다름 → 사용자별 소유 데이터가 기본.
2) 타깃 페르소나
- 직장인/프리랜서 초보 가계부러: “월말에 어디로 샜지?”
- 적금·여행·장비 등 목표성 지출/적립이 있는 사용자
- 모바일 위주, 입력→즉시 반영되는 요약/진행률 선호
3) 성공 기준 (Definition of Success)
4) 범위 (MoSCoW)
- Must: 사용자 인증, 계정/카테고리/트랜잭션/목표 CRUD, 월 통계, 목표 진행률
- Should: 색상/아이콘 등 카테고리/목표 시각적 구분, 기본 검증/예외 공통 처리
- Could: 다국어(i18n), 다크모드, 간단한 온보딩, 금액 입력 UX 향상(+/- 토글)
- Won’t (MVP): 다중 통화, 은행 API 자동 동기화, 예산 초과 알림, 절감형 목표 자동 계산
5) 아키텍처 개요
[React Native(Expo, TS)]
⤷ Axios(Interceptor, JWT)
|
v
[Spring Boot API]
├─ Security(JWT) ─ Auth
├─ Domain: account/category/transaction/goal
└─ Stats service
|
v
[MariaDB]
- 전형적인 BFF 스타일 단일 백엔드 + 모바일 클라이언트
- 인증 토큰은 RN에서 보관 → Axios 인터셉터로 자동 첨부
6) 데이터 모델 (ERD - MVP)
User(id, email, password_hash, created_at)
Account(id, user_id, name, type[CASH|CARD|BANK], created_at)
Category(id, user_id, name, flow[INCOME|EXPENSE], color?, created_at)
Goal(id, user_id, title, target_amount, due_date, color?, created_at)
Transaction(
id, user_id, account_id, category_id,
flow[INCOME|EXPENSE], date, amount, memo?, goal_id?, created_at
)
# 목표 진행률(적립형):
# progress% = SUM(Transaction.amount WHERE goal_id AND flow=INCOME) / target_amount
7) 핵심 API (초안)
- Auth:
POST /api/auth/signup, POST /api/auth/login, GET /api/auth/me
- Account:
POST/GET/DELETE /api/accounts
- Category:
POST/GET/DELETE /api/categories?flow=INCOME|EXPENSE
- Transaction:
POST /api/transactions
GET /api/transactions?from=YYYY-MM-DD&to=YYYY-MM-DD&categoryId=&accountId=
DELETE /api/transactions/{id}
- Goal:
POST/GET/DELETE /api/goals, GET /api/goals/{id}/progress
- Stats:
GET /api/stats/monthly?year=2025&month=9
→ { incomeTotal, expenseTotal, net, byCategory[] }
세부 스키마/DTO는 구현 편에서 확정.
8) UX 플로우 (MVP)
- 로그인 → 홈 대시보드: 이번 달 수입/지출/순지출 + 목표 진행률 카드
- + 트랜잭션: 계정/카테고리/금액/일자/메모(+연결 목표 선택)
- 목표 탭: 목표 목록 + 진행률 바 / 새 목표 생성
- 통계 탭: 카테고리별 지출 원형, 월별 합계 바(후속)
9) 개인정보 & 보안
- 🔐 비밀번호: BCrypt 해시
- 🔑 JWT: 만료시간(1h), 리프레시/재발급은 후속(필요 시)
- 🧺 데이터 최소화: PII 최소 수집(이메일만), 금액/메모 외 민감 정보 저장 금지
- 📜 로그: 서버 처리 로그(금액/메모 원문 미노출), 접근 제어/예외 공통 처리
10) 성능/품질/운영
- 📦 DB 인덱스:
Transaction(userId, date), Transaction(goalId)
- 🧪 테스트: API 스모크 테스트(cURL/Swagger), RN E2E는 간단한 시나리오로 시작
- 🛠️ 운영 편의: Swagger UI, 간단 헬스체크, 프로필 분리(local/dev)
11) 수익화/확장(포스트-MVP)
- 💳 프리미엄: 목표 다중/복합, 절감형 목표, 예산/알림, 월간 리포트 PDF
- 🤝 공유: 커플/가족 목표 공유(권한), CSV/엑셀 임포트
- 🔌 연동: 카드/은행 API(국내 환경 고려 시 장기 과제)
- 📈 분석: 트렌드/추천(“이번 달 식비 과다, 다음 달 목표 조정?”)
12) 작업 방식 (DevCraft 규칙 반영)
- 백엔드 기능 만들면 → RN에서 테스트 화면 최소 구성으로 즉시 검증
- 기능 단위 작게, PR/커밋 메시지에 기능/엔드포인트/테스트 요약
- 문서는 Velog 시리즈로 동행(기획 1편 + 구현 기록)
13) Plan
기본 플랜
- [기획] 개인 재무 관리/목표 달성 앱 — MVP 설계서
- [백엔드 #1] 프로젝트 부트스트랩 + 인증/JWT + 도메인 엔티티/ERD 확정
- Gradle,
application.properties, Security/JWT, User/Account/Category/Goal/Transaction 엔티티 + 마이그레이션
- [백엔드 #2] CRUD + 통계/목표 진행률 API + Swagger 시연
- 각 도메인 CRUD,
/stats/monthly, /goals/{id}/progress, cURL/Swagger 테스트 로그
- [프론트 #1] RN(Expo) 템플릿 + 로그인/토큰 인터셉터 + 대시보드 카드
- Axios 인스턴스, Auth 플로우, 이번 달 합계/순지출/목표 진행률 카드 표시
- [프론트 #2] 트랜잭션 입력/목록 + 목표 탭 + 간단 차트(원형)
- 입력 UX, 목록/필터, 목표 진행률 바, 카테고리별 지출 차트
확장 플랜 (난이도↑ 시 분리)
- [백엔드 #3] 예외/검증/전역 핸들러 + 리프레시 토큰
- [프론트 #3] 월별 합계 차트 + 목표/카테고리 UI polishing
14) 마일스톤 제안 (가이드)
- M1: 백엔드 #1 완료 — Swagger에서 /auth, /domains 엔드포인트 보임
- M2: 백엔드 #2 완료 — 월 통계/목표 진행률 정상 응답
- M3: 프론트 #1 완료 — 로그인→대시보드 카드 표시
- M4: 프론트 #2 완료 — 트랜잭션 입력/목록/목표 탭 동작
15) 리스크 & 대응
- 🔄 데이터 입력 지속성: 입력 UX 최소화(최근 값 기억, 빠른 추가), RN 최적화
- 🧮 목표 모델 다양성: MVP는 적립형만, 절감형은 별도 모델로 후속
- 🔐 보안/토큰 만료: 초기엔 Access 토큰만 → 후속 글에서 Refresh 도입
16) 다음 글 예고
[백엔드 #1]: 프로젝트 생성, JWT 보안, 도메인 엔티티 & ERD 마무리, 실행/스모크 테스트까지!
참고/운영 메모
- GitHub: (작성 후 링크 업데이트 예정)
- 스키마/DTO/에러 모델은 구현 글에서 확정/문서화
application.properties 선호 정책 유지