From 5f724f4dd6da5f6aad652d45dc8d81f7ba7c6e2e Mon Sep 17 00:00:00 2001 From: sanjeok77 Date: Wed, 4 Mar 2026 01:32:28 +0900 Subject: [PATCH] Update README.md - clean up and simplify --- README.md | 264 ++++++++++++++++-------------------------------------- 1 file changed, 78 insertions(+), 186 deletions(-) diff --git a/README.md b/README.md index c3c543f..b199a2f 100644 --- a/README.md +++ b/README.md @@ -1,234 +1,126 @@ -# 핫딜 알람 Android 앱 +# 핫딜 알람 (HotDeal Alarm) -## 프로젝트 개요 +Android 핫딜 모니터링 앱 - 뽐뿌, 클리앙, 루리웹, 쿨엔조이의 핫딜을 실시간으로 수집하고 키워드 알림을 제공합니다. -Android 12 (API 31) ~ Android 16 최신 버전을 지원하는 프로덕션 수준의 핫딜 알람 앱입니다. +## 지원 사이트 -### 지원 사이트 -- **뽐뿌** (ppomppu, ppomppu4, ppomppu8, money) -- **클리앙** (allsell, jirum) -- **루리웹** (1020, 600004) -- **쿨엔조이** (jirum) -- ~~퀘이사존~~ (제거됨 - Cloudflare 보호) +| 사이트 | 게시판 | 색상 | +|--------|--------|------| +| **뽐뿌** | 뽐뿌게시판, 해외뽐뿌, 알리뽐뿌, 재태크포럼 | 핑크 | +| **클리앙** | 사고팔고, 알뜰구매 | 초록 | +| **루리웹** | 핫딜/예판 유저, 핫딜/예판 업체 | 파랑 | +| **쿨엔조이** | 알뜰구매 | 주황 | -- **뽐뿌** (ppomppu, ppomppu4, ppomppu8, money) -- **클리앙** (allsell, jirum) -- **루리웹** (1020, 600004) -- **쿨엔조이** (jirum) -- **퀘이사존** (qb_saleinfo) +## 주요 기능 -### 주요 기능 -- ✅ 사이트/게시판 선택적 모니터링 -- ✅ 키워드 기반 필터링 알림 -- ✅ 백그라운드 폴링 (WorkManager) -- ✅ 로컬 알림 시스템 -- ✅ 핫딜 히스토리 관리 -- ✅ Android 12-16 완벽 지원 +### 🔍 핫딜 수집 +- 4개 사이트 동시 모니터링 +- 각 사이트별 최대 20개씩 수집 +- 사이트별 색상 구분 (뱃지) +- 게시판 표시 이름 (예: ppomppu8 → 알리뽐뿌) ---- +### 🔔 알림 시스템 +- 키워드 기반 필터링 +- 키워드 매칭 시 즉시 알림 +- 일반 핫딜도 알림 제공 +- 알림 ON/OFF 설정 가능 + +### 🎨 UI/UX +- Material Design 3 +- 사이트 필터 (전체/개별 사이트) +- 제목 검색 기능 +- 다크 모드 지원 +- 로딩 스켈레톤 +- 애니메이션 효과 + +### ⚙️ 설정 +- 사이트/게시판 ON/OFF +- 키워드 추가/삭제 +- 폴링 주기 설정 +- 알림 설정 ## 기술 스택 -### Core -- **Kotlin 1.9.22** -- **Coroutines + Flow** (비동기 처리) -- **Hilt** (의존성 주입) -- **Jetpack Compose** (UI) - -### Data -- **Room 2.6.1** (로컬 데이터베이스) -- **DataStore** (설정 저장) -- **OkHttp 4.12.0** (HTTP 클라이언트) -- **Jsoup 1.17.2** (HTML 파싱) - -### Background -- **WorkManager 2.9.0** (주기적 폴링) - -### Architecture -- **MVVM + Clean Architecture (3-layer)** -- **Repository Pattern** -- **Single Activity Architecture** - ---- +| 분야 | 기술 | +|------|------| +| **언어** | Kotlin 1.9.22 | +| **UI** | Jetpack Compose | +| **아키텍처** | MVVM + Clean Architecture | +| **DI** | Hilt | +| **DB** | Room 2.6.1 | +| **백그라운드** | WorkManager 2.9.0 | +| **네트워크** | Jsoup 1.17.2 | +| **비동기** | Coroutines + Flow | ## 프로젝트 구조 ``` com.hotdeal.alarm/ -├── di/ # Hilt DI 모듈 -│ ├── DatabaseModule.kt -│ └── NetworkModule.kt -│ ├── data/ -│ ├── local/db/ # Room 데이터베이스 -│ │ ├── entity/ # Entity 클래스 -│ │ ├── dao/ # DAO 인터페이스 -│ │ ├── AppDatabase.kt -│ │ └── Converters.kt -│ └── remote/ -│ ├── scraper/ # 사이트별 스크래퍼 -│ └── interceptor/ # OkHttp 인터셉터 -│ +│ ├── local/db/ # Room (Entity, DAO, Database) +│ ├── remote/scraper/ # 사이트별 스크래퍼 +│ └── remote/interceptor/# OkHttp 인터셉터 ├── domain/ -│ └── model/ # 도메인 모델 -│ ├── HotDeal.kt -│ ├── SiteConfig.kt -│ ├── Keyword.kt -│ └── SiteType.kt -│ +│ └── model/ # HotDeal, SiteType, Keyword 등 ├── presentation/ -│ ├── main/ # 메인 화면 -│ ├── settings/ # 설정 화면 -│ ├── deallist/ # 핫딜 목록 화면 -│ └── components/ # 재사용 컴포넌트 -│ -├── worker/ # WorkManager Worker -│ ├── HotDealPollingWorker.kt -│ └── WorkerScheduler.kt -│ -├── service/ # 서비스 -│ └── NotificationService.kt -│ -└── util/ # 유틸리티 - ├── Constants.kt - └── BootReceiver.kt +│ ├── main/ # 메인 화면, ViewModel +│ ├── deallist/ # 핫딜 목록, 필터 +│ ├── settings/ # 설정 화면 +│ └── components/ # DealItem, EmptyState 등 +├── worker/ # HotDealPollingWorker +├── service/ # NotificationService +└── di/ # Hilt 모듈 ``` ---- - ## 빌드 방법 ### 요구사항 -- Android Studio Hedgehog 이상 +- Android Studio Hedgehog+ - JDK 17 - Android SDK 35 -### 빌드 명령어 +### Debug APK ```bash -cd android_app ./gradlew assembleDebug ``` -### APK 설치 (WSL 환경) -WSL에서 Windows ADB를 사용하여 설치: -```bash -# Windows ADB 경로 (WSL에서) -/mnt/c/Users/$USER/AppData/Local/Android/Sdk/platform-tools/adb.exe install app/build/outputs/apk/debug/app-debug.apk -``` - -또는 PowerShell/CMD에서: -```powershell -adb install "\\wsl.localhost\Ubuntu\home\work\hotdeal_alarm\app\build\outputs\apk\debug\app-debug.apk" -``` - -```bash -cd android_app -./gradlew assembleDebug -``` - -### 릴리즈 빌드 +### Release APK ```bash ./gradlew assembleRelease ``` ---- +### 설치 (Windows ADB) +```bash +/mnt/c/Users/$USER/AppData/Local/Android/Sdk/platform-tools/adb.exe \ + install app/build/outputs/apk/debug/app-debug.apk +``` + +## 안티 차단 (Anti-Bot) + +- **요청 간격**: 2~4초 랜덤 대기 +- **User-Agent 회전**: 5개 브라우저 랜덤 선택 +- **Referer 헤더**: 각 사이트별 적절한 Referer 설정 +- **독립적 실행**: 한 사이트 실패필도 나머지 정상 작동 ## 권한 -### 필수 권한 -| 권한 | 용도 | Android 버전 | -|------|------|--------------| -| INTERNET | 웹 스크래핑 | 모든 버전 | -| FOREGROUND_SERVICE | 백그라운드 폴링 | 모든 버전 | -| POST_NOTIFICATIONS | 알림 표시 | Android 13+ | -| SCHEDULE_EXACT_ALARM | 정확한 알람 | Android 12+ | -| RECEIVE_BOOT_COMPLETED | 부팅 시 자동 시작 | 모든 버전 | - ---- - -## 백그라운드 폴링 전략 - -### WorkManager 기반 -| 간격 | 전략 | 설명 | -|------|------|------| -| 1-2분 | Foreground Service | 빈번한 폴링 (알림 표시) | -| 3-5분 | PeriodicWorkManager | 표준 폴링 | -| 15분+ | PeriodicWorkManager | 배터리 최적화 모드 | - -### Constraints -- 네트워크 연결 필요 -- 배터리 부족 시 실행 안 함 -- Doze 모드 대응 - ---- - -## 알림 시스템 - -### Notification Channels -| Channel | 중요도 | 용도 | -|---------|--------|------| -| hotdeal_urgent | HIGH | 키워드 매칭 핫딜 | -| hotdeal_normal | DEFAULT | 새로운 핫딜 | -| hotdeal_background | LOW | 폴링 상태 | - ---- - -## 스크래핑 구현 - -### Anti-Bot 대응 -1. **User-Agent 회전**: Android Chrome, Desktop Chrome 등 번갈아 사용 -2. **Rate Limiting**: 요청 간 최소 3초 대기 -3. **Retry with Backoff**: 실패 시 지수 백오프로 재시도 -4. **Header 조작**: Referer, Accept-Language 등 추가 - -### Cloudflare 대응 -- ~~퀘이사존~~ 제거됨 - -- 퀘이사존은 Cloudflare 보호가 적용될 수 있음 -- 일반 HTTP 요청으로 차단될 경우 WebView 기반 bypass 고려 - ---- +| 권한 | 용도 | +|------|------| +| `INTERNET` | 웹 스크래핑 | +| `POST_NOTIFICATIONS` | 알림 표시 (Android 13+) | +| `RECEIVE_BOOT_COMPLETED` | 부팅 시 자동 시작 | +| `FOREGROUND_SERVICE` | 백그라운드 작업 | ## 테스트 -### Unit Tests ```bash +# Unit Test ./gradlew test -``` -### Instrumentation Tests -```bash +# UI Test ./gradlew connectedAndroidTest ``` ---- - -## 향후 계획 - -### Phase 2 -- [x] FCM 기반 서버 푸시 (로컬 알림으로 대체) -- [x] 위젯 지원 -- [x] 다크 모드 개선 -- [x] 공유 기능 - -### Phase 3 -- [x] 디자인 시스템 구축 -- [x] 로딩 스켈레톤 (Shimmer Effect) -- [x] 빈 상태 컴포넌트 -- [x] 애니메이션 컴포넌트 - -### Phase 4 -- [ ] 가격 비교 기능 -- [ ] 즐겨찾기 기능 -- [ ] 알림 그룹화 ---- - ## 라이선스 MIT License - ---- - -## 기여 - -버그 리포트나 기능 제안은 GitHub Issues를 이용해주세요.