Skip to content

isGeekCode/softener-worldcup-app

Repository files navigation

🌸 섬유유연제 이상형 월드컵

향기 선택의 피로를 줄이고, 나만의 향기를 기억하게 하는 앱



📌 앱 기본 정보

  • 앱명(한글): 섬유유연제 이상형 월드컵
  • 앱명(영문): Fabric Softener Ideal Cup
  • 패키지명: com.nextcreapps.softenerWorldcup
  • 카테고리: 생활 / 라이프스타일
  • 연령등급: 전체 이용가
  • 개발사: NextCreapps
  • 개발 기간: 2025.10.13 (월) - 2025.10.31 (금)



🎯 앱의 가치

가치 영역 설명
선택의 단순화 섬유유연제 향이 너무 많아 고르기 어려운 문제를 문진과 이상형 월드컵으로 시각적·감성적으로 해결
취향 기억 이전에 선택했던 향기 데이터를 저장해, 다음 구매 시 쉽게 떠올릴 수 있음
개인화 경험 문진 결과가 메타데이터로 저장되어, 월드컵 진행 중 비교·조언 문구 제공
실질적 구매 연결 결과 화면에 쿠팡 파트너스 링크를 연결해 바로 구매 가능
감성적 재미 이상형 월드컵 형식으로 "테스트 놀이" 감성을 담아 SNS 공유와 바이럴 유도



🏆 주요 기능

1. 취향 분석 문진

  • 사용 목적, 향기 타입, 지속력, 원산지, 가격대 선택 (5문항)
  • 진행률 바 표시
  • 메타데이터 생성하여 추천 알고리즘에 활용

2. 이상형 월드컵 토너먼트

  • 16강 → 8강 → 4강 → 결승 형식
  • 세로형 비교 UI (위/아래 구조)
  • 스와이프 제스처 지원
  • 제품 상세 비교 팝업

3. 제품 비교 기능

  • 향 타입, 지속력, 가격, 원산지 비교
  • 향 차트 시각화 (레이더 차트)
  • 문진 결과 기반 추천 멘트 제공

4. 맞춤 추천 결과

  • 우승 제품 상세 정보
  • 쿠팡 구매 버튼 (파트너스 링크)
  • 유사 제품 2개 추천
  • "기억하기" 기능

5. 선택 기록 관리

  • 날짜별 히스토리 카드 리스트
  • 최대 10개 저장
  • "다시 테스트" 버튼



🛠 기술 스택

Frontend

  • Framework: Flutter 3.x
  • Language: Dart 3.x
  • State Management: Provider / Riverpod
  • UI Components: Material Design 3

수익화

  • 쿠팡 파트너스: Deep Link 연동
  • Google AdMob: 배너 및 전면 광고



📱 화면 구조

1. 홈 화면 (HomeScreen)

lib/screens/home_screen.dart

구성 요소

  • AppBar: 앱 로고 및 설정 버튼
  • Body:
    • 앱 소개 텍스트 ("향기 선택의 피로를 줄이고...")
    • 메인 일러스트 이미지 (섬유유연제 병)
    • "내 향 찾기 시작" 버튼 (Primary Button)
    • "3분이면 끝!" 소요시간 안내
    • "내 기록 보기" 텍스트 버튼

네비게이션

  • "내 향 찾기 시작" → SurveyScreen
  • "내 기록 보기" → HistoryScreen
  • 설정 아이콘 → SettingsScreen

주요 위젯

  • Scaffold
  • Column
  • ElevatedButton
  • Image.asset()
  • Text()



2. 문진 화면 (SurveyScreen)

lib/screens/survey_screen.dart

구성 요소

  • AppBar:
    • 뒤로가기 버튼
    • 진행률 표시 (LinearProgressIndicator)
    • "1/5" 페이지 표시
  • Body:
    • 질문 텍스트 (크고 명확한 폰트)
    • 선택지 버튼들 (Grid 또는 List)
    • "다음" 버튼 (선택 후 활성화)

5가지 문항

  1. 사용 목적: [일상용 / 특별한 날 / 선물용 / 아기용]
  2. 향기 타입: [플로럴 / 시트러스 / 머스크 / 우디 / 비누향]
  3. 지속력: [1주 / 2주 / 4주 이상]
  4. 원산지: [국산 / 수입 / 무관]
  5. 가격대: [저가(10,000원) / 중가(10,00020,000원) / 고가(20,000원~)]

네비게이션

  • 5문항 완료 후 → WorldCupScreen
  • 뒤로가기 → 이전 문항 또는 HomeScreen

상태 관리

  • PageController (문항 전환)
  • SurveyProvider (선택 데이터 저장)

주요 위젯

  • PageView
  • LinearProgressIndicator
  • GridView 또는 ListView
  • Card (선택지 버튼)



3. 월드컵 화면 (WorldCupScreen)

lib/screens/worldcup_screen.dart

구성 요소

  • AppBar:
    • 뒤로가기 버튼
    • 현재 라운드 표시 ("16강 1/8")
    • 진행률 바
  • Body:
    • 세로형 비교 레이아웃
      • 상단 제품 카드
        • 제품 이미지
        • 브랜드명
        • 제품명
        • "선택" 버튼
        • ℹ️ 정보 아이콘
      • 구분선 (VS)
      • 하단 제품 카드 (상단과 동일 구조)

제스처 기능

  • 위로 스와이프 → 상단 제품 선택
  • 아래로 스와이프 → 하단 제품 선택
  • ℹ️ 버튼 탭 → 비교 팝업 표시

라운드 진행

  • 16강 (8매치) → 8강 (4매치) → 4강 (2매치) → 결승 (1매치)
  • 각 라운드 시작 시 애니메이션 효과
  • 승자 선택 시 페이드 아웃 효과

네비게이션

  • 결승 완료 → ResultScreen
  • 뒤로가기 → 확인 다이얼로그 → SurveyScreen

상태 관리

  • WorldCupProvider (토너먼트 로직)
  • 제품 리스트 관리
  • 매치 히스토리 저장

주요 위젯

  • GestureDetector (스와이프)
  • AnimatedContainer
  • Hero (제품 이미지 전환)
  • Stack (레이아웃)

4. 비교 팝업 (ComparisonDialog)

lib/widgets/comparison_dialog.dart

구성 요소

  • Dialog:
    • 상단: "제품 비교" 타이틀, 닫기 버튼
    • 중앙: 두 제품 비교 테이블
      • 브랜드
      • 제품명
      • 향 타입
      • 지속력
      • 용량
      • 가격
    • 하단: 향 차트 (레이더 차트)
      • 향 강도
      • 달콤함
      • 청량감
      • 따뜻함
    • AI 추천 멘트 (문진 결과 기반)

레이더 차트

  • fl_chart 패키지 사용
  • 5개 지표 시각화
  • 두 제품 오버레이 비교

주요 위젯

  • Dialog 또는 ModalBottomSheet
  • Table (비교 표)
  • RadarChart (fl_chart)
  • RichText (추천 멘트)



5. 결과 화면 (ResultScreen)

lib/screens/result_screen.dart

구성 요소

  • AppBar:
    • "내 향 찾기 결과" 타이틀
    • 공유 버튼
  • Body (스크롤 가능):
    • 우승 애니메이션 (Lottie 또는 Rive)
    • 제품 이미지 (큰 사이즈)
    • 브랜드 + 제품명
    • 향 설명 텍스트
    • 향 특징 태그 (Chip 위젯)
    • 제품 상세 정보 카드
      • 향 타입
      • 지속력
      • 용량
      • 가격
    • 향 레이더 차트
    • "쿠팡에서 구매하기" 버튼 (Primary)
    • "기억하기" 버튼 (Secondary)
    • 구분선
    • "이런 향도 좋아요" 섹션
      • 유사 제품 2개 (가로 스크롤)
  • Bottom:
    • "다시 테스트하기" 버튼

네비게이션

  • "쿠팡에서 구매하기" → 외부 브라우저 (url_launcher)
  • "기억하기" → 저장 성공 스낵바 → HomeScreen
  • "다시 테스트하기" → SurveyScreen
  • 공유 버튼 → 결과 이미지 생성 → share_plus

주요 위젯

  • SingleChildScrollView
  • Card
  • Chip (태그)
  • ElevatedButton
  • OutlinedButton
  • GridView (유사 제품)



6. 내 기록 화면 (HistoryScreen)

lib/screens/history_screen.dart

구성 요소

  • AppBar:
    • "내 기록" 타이틀
    • 전체 삭제 버튼 (트레일링)
  • Body:
    • 기록이 없을 때:
      • 빈 상태 일러스트
      • "아직 테스트 기록이 없어요" 메시지
      • "지금 시작하기" 버튼
    • 기록이 있을 때:
      • 날짜별 기록 카드 리스트 (최신순)
        • 날짜 및 시간
        • 제품 썸네일 이미지
        • 브랜드 + 제품명
        • 향 타입 태그
        • "다시 보기" 버튼
        • 삭제 아이콘 (스와이프 또는 롱프레스)

기록 카드 액션

  • 탭 → ResultScreen (저장된 데이터로)
  • 스와이프 → 삭제 확인 다이얼로그
  • 최대 10개 저장

네비게이션

  • "지금 시작하기" → SurveyScreen
  • 카드 탭 → ResultScreen
  • 뒤로가기 → HomeScreen

주요 위젯

  • ListView.builder
  • Dismissible (스와이프 삭제)
  • Card
  • ListTile
  • EmptyState (커스텀 위젯)



7. 설정 화면 (SettingsScreen)

lib/screens/settings_screen.dart

구성 요소

  • AppBar:
    • "설정" 타이틀
  • Body:
    • 데이터 관리 섹션
      • "기록 전체 삭제" ListTile
    • 앱 정보 섹션
      • "버전 정보" ListTile (v1.0.0)
      • "개인정보처리방침" ListTile
      • "이용약관" ListTile
    • 고객 지원 섹션
      • "피드백 보내기" ListTile
      • "문의하기" ListTile (이메일)
    • 기타 섹션
      • "개발사 정보" ListTile

액션

  • "기록 전체 삭제" → 확인 다이얼로그 → 삭제 실행
  • "개인정보처리방침" / "이용약관" → WebView
  • "피드백 보내기" → 이메일 앱 열기 (url_launcher)

주요 위젯

  • ListView
  • ListTile
  • Divider
  • AlertDialog



📂 프로젝트 구조

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



🚀 개발 진행 상황

✅ 완료된 작업

1. 프로젝트 초기 설정

  • Flutter 프로젝트 생성
  • Flavor 설정 (Debug/Release)
  • Firebase 프로젝트 연동
  • iOS/Android 최소 버전 설정

2. Firebase 통합

  • Firebase Core 설정
  • Firebase Analytics 연동
  • Firebase Crashlytics 설정 (iOS/Android)
  • 에러 핸들링 구현
  • Firebase Remote Config 연동 ⭐ NEW
    • 강제 업데이트 기능
    • 일반 업데이트 권장 기능
    • 공지사항 팝업 기능
    • 버전 비교 로직 구현
    • 📄 설정 가이드: /Downloads/FIREBASE_REMOTE_CONFIG_가이드.md
    • 📄 Console 가이드: /Downloads/Firebase_Console_설정_단계별_가이드.md

3. UI/UX 구현

  • 앱 아이콘 및 런치 이미지 설정

    • 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)
    • 문의하기 (이메일 연동)
    • 디바이스 정보 자동 포함
    • 앱 평가/공유 기능 (미지원 메시지)
    • 핑크 배경 적용

4. 네비게이션

  • 하단 탭 네비게이션 (MainNavigationScreen)
    • 내 기록
    • 설정

5. 패키지 통합

  • url_launcher - 외부 링크 및 이메일
  • package_info_plus - 앱 버전 정보
  • device_info_plus - 디바이스 정보
  • firebase_remote_config - 원격 설정 관리
  • shared_preferences - 로컬 저장소
  • json_annotation & json_serializable - JSON 직렬화

6. 문서화

  • 설정 페이지 구현 가이드 (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.dart

릴리즈 모드

flutter run -t lib/main_release.dart --release

특정 디바이스 지정

flutter run -t lib/main_debug.dart -d [device-id]

Firebase 설정

flutterfire configure --project=softener-worldcup --platforms=ios,android --out=lib/firebase_options.dart --yes



🔒 개인정보 처리 방침

데이터 수집 현황 (v1.0.0+6 기준)

본 앱은 Firebase CrashlyticsFirebase Analytics를 통해 최소한의 데이터를 수집합니다.

수집하는 데이터 유형

유형 상세 내역 수집 목적 신원 연결 추적 사용
충돌 데이터 앱 크래시 로그, 스택 트레이스 앱 기능 (안정성 개선) ❌ 아니요 ❌ 아니요
실적 데이터 앱 실행 시간, 성능 지표 앱 기능 (성능 개선) ❌ 아니요 ❌ 아니요
제품 상호작용 화면 조회, 세션 데이터 앱 기능 (UX 개선) ❌ 아니요 ❌ 아니요
기기 ID Firebase Installation ID 앱 기능 (기기 구분) ❌ 아니요 ❌ 아니요

수집하지 않는 데이터

  • ❌ 개인 식별 정보 (이름, 이메일, 전화번호 등)
  • ❌ 위치 정보
  • ❌ 사진, 연락처 등 사용자 콘텐츠
  • ❌ 광고 추적 데이터

데이터 보호 원칙

  1. 최소 수집: 앱 운영에 필요한 최소한의 데이터만 수집
  2. 익명화: 모든 데이터는 개인 신원과 연결되지 않음
  3. 투명성: 수집 데이터와 목적을 명확히 공개
  4. 보안: Firebase를 통한 안전한 데이터 전송

참고: 상세한 개인정보 처리 내역은 /Downloads/AppStoreConnect_개인정보_문진표.md 참조

⚠️ 중요: 다음 기능 추가 시 이 섹션을 반드시 업데이트해야 합니다:

  • 사용자 로그인/계정 기능
  • 광고 추가
  • 위치 정보 사용
  • 타사 SDK 추가
  • Firebase에 사용자 식별 정보 설정 (setUserId 등)



📝 버전 정보

  • 현재 버전: 1.0.0+6
  • 최근 업데이트: 2025-10-22
    • 개인정보 처리 방침 문서화
    • App Store Connect 개인정보 문진표 작성

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages