향기 선택의 피로를 줄이고, 나만의 향기를 기억하게 하는 앱
- 앱명(한글): 섬유유연제 이상형 월드컵
- 앱명(영문): Fabric Softener Ideal Cup
- 패키지명: com.nextcreapps.softenerWorldcup
- 카테고리: 생활 / 라이프스타일
- 연령등급: 전체 이용가
- 개발사: NextCreapps
- 개발 기간: 2025.10.13 (월) - 2025.10.31 (금)
| 가치 영역 | 설명 |
|---|---|
| 선택의 단순화 | 섬유유연제 향이 너무 많아 고르기 어려운 문제를 문진과 이상형 월드컵으로 시각적·감성적으로 해결 |
| 취향 기억 | 이전에 선택했던 향기 데이터를 저장해, 다음 구매 시 쉽게 떠올릴 수 있음 |
| 개인화 경험 | 문진 결과가 메타데이터로 저장되어, 월드컵 진행 중 비교·조언 문구 제공 |
| 실질적 구매 연결 | 결과 화면에 쿠팡 파트너스 링크를 연결해 바로 구매 가능 |
| 감성적 재미 | 이상형 월드컵 형식으로 "테스트 놀이" 감성을 담아 SNS 공유와 바이럴 유도 |
- 사용 목적, 향기 타입, 지속력, 원산지, 가격대 선택 (5문항)
- 진행률 바 표시
- 메타데이터 생성하여 추천 알고리즘에 활용
- 16강 → 8강 → 4강 → 결승 형식
- 세로형 비교 UI (위/아래 구조)
- 스와이프 제스처 지원
- 제품 상세 비교 팝업
- 향 타입, 지속력, 가격, 원산지 비교
- 향 차트 시각화 (레이더 차트)
- 문진 결과 기반 추천 멘트 제공
- 우승 제품 상세 정보
- 쿠팡 구매 버튼 (파트너스 링크)
- 유사 제품 2개 추천
- "기억하기" 기능
- 날짜별 히스토리 카드 리스트
- 최대 10개 저장
- "다시 테스트" 버튼
- Framework: Flutter 3.x
- Language: Dart 3.x
- State Management: Provider / Riverpod
- UI Components: Material Design 3
- 쿠팡 파트너스: Deep Link 연동
- Google AdMob: 배너 및 전면 광고
lib/screens/home_screen.dart
구성 요소
- AppBar: 앱 로고 및 설정 버튼
- Body:
- 앱 소개 텍스트 ("향기 선택의 피로를 줄이고...")
- 메인 일러스트 이미지 (섬유유연제 병)
- "내 향 찾기 시작" 버튼 (Primary Button)
- "3분이면 끝!" 소요시간 안내
- "내 기록 보기" 텍스트 버튼
네비게이션
- "내 향 찾기 시작" → SurveyScreen
- "내 기록 보기" → HistoryScreen
- 설정 아이콘 → SettingsScreen
주요 위젯
ScaffoldColumnElevatedButtonImage.asset()Text()
lib/screens/survey_screen.dart
구성 요소
- AppBar:
- 뒤로가기 버튼
- 진행률 표시 (LinearProgressIndicator)
- "1/5" 페이지 표시
- Body:
- 질문 텍스트 (크고 명확한 폰트)
- 선택지 버튼들 (Grid 또는 List)
- "다음" 버튼 (선택 후 활성화)
5가지 문항
- 사용 목적: [일상용 / 특별한 날 / 선물용 / 아기용]
- 향기 타입: [플로럴 / 시트러스 / 머스크 / 우디 / 비누향]
- 지속력: [1주 / 2주 / 4주 이상]
- 원산지: [국산 / 수입 / 무관]
- 가격대: [저가(
10,000원) / 중가(10,00020,000원) / 고가(20,000원~)]
네비게이션
- 5문항 완료 후 → WorldCupScreen
- 뒤로가기 → 이전 문항 또는 HomeScreen
상태 관리
PageController(문항 전환)SurveyProvider(선택 데이터 저장)
주요 위젯
PageViewLinearProgressIndicatorGridView또는ListViewCard(선택지 버튼)
lib/screens/worldcup_screen.dart
구성 요소
- AppBar:
- 뒤로가기 버튼
- 현재 라운드 표시 ("16강 1/8")
- 진행률 바
- Body:
- 세로형 비교 레이아웃
- 상단 제품 카드
- 제품 이미지
- 브랜드명
- 제품명
- "선택" 버튼
- ℹ️ 정보 아이콘
- 구분선 (VS)
- 하단 제품 카드 (상단과 동일 구조)
- 상단 제품 카드
- 세로형 비교 레이아웃
제스처 기능
- 위로 스와이프 → 상단 제품 선택
- 아래로 스와이프 → 하단 제품 선택
- ℹ️ 버튼 탭 → 비교 팝업 표시
라운드 진행
- 16강 (8매치) → 8강 (4매치) → 4강 (2매치) → 결승 (1매치)
- 각 라운드 시작 시 애니메이션 효과
- 승자 선택 시 페이드 아웃 효과
네비게이션
- 결승 완료 → ResultScreen
- 뒤로가기 → 확인 다이얼로그 → SurveyScreen
상태 관리
WorldCupProvider(토너먼트 로직)- 제품 리스트 관리
- 매치 히스토리 저장
주요 위젯
GestureDetector(스와이프)AnimatedContainerHero(제품 이미지 전환)Stack(레이아웃)
lib/widgets/comparison_dialog.dart
구성 요소
- Dialog:
- 상단: "제품 비교" 타이틀, 닫기 버튼
- 중앙: 두 제품 비교 테이블
- 브랜드
- 제품명
- 향 타입
- 지속력
- 용량
- 가격
- 하단: 향 차트 (레이더 차트)
- 향 강도
- 달콤함
- 청량감
- 따뜻함
- AI 추천 멘트 (문진 결과 기반)
레이더 차트
fl_chart패키지 사용- 5개 지표 시각화
- 두 제품 오버레이 비교
주요 위젯
Dialog또는ModalBottomSheetTable(비교 표)RadarChart(fl_chart)RichText(추천 멘트)
lib/screens/result_screen.dart
구성 요소
- AppBar:
- "내 향 찾기 결과" 타이틀
- 공유 버튼
- Body (스크롤 가능):
- 우승 애니메이션 (Lottie 또는 Rive)
- 제품 이미지 (큰 사이즈)
- 브랜드 + 제품명
- 향 설명 텍스트
- 향 특징 태그 (Chip 위젯)
- 제품 상세 정보 카드
- 향 타입
- 지속력
- 용량
- 가격
- 향 레이더 차트
- "쿠팡에서 구매하기" 버튼 (Primary)
- "기억하기" 버튼 (Secondary)
- 구분선
- "이런 향도 좋아요" 섹션
- 유사 제품 2개 (가로 스크롤)
- Bottom:
- "다시 테스트하기" 버튼
네비게이션
- "쿠팡에서 구매하기" → 외부 브라우저 (url_launcher)
- "기억하기" → 저장 성공 스낵바 → HomeScreen
- "다시 테스트하기" → SurveyScreen
- 공유 버튼 → 결과 이미지 생성 → share_plus
주요 위젯
SingleChildScrollViewCardChip(태그)ElevatedButtonOutlinedButtonGridView(유사 제품)
lib/screens/history_screen.dart
구성 요소
- AppBar:
- "내 기록" 타이틀
- 전체 삭제 버튼 (트레일링)
- Body:
- 기록이 없을 때:
- 빈 상태 일러스트
- "아직 테스트 기록이 없어요" 메시지
- "지금 시작하기" 버튼
- 기록이 있을 때:
- 날짜별 기록 카드 리스트 (최신순)
- 날짜 및 시간
- 제품 썸네일 이미지
- 브랜드 + 제품명
- 향 타입 태그
- "다시 보기" 버튼
- 삭제 아이콘 (스와이프 또는 롱프레스)
- 날짜별 기록 카드 리스트 (최신순)
- 기록이 없을 때:
기록 카드 액션
- 탭 → ResultScreen (저장된 데이터로)
- 스와이프 → 삭제 확인 다이얼로그
- 최대 10개 저장
네비게이션
- "지금 시작하기" → SurveyScreen
- 카드 탭 → ResultScreen
- 뒤로가기 → HomeScreen
주요 위젯
ListView.builderDismissible(스와이프 삭제)CardListTileEmptyState(커스텀 위젯)
lib/screens/settings_screen.dart
구성 요소
- AppBar:
- "설정" 타이틀
- Body:
- 데이터 관리 섹션
- "기록 전체 삭제" ListTile
- 앱 정보 섹션
- "버전 정보" ListTile (v1.0.0)
- "개인정보처리방침" ListTile
- "이용약관" ListTile
- 고객 지원 섹션
- "피드백 보내기" ListTile
- "문의하기" ListTile (이메일)
- 기타 섹션
- "개발사 정보" ListTile
- 데이터 관리 섹션
액션
- "기록 전체 삭제" → 확인 다이얼로그 → 삭제 실행
- "개인정보처리방침" / "이용약관" → WebView
- "피드백 보내기" → 이메일 앱 열기 (url_launcher)
주요 위젯
ListViewListTileDividerAlertDialog
lib/
├── main.dart # 앱 진입점
├── screens/ # 화면
│ ├── home_screen.dart
│ ├── survey_screen.dart
│ ├── worldcup_screen.dart
│ ├── result_screen.dart
│ ├── history_screen.dart
│ └── settings_screen.dart
├── widgets/ # 재사용 위젯
│ ├── comparison_dialog.dart
│ ├── product_card.dart
│ ├── scent_radar_chart.dart
│ └── empty_state.dart
├── providers/ # 상태 관리
│ ├── survey_provider.dart
│ ├── worldcup_provider.dart
│ └── history_provider.dart
├── models/ # 데이터 모델
│ ├── product.dart
│ ├── survey_data.dart
│ └── record.dart
├── services/ # 서비스
│ ├── firebase_service.dart
│ ├── storage_service.dart
│ └── analytics_service.dart
├── utils/ # 유틸리티
│ ├── constants.dart
│ └── helpers.dart
└── assets/ # 리소스
├── images/
├── icons/
└── fonts/
실제 앱 아이콘 기반 색상 시스템 (lib/constants/app_colors.dart)
// Primary Colors
primaryPink: #FF9999
primaryRed: #D64457
// Secondary Colors
secondaryBeige: #F5E6D3
lightBeige: #FFF8F0
lightPink: #FFCCCC
// Base Colors
white: #FFFFFF
// Text Colors
textPrimary: #333333
textSecondary: #666666
textTertiary: #999999
// Button Colors
buttonPrimary: #D64457
buttonSecondary: #FF9999
// Background Colors
backgroundPrimary: #FFFFFF
backgroundSecondary: #FFF8F0
backgroundAccent: #FFCCCC- Headline: Pretendard Bold 24sp
- Title: Pretendard SemiBold 20sp
- Body: Pretendard Regular 16sp
- Caption: Pretendard Regular 14sp
- Small: 8dp
- Medium: 16dp
- Large: 24dp
- XLarge: 32dp
- Flutter 프로젝트 생성
- Flavor 설정 (Debug/Release)
- Firebase 프로젝트 연동
- iOS/Android 최소 버전 설정
- Firebase Core 설정
- Firebase Analytics 연동
- Firebase Crashlytics 설정 (iOS/Android)
- 에러 핸들링 구현
- Firebase Remote Config 연동 ⭐ NEW
- 강제 업데이트 기능
- 일반 업데이트 권장 기능
- 공지사항 팝업 기능
- 버전 비교 로직 구현
- 📄 설정 가이드:
/Downloads/FIREBASE_REMOTE_CONFIG_가이드.md - 📄 Console 가이드:
/Downloads/Firebase_Console_설정_단계별_가이드.md
-
앱 아이콘 및 런치 이미지 설정
- iOS 단일 스케일 앱 아이콘 (1024x1024)
- 런치 이미지 (1242x2688)
- 설명적인 파일명으로 정리
-
컬러 시스템 구현
- 앱 아이콘 색상 추출 및 분석
lib/constants/app_colors.dart생성- 전체 화면에 일관된 색상 적용
-
스플래시 화면 구현 ⭐ UPDATED
- 런치 이미지와 동일한 이미지로 자연스러운 전환
- Remote Config 초기화 및 버전 체크
- 강제/일반 업데이트 다이얼로그 표시
- 공지사항 팝업 표시
- 2.5초 최소 표시 시간
- 📄 구현 가이드:
/Downloads/splash_screen_implementation_guide.md
-
홈 화면 (HomeScreen)
- 앱 소개 및 시작 버튼
- 문진 스킵 다이얼로그
- 앱 컬러 시스템 적용
-
내 기록 화면 (HistoryScreen)
- 빈 상태 UI
- 앱 컬러 시스템 적용
-
설정 화면 (SettingsScreen)
- 버전 정보 표시 (package_info_plus)
- 문의하기 (이메일 연동)
- 디바이스 정보 자동 포함
- 앱 평가/공유 기능 (미지원 메시지)
- 핑크 배경 적용
- 하단 탭 네비게이션 (MainNavigationScreen)
- 홈
- 내 기록
- 설정
-
url_launcher- 외부 링크 및 이메일 -
package_info_plus- 앱 버전 정보 -
device_info_plus- 디바이스 정보 -
firebase_remote_config- 원격 설정 관리 -
shared_preferences- 로컬 저장소 -
json_annotation&json_serializable- JSON 직렬화
- 설정 페이지 구현 가이드 (
color_palette_implementation.md) - 스플래시 화면 구현 가이드 (
splash_screen_implementation_guide.md) - Firebase Remote Config 가이드 (
FIREBASE_REMOTE_CONFIG_가이드.md) - Firebase Console 설정 가이드 (
Firebase_Console_설정_단계별_가이드.md) - 개인정보 처리 방침 문서 (
AppStoreConnect_개인정보_문진표.md)
- 월드컵 화면 구현
- 문진 화면 구현
- 결과 화면 구현
- 제품 데이터 구조 설계
- 제품 비교 기능
- 레이더 차트 구현
- 기록 저장 기능
- 쿠팡 파트너스 연동
- 공유 기능
- AdMob 광고 통합
lib/
├── main.dart # 앱 진입점
├── main_debug.dart # 디버그 엔트리
├── main_release.dart # 릴리즈 엔트리
├── config/
│ └── flavor_config.dart # Flavor 설정
├── screens/ # 화면
│ ├── splash_screen.dart # ✅ 스플래시 화면 (Remote Config 통합)
│ ├── main_navigation_screen.dart # ✅ 하단 탭 네비게이션
│ ├── home_screen.dart # ✅ 홈 화면
│ ├── history_screen.dart # ✅ 내 기록 화면
│ ├── settings_screen.dart # ✅ 설정 화면
│ ├── survey_screen.dart # 🔄 문진 화면
│ ├── worldcup_screen.dart # 🔄 월드컵 화면
│ └── result_screen.dart # 🔄 결과 화면
├── widgets/ # ✅ NEW - 재사용 위젯
│ ├── force_update_dialog.dart # 강제 업데이트 다이얼로그
│ ├── update_dialog.dart # 일반 업데이트 다이얼로그
│ └── notice_dialog.dart # 공지사항 다이얼로그
├── models/ # ✅ NEW - 데이터 모델
│ ├── app_config.dart # Remote Config 모델
│ └── app_config.g.dart # JSON serialization (자동 생성)
├── services/ # ✅ NEW - 서비스 레이어
│ └── remote_config_service.dart # Firebase Remote Config 서비스
├── storage/ # ✅ NEW - 로컬 저장소
│ └── notice_storage.dart # 공지사항 표시 이력 관리
├── utils/ # ✅ NEW - 유틸리티
│ └── version_checker.dart # 버전 비교 로직
├── constants/
│ └── app_colors.dart # ✅ 컬러 시스템
└── assets/ # 리소스
└── images/
└── launch_image.png # ✅ 런치/스플래시 이미지
ios/
└── Runner/
└── Assets.xcassets/
├── AppIcon.appiconset/
│ └── app_icon.png # ✅ 앱 아이콘
└── LaunchImage.imageset/
└── launch_image.png # ✅ 런치 이미지
- Flutter SDK: 3.9.0 이상
- Dart SDK: 3.9.0 이상
- iOS: 12.0 이상
- Android: API 21 (Android 5.0) 이상
flutter run -t lib/main_debug.dartflutter run -t lib/main_release.dart --releaseflutter run -t lib/main_debug.dart -d [device-id]flutterfire configure --project=softener-worldcup --platforms=ios,android --out=lib/firebase_options.dart --yes본 앱은 Firebase Crashlytics와 Firebase Analytics를 통해 최소한의 데이터를 수집합니다.
| 유형 | 상세 내역 | 수집 목적 | 신원 연결 | 추적 사용 |
|---|---|---|---|---|
| 충돌 데이터 | 앱 크래시 로그, 스택 트레이스 | 앱 기능 (안정성 개선) | ❌ 아니요 | ❌ 아니요 |
| 실적 데이터 | 앱 실행 시간, 성능 지표 | 앱 기능 (성능 개선) | ❌ 아니요 | ❌ 아니요 |
| 제품 상호작용 | 화면 조회, 세션 데이터 | 앱 기능 (UX 개선) | ❌ 아니요 | ❌ 아니요 |
| 기기 ID | Firebase Installation ID | 앱 기능 (기기 구분) | ❌ 아니요 | ❌ 아니요 |
- ❌ 개인 식별 정보 (이름, 이메일, 전화번호 등)
- ❌ 위치 정보
- ❌ 사진, 연락처 등 사용자 콘텐츠
- ❌ 광고 추적 데이터
- 최소 수집: 앱 운영에 필요한 최소한의 데이터만 수집
- 익명화: 모든 데이터는 개인 신원과 연결되지 않음
- 투명성: 수집 데이터와 목적을 명확히 공개
- 보안: Firebase를 통한 안전한 데이터 전송
참고: 상세한 개인정보 처리 내역은
/Downloads/AppStoreConnect_개인정보_문진표.md참조
⚠️ 중요: 다음 기능 추가 시 이 섹션을 반드시 업데이트해야 합니다:
- 사용자 로그인/계정 기능
- 광고 추가
- 위치 정보 사용
- 타사 SDK 추가
- Firebase에 사용자 식별 정보 설정 (
setUserId등)
- 현재 버전: 1.0.0+6
- 최근 업데이트: 2025-10-22
- 개인정보 처리 방침 문서화
- App Store Connect 개인정보 문진표 작성