25a349f273d49f759d43a2c457d33b77979c5633
Features: - Multi-site hot deal scraping (Ppomppu, Clien, Ruriweb, Coolenjoy) - Site filter with color-coded badges - Board display names (e.g., ppomppu8 -> 알리뽐뿌) - Anti-bot protection with request delays and User-Agent rotation - Keyword matching and notifications - Material Design 3 UI
핫딜 알람 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 완벽 지원
기술 스택
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
프로젝트 구조
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 인터셉터
│
├── domain/
│ └── model/ # 도메인 모델
│ ├── HotDeal.kt
│ ├── SiteConfig.kt
│ ├── Keyword.kt
│ └── SiteType.kt
│
├── presentation/
│ ├── main/ # 메인 화면
│ ├── settings/ # 설정 화면
│ ├── deallist/ # 핫딜 목록 화면
│ └── components/ # 재사용 컴포넌트
│
├── worker/ # WorkManager Worker
│ ├── HotDealPollingWorker.kt
│ └── WorkerScheduler.kt
│
├── service/ # 서비스
│ └── NotificationService.kt
│
└── util/ # 유틸리티
├── Constants.kt
└── BootReceiver.kt
빌드 방법
요구사항
- Android Studio Hedgehog 이상
- JDK 17
- Android SDK 35
빌드 명령어
cd android_app
./gradlew assembleDebug
APK 설치 (WSL 환경)
WSL에서 Windows ADB를 사용하여 설치:
# 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에서:
adb install "\\wsl.localhost\Ubuntu\home\work\hotdeal_alarm\app\build\outputs\apk\debug\app-debug.apk"
cd android_app
./gradlew assembleDebug
릴리즈 빌드
./gradlew assembleRelease
권한
필수 권한
| 권한 | 용도 | 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 대응
- User-Agent 회전: Android Chrome, Desktop Chrome 등 번갈아 사용
- Rate Limiting: 요청 간 최소 3초 대기
- Retry with Backoff: 실패 시 지수 백오프로 재시도
- Header 조작: Referer, Accept-Language 등 추가
Cloudflare 대응
-
퀘이사존제거됨 -
퀘이사존은 Cloudflare 보호가 적용될 수 있음
-
일반 HTTP 요청으로 차단될 경우 WebView 기반 bypass 고려
테스트
Unit Tests
./gradlew test
Instrumentation Tests
./gradlew connectedAndroidTest
향후 계획
Phase 2
- FCM 기반 서버 푸시 (로컬 알림으로 대체)
- 위젯 지원
- 다크 모드 개선
- 공유 기능
Phase 3
- 디자인 시스템 구축
- 로딩 스켈레톤 (Shimmer Effect)
- 빈 상태 컴포넌트
- 애니메이션 컴포넌트
Phase 4
- 가격 비교 기능
- 즐겨찾기 기능
- 알림 그룹화
라이선스
MIT License
기여
버그 리포트나 기능 제안은 GitHub Issues를 이용해주세요.
Description