지난 몇 주 동안 부채, 대출, 상환을 추적하는 작은 앱 TinyDebt를 만들었습니다. 작고 집중된 앱을 만드는 분들께 도움이 될 수 있도록 그 뒤에 있는 몇 가지 기술적 결정을 공유하고 싶습니다.
🧩 만든 이유
친구 사이의 소소한 빚을 자꾸 잊어버렸는데, 기존 앱은 회원가입, 곳곳의 광고, 복잡한 금융 기능 때문에 무겁게 느껴졌습니다.
저는 다음과 같은 앱을 원했습니다.
- 즉시 열리고
- 3~5초 만에 부채를 추가할 수 있으며
- 오프라인에서 작동하고
- 앞으로도 계속 단순한 앱
그렇게 TinyDebt가 탄생했습니다.
⚙️ 기술 스택
TinyDebt는 의도적으로 가볍게 만들었습니다.
- 모바일용 React Native(Expo)
- AsyncStorage를 사용한 로컬 우선 방식
- 백엔드 없음 - 데이터는 기기에 저장됩니다(백업에만 Firebase 사용)
- 모든 곳에 TypeScript
- UI 라이브러리 대신 커스텀 컴포넌트로 만든 미니멀 UI
- EAS build를 통한 App Store 및 Google Play 패키징
사용자 계정도, 분석도, 필수 요소 외의 외부 의존성도 없습니다.
🗂️ 데이터 모델
모든 부채 항목은 다음과 같은 형태입니다.
type Debt = {
id: string;
name: string;
amount: number;
type: "owed" | "borrowed";
createdAt: number;
history: Repayment[];
};
type Repayment = {
amount: number;
date: number;
};모든 것을 직렬화 가능하게 유지하면 저장과 마이그레이션이 매우 쉬워집니다.
🧠 로컬 우선 UX
TinyDebt는 서버에 의존하지 않으므로:
- 동작이 즉시 반영되고
- 로딩이나 “동기화” 상태가 없으며
- 오래된 휴대폰에서도 빠르게 느껴집니다
작은 개인용 유틸리티에는 딱 맞는 방식입니다.
🎨 UI 철학
앱이 “차분하게” 느껴지길 원했습니다.
- 단순한 중성 색상
- 차트나 대시보드 없음
- 복잡함 없음 - 한 화면이 작업의 90%를 처리
- 빠른 입력을 위한 접근성 좋은 탭 영역
작은 앱이 유용하기 위해 복잡한 비주얼은 필요하지 않습니다.
📦 출시
- 출시 스토어: App Store
- 출시 스토어: Google Play
하지만 범위를 아주 작게 유지하고 싶습니다. 그게 핵심이니까요.
🙌 피드백 환영
모바일 앱을 만들거나 로컬 우선 유틸리티에 대한 생각이 있다면 피드백을 듣고 싶습니다. 앞으로도 계속 개선하겠습니다.
