# Askii Never Die - Full Project Audit Report **분석일**: 2026-03-27 **분석 도구**: 9개 개발 리뷰 에이전트 (Claude-Gemini 교차 토론 적용) **프로젝트**: Askii Never Die (오프라인 방치형 Idle RPG, Flutter) **규모**: 61,000 LOC / 224개 Dart 파일 / 247개 테스트 (전부 통과) --- ## Project Health Score: 49 / 100 | # | 영역 | 점수 | 가중치 | 가중 점수 | 핵심 이슈 | |---|------|:----:|:------:|:---------:|-----------| | 1 | Architecture | 5/10 | 15% | 7.5 | 인터페이스 0개, DI 부재, 싱글톤 6개, 엔진에 프레임워크 직접 의존 | | 2 | Code Quality | 6/10 | 15% | 9.0 | 200 LOC 초과 47.6%, God Widget 2개, 100% 중복 파일 1쌍 | | 3 | Security | 5/10 | 15% | 7.5 | IAP 로컬 영수증 검증 미구현, 세이브 무결성 없음, 구매 상태 평문 저장 | | 4 | Performance | 7/10 | 10% | 7.0 | 매 50ms setState 전체 리빌드, 서비스 객체 반복 생성, SFX 캐싱 부재 | | 5 | Test Coverage | 5/10 | 10% | 5.0 | 파일 커버리지 10%, 저장/전투틱/Model 직렬화 테스트 전무 | | 6 | Supply Chain | 6/10 | 10% | 6.0 | 폰트 라이선스 미포함, google_mobile_ads 2 메이저 뒤처짐 | | 7 | Docs Sync | 5/10 | 5% | 2.5 | CLAUDE.md에 존재하지 않는 디렉토리 3개, README 극빈약 | | 8 | DevOps | 2/10 | 10% | 2.0 | CI/CD 완전 부재, 릴리즈 프로세스 미정립 | | 9 | Idea Alignment | 22/100 | 10% | 2.2 | 완전 피벗 (RPS 격투 -> Idle RPG), 피벗 후 시장 재분석 없음 | | | **합계** | | **100%** | **48.7** | | > **점수 해석**: 49점대는 "동작하는 프로토타입~알파" 수준. 제품으로서 기능하지만 프로덕션 배포에 필요한 품질/운영 기반이 미비. > **참고**: Keystore Git 노출은 개인 Git 서버에서 사용자가 허가한 사항이므로 이슈에서 제외. IAP는 서버가 없는 구조이므로 로컬 검증 강화 방안으로 조정. --- ## CRITICAL Issues (즉시 조치 필요) ### 1. CI/CD 파이프라인 완전 부재 [DevOps] - **영향**: 빌드/테스트/린트 모두 수동. 깨진 코드 push 가능 - **조치**: Gitea Actions 또는 GitHub Actions로 `dart format` + `flutter analyze` + `flutter test` 자동화 - **예상 공수**: 반나절 ### 2. AdMob 미디에이션 미구현 [Idea Alignment + Security] - **영향**: AdMob 계정 정지 = 수익 즉시 소멸 (인디 개발자 가장 흔한 수익 소멸 시나리오) - **조치**: AppLovin MAX 또는 IronSource 연동 - **예상 공수**: 2-3일 --- ## HIGH Issues (단기 조치) ### 3. IAP 로컬 영수증 서명 검증 미구현 [Security] - **파일**: `lib/src/core/engine/iap_service.dart:332-336` - **영향**: 서버 없이도 로컬 서명 검증으로 캐주얼 크래킹(Lucky Patcher 등) 방어 가능 - **조치**: - **Google Play**: `purchase.verificationData.localVerificationData`에서 서명된 JSON 추출 -> Google Play Console의 공개 키(Base64 RSA)로 `RSASSA-PKCS1-v1_5 + SHA1` 서명 검증. `pointycastle` 패키지 활용 - **Apple**: StoreKit 2의 JWS(JSON Web Signature) 토큰을 로컬에서 Apple 루트 인증서로 검증 - **구매 상태 저장**: `shared_preferences` -> `flutter_secure_storage` (Android Keystore / iOS Keychain) - **공수**: 1-2일 - **한계**: 루팅+후킹 조합 공격은 로컬 검증으로 완전 차단 불가. 그러나 90%+ 캐주얼 크래킹 방어 가능 ### 4. 구매 상태 평문 저장 [Security] - **파일**: `iap_service.dart:65-66`, `monetization_state.dart:17-45` - **조치**: shared_preferences -> flutter_secure_storage 전환 (3번 작업과 동시 진행) - **공수**: 반나절 ### 5. 세이브 파일 무결성 없음 [Security] - **파일**: `save_service.dart:17-20` - **조치**: HMAC-SHA256 체크섬 추가. 키는 앱 번들에 난독화 포함 - **공수**: 반나절 ### 6. Analytics 부재 [Idea Alignment] - **영향**: DAU, 리텐션, 광고 시청률, IAP 전환율 측정 불가 - **조치**: Firebase Analytics 또는 PostHog 연동 - **공수**: 1일 ### 7. 인터페이스 0개 + DI 부재 [Architecture] - **영향**: 테스트 격리 불가, 싱글톤 6개로 모킹 원천 봉쇄 - **조치**: GetIt 또는 생성자 주입 도입, 핵심 서비스 abstract class 정의 - **공수**: 3-5일 (점진적) ### 8. 매 50ms 전체 위젯 setState [Performance] - **파일**: `game_play_screen.dart:352-368` - **영향**: 모바일 프레임 드롭 원인 1순위 - **조치**: ValueNotifier/Selector로 세분화된 상태 관리 - **공수**: 1-2일 ### 9. 저장 시스템 테스트 전무 [Test Coverage] - **파일**: `save_repository.dart`, `save_service.dart`, `save_manager.dart` (6개 파일 모두) - **영향**: 세이브 파일 손상 시 플레이어 데이터 영구 손실 - **조치**: IOOverrides/임시 디렉토리 기반 저장/로드/삭제 테스트 작성 - **공수**: 1일 --- ## MEDIUM Issues (중기 개선) ### 10. 폰트 라이선스 파일 미포함 [Supply Chain] - JetBrainsMono (OFL), PressStart2P (OFL) LICENSE 파일 `assets/fonts/`에 추가 필수 ### 11. google_mobile_ads 5.3.0 -> 7.0.0 업그레이드 [Supply Chain] - iOS Privacy Manifest 미대응으로 App Store 심사 거절 리스크 ### 12. God Widget 2개 분할 [Code Quality] - `game_play_screen.dart` (736 LOC), `arena_battle_screen.dart` (759 LOC) ### 13. progress_service.dart 832 LOC 분할 [Code Quality] - Quest/Plot/Exp/Combat 서비스로 분리 ### 14. 100% 중복 파일 제거 [Code Quality] - `features/arena/widgets/ascii_disintegrate_widget.dart` 삭제 (shared/ 버전 사용) ### 15. CLAUDE.md 디렉토리 구조 수정 [Docs Sync] - `core/animation/` -> `shared/animation/`, `core/constants/` 삭제, `core/l10n/` -> `shared/l10n/` ### 16. README 전면 재작성 [Docs Sync] - 현재 프로젝트 초기 임시 메모 수준. 6개 화면, 수익화, 다국어 지원 등 전혀 반영 안 됨 ### 17. 크래시 리포팅 도입 [DevOps] - Firebase Crashlytics 또는 Sentry ### 18. 엔진 계층 프레임워크 오염 제거 [Architecture] - `ad_service.dart`, `iap_service.dart` 등을 `core/infrastructure/`로 이동 ### 19. 피벗 후 시장 재분석 [Idea Alignment] - "오프라인 Idle RPG + ASCII 아트" 시장 분석이 전무. idea-market-intel 재실행 필요 --- ## LOW Issues (장기) - cupertino_icons 미사용 제거 (~280KB 절약) - SFX 에셋 프리로드 및 캐싱 - 모바일 포그라운드 복귀 시 전체 화면 재생성 최적화 - gcd_simulation_test/balance_analysis_test를 실제 assert 포함 테스트로 전환 - analysis_options.yaml lint rule 추가 (prefer_const_constructors, prefer_final_locals 등) - CHANGELOG에 실제 릴리즈 이력 기록 - Model 직렬화 라운드트립 테스트 작성 --- ## Fix Plan (Eisenhower Matrix) ``` 긴급 (Urgent) 비긴급 (Not Urgent) ┌──────────────────────────┬──────────────────────────┐ 중요 │ DO FIRST (즉시) │ SCHEDULE (계획) │ (Important) │ │ │ │ 1. CI/CD 구축 │ 7. 인터페이스+DI 도입 │ │ 2. AdMob 미디에이션 │ 12. God Widget 분할 │ │ 3. IAP 로컬 서명 검증 │ 13. progress_service 분할│ │ 4. 구매 상태 보안 저장 │ 18. 엔진 프레임워크 분리 │ │ 5. 세이브 무결성 추가 │ 19. 피벗 후 시장 재분석 │ │ 10. 폰트 라이선스 추가 │ 17. 크래시 리포팅 도입 │ ├──────────────────────────┼──────────────────────────┤ 덜 중요 │ DELEGATE (위임 가능) │ ELIMINATE (후순위) │ (Less │ │ │ Important) │ 6. Analytics 연동 │ 14. 중복 파일 제거 │ │ 8. setState 세분화 │ 15. CLAUDE.md 수정 │ │ 9. 저장 시스템 테스트 │ 16. README 재작성 │ │ 11. google_mobile_ads 7.x│ + LOW 이슈 전체 │ └──────────────────────────┴──────────────────────────┘ ``` --- ## 실행 로드맵 (권장 순서) ### Phase 1: 보안 강화 + DevOps 기반 (2-3일) ``` 1. CI 파이프라인 구축 (dart format + analyze + test) → verify: push 시 자동 실행 2. 폰트 라이선스 파일 추가 → verify: assets/fonts/에 LICENSE.txt 존재 3. IAP 로컬 영수증 서명 검증 구현 (Google Play 공개키 RSA 검증) → verify: 검증 실패 시 구매 거부 테스트 4. 구매 상태 flutter_secure_storage 전환 → verify: 기존 테스트 통과 5. 세이브 파일 HMAC 체크섬 추가 → verify: 변조된 세이브 로드 거부 테스트 ``` ### Phase 2: 수익 보호 (3-5일) ``` 1. AdMob 미디에이션 연동 (AppLovin MAX) → verify: AdMob 비활성 시 백업 네트워크 로드 2. google_mobile_ads 7.x 마이그레이션 → verify: iOS Privacy Manifest 포함 확인 3. CHANGELOG 정리 + 버전 태그 체계 수립 → verify: git tag 존재 ``` ### Phase 3: 아키텍처 개선 (1-2주, 점진적) ``` 1. 핵심 서비스 인터페이스 정의 (SaveRepository, AdService, IAPService) 2. DI 컨테이너(GetIt) 도입 3. ad_service, iap_service를 core/infrastructure/로 이동 4. GamePlayScreen setState 세분화 5. 저장 시스템 테스트 작성 ``` ### Phase 4: 콘텐츠/성장 (2주+) ``` 1. Firebase Analytics 연동 2. Crashlytics 연동 3. 피벗 후 시장 재분석 (idea-market-intel 실행) 4. Web meta 태그 수정 + ASO 최적화 5. README / CLAUDE.md / ARCHITECTURE.md 동기화 ``` --- ## 에이전트별 상세 리포트 참조 | 에이전트 | 점수 | 주요 발견 | |---------|:----:|----------| | Architecture | 5/10 | 인터페이스 0개, 싱글톤 6개, core/engine/ Flutter 오염 6파일, app.dart God Class 459 LOC | | Code Quality | 6/10 | dart format/analyze 통과, 200 LOC 초과 100개(47.6%), God Widget 2개, var 31회 남용 | | Security | 5/10 | IAP 로컬 서명 검증 미구현, 세이브 무결성 없음, 구매 상태 평문 저장 | | Supply Chain | 6/10 | CVE 0, GPL 0, 폰트 라이선스 미포함, google_mobile_ads 2메이저 뒤처짐 | | Performance | 7/10 | 50ms setState 전체 리빌드, 서비스 객체 매틱 재생성, SFX 캐싱 부재, RepaintBoundary 활용 양호 | | Test Coverage | 5/10 | 247개 테스트 전통과, 파일 커버리지 10%, 저장/전투틱/Model 직렬화 테스트 전무 | | Docs Sync | 5/10 | CLAUDE.md 존재하지 않는 경로 3개, README 극빈약, CHANGELOG 릴리즈 이력 없음 | | DevOps | 2/10 | CI/CD 완전 부재, 릴리즈 프로세스 미정립, Crashlytics 없음 | | Idea Alignment | 22/100 | 완전 피벗 (RPS -> Idle RPG), 수익화만 일치, 피벗 후 시장 재분석 없음, Analytics 부재 | --- ## 제외된 이슈 | 이슈 | 제외 사유 | |------|----------| | Keystore + 비밀번호 Git 노출 | 개인 Git 서버(Gitea)에서 사용자가 허가한 운영 방식 | | IAP 서버 측 영수증 검증 | 서버 없는 오프라인 앱 구조. 로컬 서명 검증으로 대체 권고 | --- *이 보고서는 Claude-Gemini 교차 토론을 통해 합의된 결과입니다.* *9개 에이전트 병렬 실행, 총 분석 시간: ~6분*