Skip to content

Latest commit

Β 

History

History
120 lines (94 loc) Β· 5.44 KB

File metadata and controls

120 lines (94 loc) Β· 5.44 KB

Picke (ν”½μΌ€) Android

PickeλŠ” λ…ΌμŸμ μΈ μ£Όμ œμ— λŒ€ν•΄ μ„œλ‘œ λ‹€λ₯Έ "관점"을 λ‚˜λˆ„κ³ , μœ μ € κ°„ 의견 λŒ€κ²°(λ°°ν‹€)Β·νˆ¬ν‘œΒ·λŒ“κΈ€λ‘œ μ†Œν†΅ν•˜λŠ” μ†Œμ…œ λ””μŠ€μ»€μ…˜ μ•±μž…λ‹ˆλ‹€. λ‚΄λ ˆμ΄μ…˜μ΄ μžˆλŠ” μ‹œλ‚˜λ¦¬μ˜€ μ½˜ν…μΈ , μ„±ν–₯ 진단("μ² ν•™μž μœ ν˜•") κ²°κ³Ό 곡유, μΆœμ„μ²΄ν¬ 슀트릭·포인트 보상 λ“± κ²Œμ΄λ―Έν”ΌμΌ€μ΄μ…˜ μš”μ†Œλ‘œ λ¦¬ν…μ…˜μ„ μœ λ„ν•©λ‹ˆλ‹€.

  • νŒ¨ν‚€μ§€λͺ…: com.picke.app
  • Gradle 루트 ν”„λ‘œμ νŠΈλͺ…: SwypApp (κ΅¬νŒ€λͺ… SWYP μ‹œμ ˆμ˜ 이름이 λ‚¨μ•„μžˆμŒ, GitHub 쑰직도 SWYP-Find)

μ£Όμš” κΈ°λŠ₯

κΈ°λŠ₯ μ„€λͺ…
λ°°ν‹€ (Battle) νŠΉμ • μ£Όμ œμ— λŒ€ν•œ 의견 λŒ€κ²° μ½˜ν…μΈ . νˆ¬ν‘œ(Vote)와 λŒ“κΈ€(Comment)둜 μ°Έμ—¬, "였늘의 λ°°ν‹€"(TodayBattle) 및 μœ μ €κ°€ 직접 배틀을 λ§Œλ“œλŠ” κΈ°λŠ₯(λ§ˆμ΄νŽ˜μ΄μ§€ λ‚΄ λ°°ν‹€ λ§Œλ“€κΈ°) 포함
관점 (Perspective) μ£Όμ œμ— λŒ€ν•œ μ„œλ‘œ λ‹€λ₯Έ μ‹œκ°μ„ μ œμ‹œ/νƒμƒ‰ν•˜λŠ” μ½˜ν…μΈ 
μ‹œλ‚˜λ¦¬μ˜€ (Scenario) μ˜€λ””μ˜€ λ‚΄λ ˆμ΄μ…˜μ΄ ν¬ν•¨λœ μŠ€ν† λ¦¬ν˜• μ½˜ν…μΈ . μž¬μƒ ν›„ 관점/λ°°ν‹€λ‘œ μ—°κ²°λ˜λŠ” 흐름
μ² ν•™μž μœ ν˜• (Philosopher type) μ„±ν–₯ 진단 κ²°κ³Όλ₯Ό μ œκ³΅ν•˜κ³  곡유(λ”₯링크 /recap/)ν•  수 μžˆλŠ” λ°”μ΄λŸ΄ κΈ°λŠ₯
μΆœμ„μ²΄ν¬ (Attendance) 일일 μΆœμ„ 체크, μ£Όκ°„ 슀트릭 뱃지, λ¦¬μ›Œλ“œ μ§€κΈ‰. 졜근 κ°€μž₯ ν™œλ°œνžˆ 개발된 κΈ°λŠ₯
폴/ν€΄μ¦ˆ (PollQuiz) λ°°ν‹€Β·μ‹œλ‚˜λ¦¬μ˜€μ™€ μ—°κ³„λœ νˆ¬ν‘œ/ν€΄μ¦ˆ
λ§ˆμ΄νŽ˜μ΄μ§€ ν”„λ‘œν•„, 포인트(인앱 μž¬ν™”), 곡지, μ•Œλ¦Ό μ„€μ •, νƒˆν‡΄, ν™œλ™ λ‚΄μ—­(ν† λ‘ /μ½˜ν…μΈ ) λ“±
ν™ˆ 베슀트/μ‹ κ·œ/였늘의 ν”½/νŠΈλ Œλ”© μ½˜ν…μΈ  νλ ˆμ΄μ…˜
탐색 (Explore) μ½˜ν…μΈ  탐색
μ•Œλ¦Ό FCM ν‘Έμ‹œ (λ°°ν‹€/관점/곡지 μ•Œλ¦Ό), λ”₯링크 λΌμš°νŒ…
둜그인/곡유 μΉ΄μΉ΄μ˜€Β·κ΅¬κΈ€ μ†Œμ…œ 둜그인, μΉ΄μΉ΄μ˜€ν†‘Β·μΈμŠ€νƒ€κ·Έλž¨ 곡유

ν”„λ‘œμ νŠΈ μ•„ν‚€ν…μ²˜

단일 :app λͺ¨λ“ˆ ꡬ쑰이며 (λ©€ν‹°λͺ¨λ“ˆ μ•„λ‹˜), Clean Architecture (data / domain / presentation) 3계측을 κΈ°λŠ₯(feature) λ‹¨μœ„λ‘œ λ‚˜λˆˆ κ΅¬μ‘°μž…λ‹ˆλ‹€. Jetpack Compose 기반 UI, MVVM νŒ¨ν„΄μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

app/src/main/java/com/picke/app/
β”œβ”€β”€ SwypApplication.kt        # Hilt μ§„μž…μ , Kakao SDK μ΄ˆκΈ°ν™”, FCM 채널 μ„€μ •
β”œβ”€β”€ MainActivity.kt
β”œβ”€β”€ analytics/                 # Mixpanel νŠΈλž˜ν‚Ή 헬퍼
β”œβ”€β”€ di/                        # Hilt λͺ¨λ“ˆ (Network, Api, Repository, AdMob, Mixpanel)
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ local/                 # 둜컬 μ €μž₯μ†Œ (EncryptedSharedPreferences)
β”‚   β”œβ”€β”€ model/                 # DTO
β”‚   β”œβ”€β”€ remote/                 # Retrofit API μΈν„°νŽ˜μ΄μŠ€ (κΈ°λŠ₯별 1κ°œμ”©), AuthInterceptor, TokenAuthenticator
β”‚   └── repository/             # RepositoryImpl (κΈ°λŠ₯별)
β”œβ”€β”€ domain/
β”‚   β”œβ”€β”€ model/                  # 도메인 λͺ¨λΈ. "XxxBoard" 넀이밍 μ»¨λ²€μ…˜ μ‚¬μš© (예: AttendanceBoard, BattleBoard)
β”‚   β”œβ”€β”€ repository/             # Repository μΈν„°νŽ˜μ΄μŠ€
β”‚   └── usecase/                # κΈ°λŠ₯별 UseCase (졜근 λ¦¬νŒ©ν„°λ§λ¨: refactor/usecase-layer)
β”œβ”€β”€ notification/               # FCMService
β”œβ”€β”€ ui/                         # Compose ν™”λ©΄. κΈ°λŠ₯별 νŒ¨ν‚€μ§€, 각각 Screen + ViewModel + UiState (+ Skeleton) ꡬ성
β”‚   β”œβ”€β”€ attendance/, battleentry/, comment/, component/, explore/,
β”‚   β”œβ”€β”€ home/, login/, main/, my/, onboarding/, perspective/,
β”‚   β”œβ”€β”€ recommend/, scenario/, splash/, theme/, todaybattle/, vote/, alarm/
└── util/

μ°Έκ³  사항

  • Room μ˜μ‘΄μ„±μ΄ 버전 μΉ΄νƒˆλ‘œκ·Έμ—λŠ” μžˆμœΌλ‚˜ μ‹€μ œ app/build.gradle.ktsμ—μ„œλŠ” 주석 μ²˜λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€ β€” ν˜„μž¬ 둜컬 DB λ―Έμ‚¬μš©
  • AdMob 연동 μ½”λ“œλŠ” μ‘΄μž¬ν•˜μ§€λ§Œ SwypApplication.kt λ“±μ—μ„œ λΉ„ν™œμ„±ν™”(주석 처리)된 μƒνƒœ

기술 μŠ€νƒ

μ–Έμ–΄ / λΉŒλ“œ

  • Kotlin 2.0.21 (JVM target 17)
  • AGP 9.0.1, Gradle 9.1.0
  • compileSdk 36 / minSdk 26 / targetSdk 35

UI

  • Jetpack Compose (Compose BOM 2024.10.01), Material3 β€” XML λ·° λ―Έμ‚¬μš©
  • Navigation Compose 2.8.5
  • Coil 2.7.0 (이미지), Media3 ExoPlayer/UI 1.4.1 (μ‹œλ‚˜λ¦¬μ˜€ μ˜€λ””μ˜€ μž¬μƒ)

μ•„ν‚€ν…μ²˜ / DI

  • Hilt 2.59.2 + KSP 2.0.21-1.0.28
  • Clean Architecture (data/domain/ui), Paging3 3.3.2/3.4.2

λ„€νŠΈμ›Œν‚Ή

  • Retrofit 2.11.0 + Gson, OkHttp 4.12.0

둜컬 μ €μž₯

  • androidx-security-crypto (EncryptedSharedPreferences) β€” Room/DataStore λ―Έμ‚¬μš©

인증 / μ†Œμ…œ

  • Kakao SDK 2.20.1, Google Play Services Auth 21.0.0

Firebase / μ•Œλ¦Ό

  • Firebase BOM 33.5.1 (Realtime Database, Dynamic Links, FCM)

뢄석 / λͺ¨λ‹ˆν„°λ§

  • Mixpanel 7.5.0, Sentry 5.8.0

κ΄‘κ³  (ν˜„μž¬ λΉ„ν™œμ„±ν™”)

  • Google Play Services Ads (AdMob) 23.6.0

ν…ŒμŠ€νŠΈ

  • JUnit4, MockK 1.13.13, kotlinx-coroutines-test, Espresso, Compose UI Test

λΉŒλ“œ ν™˜κ²½ μ„€μ •

λΉŒλ“œ μ „ μ•„λž˜ νŒŒμΌμ— 값을 μ±„μ›Œμ•Ό ν•©λ‹ˆλ‹€ (λ‘˜ λ‹€ .gitignore에 ν¬ν•¨λ˜μ–΄ μ €μž₯μ†Œμ— μ—†μŒ):

**local.properties**에 ν•„μš”ν•œ ν‚€:

KAKAO_DEBUG_APPKEY=...
GOOGLE_WEB_CLIENT_ID=...
ADMOB_APP_ID=...
ADMOB_REWARDED_AD_UNIT_ID=...
MIXPANEL_PROJECT_TOKEN=...
SENTRY_DSN=...
# release μ„œλͺ…μš©
storeFile=...
storePassword=...
keyAlias=...
keyPassword=...

sentry.properties: ProGuard λ§€ν•‘ μ—…λ‘œλ“œμš© Sentry 인증 토큰 ν•„μš”

λΉŒλ“œ variant별 BASE_URL

  • debug: https://dev.picke.store/
  • release: https://picke.store/ (minify + shrink ν™œμ„±ν™”, μ„œλͺ… ν•„μš”)

CI/CD

ν˜„μž¬ GitHub Actions λ“± CI μ„€μ • μ—†μŒ.