- CLAUDE.md: Claude-Gemini 교차 토론 프로토콜 추가 - CLAUDE.md: 존재하지 않는 디렉토리 3개 제거 - analysis/fix-plan: 4 Phase 수정 계획 (Claude-Gemini 합의) - .claude/agents/: dev 리뷰 에이전트 9개 복사 - .claude/skills/: 프로젝트 스킬 4개 복사
227 lines
12 KiB
Markdown
227 lines
12 KiB
Markdown
# 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분*
|