제로에서 SaaS까지: 2025년에 Flutter + Supabase로 수익성 있는 모바일 앱 구축
발행: (2025년 12월 10일 오전 08:55 GMT+9)
5 min read
원문: Dev.to
Source: Dev.to
아키텍처
클린 아키텍처는 앱이 성장함에 따라 유지보수가 쉽도록 합니다. 레이어 간 연결은 다음과 같습니다:
┌──────────────────────────────┐
│ FLUTTER APP │
└──────────────────────────────┘
│
┌──────────────────────────┼──────────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ PRESENTATION │ │ DOMAIN │ │ DATA │
│───────────────│ │─────────────────│ │─────────────────│
│ • Widgets │ ──▶ │ • Use Cases │ ──▶ │ • Repositories │
│ • BLoC/Cubit │ │ • Entities │ │ • Data Sources │
│ • Riverpod │ │ • Business Logic│ │ • Models │
└───────────────┘ └─────────────────┘ └─────────────────┘
│
┌──────────────────────────────────┼──────────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ SUPABASE │ │ REVENUECAT │ │ LOCAL CACHE │
│─────────────────│ │─────────────────│ │─────────────────│
│ • PostgreSQL │ │ • Subscriptions │ │ • Hive/SQLite │
│ • Auth │ │ • Receipts │ │ • Shared Prefs │
│ • Storage │ │ • Analytics │ │ │
│ • Edge Functions│ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
1단계: 비용 분석
Google Play 개발자 계정
| 항목 | 비용 | 주기 |
|---|---|---|
| 등록 | $25 | 일회성 |
| 연회비 | $0 | – |
| Apple (선택) | $99 | 연간 |
Google Play 서비스 수수료
| 수익 구간 | Google 수수료 | 내가 받는 비율 |
|---|---|---|
| 연간 첫 $1M | 15% | 85% |
| $1M 이상 | 30% | 70% |
| 구독 1년 차 | 15% | 85% |
| 구독 2년 차 이상 | 10% | 90% |
💡 전문가 팁: 구독자를 12개월 이상 유지하면 Google은 10%만 차감합니다.
대체 결제 (EEA)
유럽 경제 지역에서는 4% 할인 → 15% 대신 11% 적용됩니다.
2단계: Supabase 백엔드
무료 플랜 vs 프로 비교
| 기능 | 무료 플랜 | 프로 ($25/월) |
|---|---|---|
| 데이터베이스 | 500 MB | 8 GB |
| 스토리지 | 1 GB | 100 GB |
| 대역폭 | 5 GB | 250 GB |
| MAU | 50,000 | 100,000 |
| Edge Functions | 500K/월 | 2M/월 |
| Realtime | 200 연결 | 500 연결 |
| 백업 | ❌ | 매일 |
| 일시정지 | 1주 비활동 후 | 없음 |
⚠️ 무료 프로젝트는 1 주간 비활동 시 일시정지됩니다. 유료 사용자가 생기면 바로 업그레이드하세요.
3단계: 구독 흐름
USER JOURNEY
═══════════
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ User │ ──────▶ │ Paywall │ ──────▶ │ Google │ ──────▶ │ Success │
│ Taps │ │ Screen │ │ Play │ │ 🎉 │
│ Upgrade │ │ │ │ Billing │ │ │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ BACKEND FLOW │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Google Play ──▶ RevenueCat ──▶ Webhook ──▶ Supabase Edge Func │
│ │ │ │ │ │
│ [Receipt] [Validate] [Notify] [Update DB] │
│ │
└─────────────────────────────────────────────────────────────────────┘
4단계: Flutter 코드 설정
의존성
# pubspec.yaml
dependencies:
flutter:
sdk: flutter
supabase_flutter: ^2.0.0
purchases_flutter: ^6.0.0 # RevenueCat
flutter_bloc: ^8.1.0
get_it: ^7.6.0 # Dependency Injection
Supabase 초기화
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:flutter/widgets.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Supabase.initialize(
url: 'YOUR_SUPABASE_URL',
anonKey: 'YOUR_ANON_KEY',
);
runApp(MyApp());
}
final supabase = Supabase.instance.client;
RevenueCat 구매 서비스
import 'package:purchases_flutter/purchases_flutter.dart';
class PurchaseService {
static Future<void> init() async {
await Purchases.configure(
PurchasesConfiguration('your_revenuecat_api_key'),
);
}
static Future<List<Package>> getOfferings() async {
final offerings = await Purchases.getOfferings();
return offerings.current?.availablePackages ?? [];
}
static Future<bool> purchase(Package package) async {
try {
final result = await Purchases.purchasePackage(package);
return result.customerInfo.entitlements.active.containsKey('premium');
} catch (_) {
return false;
}
}
static Future<bool> isPremium() async {
final customerInfo = await Purchases.getCustomerInfo();
return customerInfo.entitlements.active.containsKey('premium');
}
}
5단계: 가격 전략
추천 요금제
| 플랜 | 가격 | 전환율 | 비고 |
|---|---|---|---|
| 주간 | $2.99 | 47% 선택 | 낮은 약정 |
| 월간 | $9.99 | 표준 | 가장 흔함 |
| 연간 | $49.99 | 최고의 가치 | 58% 절감 |
| 평생 | $99.99 | 높은 LTV | 가격 기준점 |
2025년 주요 통계
| 지표 | 값 |
|---|---|
| 평균 구독 가격 | $10.20/월 |
| 7일 체험 전환율 | 5.2% |
| 체험이 LTV를 높이는 비율 | 최대 64% |
| 주간 구독 인기 비율 | 47% 전체 구독 |
📊 계산식: 100명 × $9.99 × 85% = $849/월
실제 인디 개발자 수입
수입 분포
| 수준 | 월 수익 | 비율 |
|---|---|---|
| 대부분 첫 앱 | < $100 총합 | ~60% |
| 고군분투 | $0 – $500 | ~25% |
| 지속 가능 | $1K – $5K | ~10% |
| 성공 | $5K – $20K | ~4% |
| 최고 실적 | $20K+ | ~1% |
성공 사례
| 앱 | 수익 | 기간 |
|---|---|---|
| Postiz | $2K MRR | 4개월 |
| Formula Bot | $220K MRR | 18개월 |
| ShipFast | $133K/월 | 진행 중 |
| Itemlist | $1.4K/월 | 3가지 요금제 |
| Xnapper | $150K 판매 | 21개월 |
전체 기술 스택
스택 개요
| 계층 | 기술 | 비용 |
|---|---|---|
| 프론트엔드 | Flutter 3.x + Riverpod/BLoC | 무료 |
| 백엔드 | Supabase (Postgres + Auth) | 무료 → $25/월 |
| 결제 | RevenueCat | 무료 → 매출 비율 |
| 스토어 | Google Play | $25 일회성 |
| 스토어 (iOS) | App Store | $99/년 |
시작 비용
┌───