Update README.md - clean up and simplify
This commit is contained in:
262
README.md
262
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/ # 메인 화면
|
||||
│ ├── main/ # 메인 화면, ViewModel
|
||||
│ ├── deallist/ # 핫딜 목록, 필터
|
||||
│ ├── settings/ # 설정 화면
|
||||
│ ├── deallist/ # 핫딜 목록 화면
|
||||
│ └── components/ # 재사용 컴포넌트
|
||||
│
|
||||
├── worker/ # WorkManager Worker
|
||||
│ ├── HotDealPollingWorker.kt
|
||||
│ └── WorkerScheduler.kt
|
||||
│
|
||||
├── service/ # 서비스
|
||||
│ └── NotificationService.kt
|
||||
│
|
||||
└── util/ # 유틸리티
|
||||
├── Constants.kt
|
||||
└── BootReceiver.kt
|
||||
│ └── 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를 이용해주세요.
|
||||
|
||||
Reference in New Issue
Block a user