주요 구현 완료 기능: - 구독 관리 (추가/편집/삭제/카테고리 분류) - 이벤트 할인 시스템 (기본값 자동 설정) - SMS 자동 스캔 및 구독 정보 추출 - 알림 시스템 (타임존 처리 안정화) - 환율 변환 지원 (KRW/USD) - 반응형 UI 및 애니메이션 - 다국어 지원 (한국어/영어) 버그 수정: - NotificationService tz.local 초기화 오류 해결 - MainScreenSummaryCard 레이아웃 오버플로우 수정 - 구독 추가 시 LateInitializationError 완전 해결 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
16 KiB
16 KiB
SubManager 프로젝트 분석
1. 개요
프로젝트 소개
SubManager는 포괄적인 구독 서비스 관리를 위해 설계된 정교한 Flutter 기반 모바일 애플리케이션입니다. 이 앱은 사용자가 반복 구독을 추적하고, 지출 패턴을 분석하며, 결제 알림을 받을 수 있도록 하면서, 서버리스 아키텍처를 통해 완전한 프라이버시를 유지합니다.
주요 발견사항
- 아키텍처: Provider 상태 관리를 사용한 잘 구조화된 MVVM 패턴
- 기술 스택: 로컬 저장소로 Hive를 사용하는 현대적인 Flutter 구현
- 핵심 혁신: SMS 기반 자동 구독 감지
- 프라이버시 중심: 서버 종속성 없이 모든 데이터를 로컬에 저장
- 플랫폼 지원: iOS, Android 및 부분적 웹 지원
- 현지화: 한국어 및 영어 지원
기술적 하이라이트
- 클린 아키텍처: 데이터, 비즈니스 로직, 프레젠테이션 계층 간의 명확한 분리
- 고급 기능: 생체 인증, 실시간 환율, 자동화된 알림
- 성능: Hive를 사용한 효율적인 로컬 저장소, 최적화된 애니메이션
- 디자인 시스템: 커스텀 테마와 그라데이션이 적용된 Material 3 구현
2. 아키텍처 개요
상위 수준 아키텍처 다이어그램
┌─────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Screens │ │ Widgets │ │ Theme │ │
│ └──────┬──────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼─────────────────┼─────────────────┼──────────┘
│ │ │
┌─────────┼─────────────────┼─────────────────┼──────────┐
│ │ State Management Layer │ │
│ ┌──────▼──────────────────▼────────────────▼──────┐ │
│ │ Provider Pattern │ │
│ │ (Subscription, Category, Notification, etc.) │ │
│ └──────────────────────┬──────────────────────────┘ │
└─────────────────────────┼──────────────────────────────┘
│
┌─────────────────────────┼──────────────────────────────┐
│ Business Logic Layer │
│ ┌──────────────┐ ┌───▼────────┐ ┌──────────────┐ │
│ │ Services │ │ Utils │ │ Models │ │
│ │ (SMS, Notif) │ │ (Format) │ │(Subscription)│ │
│ └──────┬───────┘ └──────┬──────┘ └──────┬───────┘ │
└─────────┼──────────────────┼────────────────┼──────────┘
│ │ │
┌─────────┼──────────────────┼────────────────┼──────────┐
│ │ Data Layer │ │
│ ┌──────▼───────┐ ┌──────▼──────┐ ┌─────▼───────┐ │
│ │ Local Storage│ │External APIs│ │Platform Chls│ │
│ │ (Hive) │ │(Exchange RT)│ │(SMS, Notif) │ │
│ └──────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
계층 설명
프레젠테이션 계층
- 화면: 앱의 다양한 측면을 관리하는 9개의 개별 화면
- 위젯: 일관된 스타일링을 가진 10개 이상의 재사용 가능한 컴포넌트
- 테마: 색상, 타이포그래피, 간격이 포함된 중앙화된 디자인 시스템
상태 관리 계층
- Provider 패턴: 다양한 도메인을 관리하는 5개의 전문화된 Provider
- 반응형 업데이트: UI 동기화를 위한 ChangeNotifier 패턴
- 의존성 주입: 클린 아키텍처를 위한 MultiProvider 설정
비즈니스 로직 계층
- 서비스: SMS 스캔, 알림 등을 위한 6개의 전문화된 서비스
- 유틸: 포맷팅, 애니메이션, 계산을 위한 헬퍼 함수
- 모델: Hive 영속성 지원이 포함된 데이터 구조
데이터 계층
- 로컬 저장소: 오프라인 우선 아키텍처를 위한 Hive NoSQL 데이터베이스
- 외부 API: 환율 API 통합
- 플랫폼 채널: 네이티브 SMS 및 알림 접근
데이터 흐름 패턴
-
사용자 인터랙션 흐름:
사용자 액션 → 화면 → Provider → 서비스 → 데이터 계층 ↑ ↓ └──────── 상태 업데이트 ←───────┘ -
SMS 감지 흐름:
SMS 권한 → 플랫폼 채널 → SMS 스캐너 → 패턴 분석 ↓ UI 업데이트 ← Provider 업데이트 ← 구독 생성 ←─┘ -
알림 흐름:
구독 데이터 → 알림 서비스 → 플랫폼 채널 ↓ 알림 스케줄링 → 시스템 전달
3. 기능 분석
핵심 기능 분해
1. 구독 관리
- 구현: Hive 영속성을 사용한 CRUD 작업
- 주요 컴포넌트:
- 코드 생성이 포함된
SubscriptionModel - 상태 관리를 위한
SubscriptionProvider - 표시를 위한
SubscriptionCard위젯
- 코드 생성이 포함된
- 기능:
- 폼 검증을 통한 수동 추가
- 편집/삭제 기능
- 카테고리 구성
- 다중 통화 지원 (KRW/USD)
2. SMS 자동 감지
- 구현: 패턴 인식과 함께 플랫폼 채널 통합
- 주요 컴포넌트:
- 정규식 패턴을 사용하는
SmsScanner서비스 - 서비스 식별을 위한
SubscriptionUrlMatcher - MethodChannel을 통한 네이티브 Android 구현
- 정규식 패턴을 사용하는
- 알고리즘:
- 서비스명별로 SMS 그룹화
- 반복 패턴 식별 (2회 이상 결제)
- 금액, 날짜, 서비스 정보 추출
- 웹사이트 URL 자동 제안
3. 재무 분석
- 구현: 차트 시각화와 함께 실시간 계산
- 주요 컴포넌트:
- 데이터 시각화를 위한
fl_chart - 다중 통화 계산을 위한
CurrencyUtil - 실시간 환율을 위한
ExchangeRateService
- 데이터 시각화를 위한
- 기능:
- 월별 지출 추세 (6개월 기록)
- 카테고리별 분포
- 총 비용 추적
- 통화 변환 표시
4. 알림 시스템
- 구현: 시간대 지원이 포함된 로컬 알림
- 주요 컴포넌트:
flutter_local_notifications통합- 스케줄링 로직이 포함된
NotificationService - 플랫폼별 구성
- 기능:
- 구성 가능한 알림 시간 (1-3일 전)
- 매일 알림 옵션
- 사용자 정의 알림 시간
- 자동 재스케줄링
5. 보안 기능
- 구현: 생체 인증 (현재 비활성화)
- 주요 컴포넌트:
local_auth패키지 통합- 민감한 데이터를 위한
flutter_secure_storage - 상태 관리를 위한
AppLockProvider
- 상태: 인프라는 구축되었지만 기능은 비활성화
통합 지점
-
플랫폼 통합:
- MethodChannel을 통한 Android SMS API
- iOS/Android 알림 시스템
- 생체 인증 API
- 파비콘 캐싱을 위한 파일 시스템
-
외부 서비스:
- USD/KRW 환율을 위한 ExchangeRate-API
- 파비콘 서비스 (여러 제공자)
- Google Mobile Ads (Android/iOS만)
-
데이터 동기화:
- Provider 패턴이 UI 일관성 보장
- 화면 간 반응형 업데이트
- Hive를 통한 영구 저장소
4. 기술 세부사항
의존성 분석
핵심 의존성
- 상태 관리:
provider: ^6.1.1 - 로컬 저장소:
hive: ^2.2.3,hive_flutter: ^1.1.0 - UI/UX:
fl_chart: ^0.66.2,font_awesome_flutter: ^10.7.0 - 플랫폼 기능:
local_auth: ^2.1.6,telephony: ^0.2.0 - 유틸리티:
intl: ^0.19.0,uuid: ^4.2.1,timezone: ^0.9.2
개발 의존성
- 코드 생성:
build_runner: ^2.4.6,hive_generator: ^2.0.1 - 린팅:
flutter_lints: ^2.0.0
플랫폼 고려사항
Android
- 최소 SDK: Flutter 기본값에 의해 결정
- 자동 감지를 위한 SMS 권한 필요
- 네이티브 광고 통합
- SMS 접근을 위한 MethodChannel
iOS
- iOS 11.0+ (의존성 기반)
- 알림 권한 필요
- 생체 인증 지원
- 네이티브 광고 통합
Web (부분 지원)
- SMS 기능 비활성화
- 알림 기능 비활성화
- 대체 파비콘 로딩 전략
- 네이티브 광고 대신 플레이스홀더 광고
성능 고려사항
-
메모리 관리:
- 파비콘을 위한 효율적인 이미지 캐싱
- 구독 목록의 지연 로딩
- 애니메이션 컨트롤러의 적절한 해제
-
저장소 최적화:
- 빠른 로컬 쿼리를 위한 Hive 박스
- 선택적 데이터 로딩
- 생성된 어댑터를 사용한 효율적인 데이터 모델
-
UI 성능:
- 적절한 커브를 사용한 부드러운 애니메이션
- 스켈레톤 로딩 상태
- Provider를 통한 최적화된 재빌드
5. 코드 구성
디렉터리 구조 분석
lib/
├── l10n/ # 현지화 파일
├── main.dart # 애플리케이션 진입점
├── models/ # Hive 어댑터가 포함된 데이터 모델
├── navigator_key.dart # 전역 네비게이션
├── providers/ # 상태 관리 프로바이더
├── screens/ # UI 화면 (9개 화면)
├── services/ # 비즈니스 로직 서비스
├── temp/ # 개발용 테스트 데이터
├── theme/ # 디자인 시스템 구현
├── utils/ # 헬퍼 함수
└── widgets/ # 재사용 가능한 UI 컴포넌트
명명 규칙
- 파일: snake_case (예:
subscription_card.dart) - 클래스: PascalCase (예:
SubscriptionProvider) - 변수: camelCase (예:
monthlyCost) - 상수: UPPER_SNAKE_CASE 또는 camelCase
- 비공개 멤버: 선행 언더스코어 (예:
_isLoading)
사용된 디자인 패턴
-
MVVM 아키텍처:
- Models: 데이터 구조
- View-Models: Provider
- Views: 화면 및 위젯
-
Provider 패턴:
- 상태 관리
- 의존성 주입
- 반응형 프로그래밍
-
싱글톤 패턴:
ExchangeRateService- 전역 네비게이션 키
-
팩토리 패턴:
- 맵에서 모델 생성
- 위젯 빌더
-
옵저버 패턴:
- ChangeNotifier 구현
- 스트림 구독
6. 권장사항
잠재적 개선사항
-
코드 품질:
- 포괄적인 단위 테스트 추가
- 통합 테스트 구현
- 코드 문서화 추가
- 개발자 README 작성
-
아키텍처:
- 데이터 접근을 위한 Repository 패턴 고려
- 적절한 오류 처리 전략 구현
- 로깅/분석 프레임워크 추가
- 추상 서비스 인터페이스 생성
-
기능:
- 앱 잠금 기능 활성화 및 테스트
- 데이터 내보내기/가져오기 기능 추가
- 구독 공유 기능 구현
- 예산 알림 추가
-
성능:
- 큰 목록을 위한 지연 로딩 구현
- SMS 스캔을 위한 페이지네이션 추가
- 이미지 로딩 최적화
- 상태 영속성 고려
보안 고려사항
-
데이터 보호:
- 앱 잠금 기능 활성화
- 민감한 정보에 대한 데이터 암호화 구현
- 안전한 백업 기능 추가
- 생체 인증을 위한 PIN 폴백 추가 고려
-
프라이버시:
- SMS 권한 사용 검토
- 개인정보 처리방침 화면 추가
- 데이터 삭제 옵션 구현
- GDPR 준수 기능 추가
-
API 보안:
- API 키 로테이션 구현
- 요청 서명 추가
- 인증서 고정 사용
- 속도 제한 구현
확장성 제안
-
데이터 관리:
- 오래된 구독에 대한 데이터 아카이빙 구현
- 검색 기능 추가
- 데이터 마이그레이션 전략 수립
- 클라우드 동기화 옵션 고려
-
기능 확장:
- 가족 공유 추가
- 구독 추천 기능 구현
- 지출 목표 생성
- 영수증 스캔 추가
-
플랫폼 확장:
- 웹 지원 완성
- 데스크톱 애플리케이션 고려
- 태블릿 최적화 레이아웃 추가
- 워치 앱 컴패니언 구현
7. 부록
파일 목록 요약
- 총 Dart 파일: 50개 이상
- 화면: 9개의 주요 화면
- 위젯: 10개 이상의 재사용 가능한 컴포넌트
- 서비스: 6개의 비즈니스 로직 서비스
- 프로바이더: 5개의 상태 관리 프로바이더
- 모델: Hive 지원이 포함된 3개의 데이터 모델
주요 코드 패턴
Provider 설정 예시
final provider = Provider.of<SubscriptionProvider>(context);
await provider.loadSubscriptions();
서비스 패턴 예시
class ExchangeRateService {
static final instance = ExchangeRateService._();
Future<double> getExchangeRate() async {...}
}
모델 패턴 예시
@HiveType(typeId: 0)
class SubscriptionModel extends HiveObject {
@HiveField(0)
final String id;
// ... 다른 필드
}
API/서비스 매핑
-
외부 API:
- 환율:
https://api.exchangerate-api.com/v4/latest/USD - 파비콘 서비스: 중복성을 위한 여러 제공자
- 환율:
-
플랫폼 채널:
- SMS 채널:
com.submanager/sms - 메서드:
getSmsMessages,checkSmsPermission,requestSmsPermission
- SMS 채널:
-
로컬 저장소 키:
- 구독:
subscriptions박스 - 카테고리:
categories박스 - 앱 잠금:
app_lock박스 - 설정: 보안 저장소의 다양한 키
- 구독:
개발 노트
- 테스트 데이터:
/lib/temp/test_sms_data.dart에서 사용 가능 - 디버그 모드: 실제 메시지 대신 테스트 SMS 데이터 사용
- 플랫폼 감지: 웹용 자동 기능 비활성화
- 현지화: 한국어와 영어를 지원하며 쉽게 확장 가능
이 분석은 SubManager 프로젝트의 포괄적인 개요를 제공하며, 잘 설계된 아키텍처, 강력한 기능 세트 및 미래 개선 가능성을 강조합니다. 코드베이스는 사용자 경험과 유지보수성에 초점을 맞춘 전문적인 Flutter 개발 관행을 보여줍니다.