7.5 KiB
7.5 KiB
Subscription Manager - 아키텍처 설계
개요
이 문서는 Subscription Manager 앱의 전체 아키텍처와 주요 컴포넌트 간의 관계를 설명합니다. Flutter 기반의 모바일 앱으로, 로컬 데이터베이스를 활용한 구독 서비스 관리 기능을 제공합니다.
아키텍처 원칙
- 관심사 분리: UI, 비즈니스 로직, 데이터 액세스 계층을 명확히 분리
- 단방향 데이터 흐름: 상태 관리의 예측 가능성 보장
- 모듈화: 기능별 모듈 분리로 유지보수성 향상
- 확장성: 향후 클라우드 연동 등을 고려한 설계
아키텍처 다이어그램
┌─────────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Screens│ │ Widgets│ │ Themes │ │ Routes │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────┐
│ Business Logic Layer │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Providers│ │ Services│ │ Helpers │ │ Models │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────┐
│ Data Layer │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Repository│ │ Database│ │ Storage │ │ API │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
주요 컴포넌트 설명
1. Presentation Layer (프레젠테이션 계층)
- Screens: 사용자에게 표시되는 화면 (홈, 구독 목록, 상세 정보 등)
- Widgets: 재사용 가능한 UI 컴포넌트 (구독 카드, 차트, 입력 폼 등)
- Themes: 앱 전체 테마 및 스타일 정의
- Routes: 화면 간 네비게이션 관리
2. Business Logic Layer (비즈니스 로직 계층)
- Providers: 상태 관리 및 UI와 데이터 계층 연결 (Provider 패턴 활용)
- Services: 비즈니스 로직 처리 (구독 관리, 알림, 분석 등)
- Helpers: 유틸리티 함수 (날짜 계산, 통화 변환 등)
- Models: 데이터 모델 클래스 (구독, 카테고리, 결제 등)
3. Data Layer (데이터 계층)
- Repository: 데이터 액세스 추상화 계층
- Database: SQLite 데이터베이스 관리 (sqflite)
- Storage: 로컬 저장소 관리 (shared_preferences, secure_storage)
- API: 향후 클라우드 연동을 위한 API 클라이언트 (MVP 이후)
디렉토리 구조
lib/
├── main.dart # 앱 진입점
├── app.dart # 앱 설정 및 테마
├── screens/ # 화면 컴포넌트
│ ├── home/ # 홈 화면 관련 파일
│ ├── subscriptions/ # 구독 관리 화면 관련 파일
│ ├── analytics/ # 분석 화면 관련 파일
│ └── settings/ # 설정 화면 관련 파일
├── widgets/ # 공통 위젯
│ ├── subscription_card.dart
│ ├── charts/
│ └── forms/
├── providers/ # 상태 관리
│ ├── subscription_provider.dart
│ ├── settings_provider.dart
│ └── analytics_provider.dart
├── services/ # 비즈니스 로직
│ ├── subscription_service.dart
│ ├── notification_service.dart
│ └── analytics_service.dart
├── models/ # 데이터 모델
│ ├── subscription.dart
│ ├── category.dart
│ └── payment.dart
├── repositories/ # 데이터 액세스
│ ├── subscription_repository.dart
│ └── settings_repository.dart
├── database/ # 데이터베이스 관리
│ ├── database_helper.dart
│ └── migrations/
├── utils/ # 유틸리티
│ ├── date_utils.dart
│ ├── currency_utils.dart
│ └── constants.dart
└── localization/ # 다국어 지원
├── app_localizations.dart
├── en.dart
└── ko.dart
데이터 흐름
- 사용자 입력: UI 이벤트 발생 (버튼 클릭, 폼 제출 등)
- Provider 호출: 상태 관리 계층에서 이벤트 처리
- Service 호출: 비즈니스 로직 실행
- Repository 호출: 데이터 액세스 추상화 계층 통해 데이터 요청
- Database 접근: 로컬 데이터베이스에서 데이터 읽기/쓰기
- 결과 반환: 데이터베이스 → Repository → Service → Provider → UI
상태 관리 전략
- Provider 패턴: Flutter의 Provider 패키지를 활용한 상태 관리
- 단방향 데이터 흐름: 상태 변경은 Provider를 통해서만 이루어짐
- 반응형 UI: 상태 변경 시 자동으로 UI 업데이트
- 상태 격리: 기능별로 별도의 Provider를 사용하여 상태 관리 복잡성 감소
오프라인 지원
- 모든 데이터는 로컬 데이터베이스에 저장되어 오프라인에서도 앱 사용 가능
- 향후 클라우드 동기화 기능 추가 시에도 오프라인 우선 전략 유지
보안 전략
- 민감한 결제 정보는 flutter_secure_storage를 사용하여 암호화 저장
- 앱 잠금 기능 제공 (PIN, 생체 인증 등)
- 데이터 백업 파일 암호화
확장성 계획
- 클라우드 동기화: 향후 Firebase 또는 자체 백엔드 서버와 연동
- 웹 버전: 동일한 비즈니스 로직을 공유하는 웹 클라이언트 개발
- API 연동: 구독 서비스 제공업체의 API와 연동하여 자동 데이터 수집
성능 최적화
- 데이터베이스 인덱싱 전략
- 이미지 캐싱 및 최적화
- 지연 로딩 및 페이지네이션 적용
- 메모리 사용량 모니터링 및 최적화