"์ค๋ ์งํํ๋ ์ด๋ฒคํธ๊ฐ ๋ญ์ง? ์ด๋ฒคํธ๊ฐ ๋๋ฌด ๋ง์์ ๋ชจ๋ฅด๊ฒ ๋คโฆ"
- ์๋ง์ ์ด๋ฒคํธ ์ผ์ ์ ํ ๋์ ํ์ธํ์
- ์ค๋ ๋ฌด์จ ์ด๋ฒคํธ๊ฐ ์ข ๋ฃ๋๋์ง ์๋ฆผ๋ฐ์
- ํน์ ๋ ์ง์ ๋ฌด์จ ์ด๋ฒคํธ๊ฐ ์๋์ง ์์งํ์
- ๊ทธ ์ธ์ ๊ฐ๋จํ๊ฒ ๋ด ์บ๋ฆญํฐ์ ํ์ฌ ์ํ๋ฅผ ์์๋ณด์
- ์ด๋ฒคํธ๋ฅผ ํด๋ฆญํ๋ฉด ๊ณต์ ํํ์ด์ง๋ก ์ด๋๋๋ค.
- ๋ฌ๋ ฅ์ ํน์ ๋ ์ง๋ฅผ ํด๋ฆญํด ์งํํ๋ ์ด๋ฒคํธ๋ฅผ ํ์ธํ์.
- ๋งค์ผ 00์๋ง๋ค ๋น์ผ ์ข ๋ฃ๋๋ ์ด๋ฒคํธ์ ๊ฐ์๋ฅผ ์๋ฆผ๋ฐ์.
- ์ ๋ณด๊ฐ ๊ถ๊ธํ ์บ๋ฆญํฐ์ ์ข ํฉ ๋ฅ๋ ฅ์น์ ์ฅ๋น๋ฅผ ํ์ธํด๋ณด์.
Category | TechStack |
---|---|
Architecture | MVVM |
Network | Retrofit, OkHttp, Moshi |
DI | Hilt |
Asynchronous | Coroutines |
Jetpack | DataBinding, Navigation, Fragment, Lifecycle, Material Design Components |
Image | Coil |
Notification | AlarmManager with BroadcastReceiver |
CI/CD | Firebase App Distribution, Google Play Store |
Logging | Timber |
- Service์ BroadcastReceiver๋ก ์ฑ์ด ์ผ์ ธ ์์ ๋๋ฟ๋ง ์๋๋ผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์๋, ์ฑ์ด ๊บผ์ง ์ํ์์๋, ์ฌ์ง์ด ๊ธฐ๊ธฐ๊ฐ ์ ๊ธ์ธ ์ํ์์๋ ๋งค์ผ 00์์ ๊ฑฐ์ ์ ํํ๊ฒ ์๋ฆผ์ ๋ฐ์ ์ ์๋๋ก ํ์์.
- AlarmManager์ setAlarmClock()๊ณผ PendingIntent๋ฅผ ์ ์ํด์ ๋งค์ผ 00์์ BroadcastReceiver๋ฅผ ํธ์ถํ๊ณ , BroadcastReceiver์์ NotificationManager๋ฅผ ์ ์ํ๊ณ notify()๋ก ์๋ฆผ์ ๋ณด๋ผ ์ ์๋๋ก ํ์์.
- ํ์ง๋ง setAlarmClock()์ ๋ฐ๋ณต์ด ๋ถ๊ฐ๋ฅํ๊ณ , ๋ฐ๋ณต ์๋์ ๊ตฌํํ๊ธฐ ์ํด onReceive()์์ ๋ค์ ๋ค์ ๋ 00์์ ์๋ฆผ์ ์์ฝํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์์.
- ์ข์ฐ ์ค์์ดํ๊ฐ ๋๋ ๋ฌ๋ ฅ View๋ฅผ ๋ง๋ค๊ธฐ ์ํ์ฌ ViewPager2๋ฅผ ์ฌ์ฉํ์์.
- ViewPager2์ ์ฌ์ฉํ Fragment๋ ์ฐ์์ ๋ํ๋ด๋ TextView์, ๋ฌ๋ ฅ UI๋ฅผ ๋ํ๋ด๋ Custom ViewGroup์ผ๋ก ๊ตฌ์ฑ๋์ด ์์.
- ViewGroup์ ์์ผ์ด๋ ๋ ์ง๋ฅผ ๋ํ๋ด๋ View๋ค๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , ViewGroup์์ ์์ผ ๋ฐ ๋ ์ง๋ฅผ ๋ํ๋ด๋ View์ layout์ ๊ตฌ์ฑํจ.
- ์์ผ View๋ ํ์ ๋ฐฐ๊ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๋ ์ง View๋ ํฐ์น๊ฐ ๊ฐ๋ฅํ๊ณ ํฐ์น ์ ํด๋น ๋ ์ง๋ฅผ ์บ๋ฆญํฐ ์กฐํ ๋ ์ง๋ก ์ด๊ธฐํํจ.
- View๋ฅผ ํฐ์นํ ๋ MotionEvent๋ฅผ ๊ด์ฐฐํ๋ฉฐ, ํฐ์น ์์ ์ ํด๋น View์ ๋ฐฐ๊ฒฝ์์ด ๋ฐ๋๋ฉฐ ์๊ฐ๋ฝ์ ๋ผ๊ฑฐ๋ ๋ถ๋ชจ View๊ฐ ํฐ์น ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ๊ฐ๊ธฐ ์ ๊น์ง ์ ์ง๋จ.
- UI Layer
- UI Layer๋ Domain Layer์์ ์์ฑํ ๋น์ฆ๋์ค ๋ก์ง์ UseCase๋ฅผ ์์กดํ์ฌ ์ฌ์ฉํ๋ ์ญํ ์ ํ๋ค.
- ๋ฐ๋ผ์ Domain Layer์ ์์กดํ๊ฒ ๋๋ค.
- Repository์ ์์กดํ์๋ ViewModel์ Domain Layer์ UseCase์ ์์กดํ์ฌ, ์ฌ์ฉ์๊ฐ App์ ์ฌ์ฉํ๋ฉด์ ์ํํ , Domain Layer์ ์ ์๋ ๋ชจ๋ ๋์์ ๊ทธ์ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
- Domain Layer
- Domain Layer์ ํน์ง์ผ๋ก๋, ์ด๋ ํ Layer์๋ ์์กดํ์ง ์๋๋ค๋ ๊ฒ์ด๋ฉฐ ๊ทธ์ ๋ฐ๋ผ Kotlin ์ฝ๋๋ก๋ง ์์ฑํ๊ฒ ๋๋ค. ๋ํ gradle์ ๋ค๋ฅธ ๋ชจ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์๊ฒ ๋๋ค.
- Domain Layer์์๋ UI์ ๊ทธ๋ ค๋ด๊ธฐ ์ํด ์ฌ์ฉํ Entity, ๊ทธ๋ฆฌ๊ณ Entity๋ฅผ ํตํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ Repository Interface, ๋ง์ง๋ง์ผ๋ก UseCase๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- UseCase
- ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ User๊ฐ ํด๋น ์๋น์ค๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ๊ฒ์ UseCase๋ผ๊ณ ํ๋ค.
- ์๋ฅผ ๋ค๋ฉด ์ด๋ค ์ฑ์ ์ผ์ ๋ก๊ทธ์ธ์ ํ๊ฑฐ๋, ์ด๋ค ์ํ ์ ๋ณด๋ฅผ ๋ณด๊ฑฐ๋ ํ๋ ๋ฑ ์๋น์ค์์ ์ํํ๊ณ ์ ํ๋ ๋ชจ๋ ๊ฒ๋ค์ด UseCase๊ฐ ๋ ์ ์๋ค.
- Screaming Architecture : ์ด๋ค ์๋น์ค๋ฅผ ์ ๊ณตํ๋์ง ์ง๊ด์ ์ผ๋ก ํ์ ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ Architecture์ด๋ฉฐ, Android์์๋ ViewModel์ด ์ด๋ค UseCase์ ์์กดํ๋๋ก ๊ตฌํํจ์ผ๋ก์จ ํด๋น ViewModel์ด ์ด๋ค ๊ธฐ๋ฅ์ ์ ๊ณตํ๋์ง๋ฅผ ์ง๊ด์ ์ผ๋ก ์ ์ ์๋๋ก ํ๋ค.
- ๋ํ, UseCase์ ์์กดํ๊ธฐ ๋๋ฌธ์ Repository์ ์ง์ ์์กดํ์ง ์๊ฒ ๋๋ค. UseCase์์ ์ง์ Repository์ ์์กดํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ๊ฒ ๋๊ณ , ViewModel์ ์์กดํ๊ณ ์๋ UseCase ๋ด๋ถ์ ์์ฑ๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ ๊ฒ์ด๋ฉฐ, ์ด๋ ๊ฒ ์์กด์ฑ์ ์ค์์ผ๋ก์จ ํน์ ๋ก์ง์ ๋ํ ์์ ์ ์ต์ํํ ์ ์๊ฒ ๋๋ค.
- UseCase๋ ์ด๋ฆ๋ง ๋ด๋ ์ด๋ค ์ญํ ์ ์ํํ๋์ง๋ฅผ ์ ์ ์๋๋ก ๋ช ์ํ์ฌ์ผ ํ๋ค.(์๋ฅผ ๋ค๋ฉด ๋ก๊ทธ์ธ์ ํ๋ค๋ UseCase๋ผ๋ฉด LoginUseCase)
- Repository ๋ด๋ถ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ๋ง ํ๋ UseCase์ ๊ฒฝ์ฐ invoke()๋ผ๋ ๋ฉ์๋๋ฅผ ์์ฑํจ์ผ๋ก์จ Class๋ช ๋ง์ผ๋ก ํธ์ถํ๋๋ก ํ ์ ์์ผ๋ฉฐ, UseCase ๋ด๋ถ์์ ๋ง์ ๋ก์ง์ ๊ตฌํํด์ผ ํ๋ ๊ฒฝ์ฐ execute() ๋ฉ์๋๋ฅผ ์๋ก ์ ์ํ๋ค.
- ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ User๊ฐ ํด๋น ์๋น์ค๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ๊ฒ์ UseCase๋ผ๊ณ ํ๋ค.
- Data Layer
- Data Layer์์๋ ์๋ฒ์์ ํต์ ๋ก์ง์ธ api, ๋ฐ์ดํฐ ํด๋์ค์ธ model, ๊ทธ๋ฆฌ๊ณ Domain Layer์์ ์ ์ธํ Repository Interface๋ฅผ ์์๋ฐ์ RepositoryImpl๊ณผ API ๋ฑ์ ํตํด ๋ฐ์ดํฐ๋ฅผ CRUDํ๋ DataSource๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- ์ฌ๊ธฐ์ API์ ๋ง์ถฐ ๊ตฌํํ๋ DataSource๊ฐ RemoteDataSource์ด๋ค.
- ์์กด์ฑ ์ญ์ ์์น์ ๋ฐ๋ฅธ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Hilt๋ฅผ ์ฌ์ฉํ์๋ค.
- Hilt๋ Dagger๋ณด๋ค๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๊ฐ์ํ๋์ด์์ผ๋ฉฐ, Android ํด๋์ค์ ์ต์ ํ๋์ด์๋ค๋ ํน์ง์ด ์๋ค.
- Hilt๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
- ๊ฐ์ฅ ๋จผ์ MainApplication์ @HiltAndroidApp ์ด๋ ธํ ์ด์ ์ ์ง์ ํ๋ค. ํด๋น App์ ์์กด์ฑ์ ์ ๊ณตํ๋ Component์ ์ญํ ์ ํ๊ฒ ๋๋ค.
- @InstallIn(SingletonComponent::class) ์ด๋ ธํ ์ด์ ์ ์ง์ ํจ์ผ๋ก์จ App ์ ์ญ์์ ํ๋์ ์ธ์คํด์ค ํํ๋ก ์ฌ์ฉํ ๊ฒ์์ ๋ํ๋ด๊ณ , @Module ์ด๋ ธํ ์ด์ ์ ์ง์ ํจ์ผ๋ก์จ ๋ชจ๋์ ์์ฑํ์ฌ Component ์ญํ ์ ํ๋ Android App์ ์ ์ฅํ ์ ์๊ฒ ๋๊ณ , Android App์ ์ ์ฅํ ๋งํผ Android์ ์๋ช ์ฃผ๊ธฐ ๋์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
- @Provides ์ด๋ ธํ ์ด์ ์ ์ง์ ํ ๋ชจ๋ ๋ด ๋ฉ์๋๋ ์ข ์์ฑ์ ์ ๊ณตํ๊ณ Hilt์ ์ํด ์ฃผ์ ๋ ์ ์๋๋ก ํ๋ค.
- Android์ Component์๋ @AndroidEntryPoint ์ด๋ ธํ ์ด์ ์ ์ง์ ํ์ฌ Hilt๊ฐ ํด๋น ํด๋์ค์ ์ข ์์ฑ์ ์ฃผ์ ํ ์ ์๋๋ก ํ๋ค.
- @Inject ์ด๋ ธํ ์ด์ ์ ์ง์ ํ ์์ฑ์์ ๋ํ ์ธ์คํด์ค๋ฅผ Hilt๊ฐ ์๋์ผ๋ก ์ฃผ์ ํ๊ฒ ๋๋ค.
- ์คํํฌ์ค View๋ฅผ RecyclerView๋ก ๊ตฌํํ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชป ํด์ Custom View๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค.
- ์ผ๋จ ์คํํฌ์ค๋ ๋ณ ๊ฐ์ ์์น๊ฐ ์ผ์ ํ์ง ์์ผ๋ฉฐ ๊ฐ๊ฒฉ๋ ๋ค๋ฅด๋ค.
- ๋ฐ๋ผ์ RecyclerView๋ก ๊ตฌํํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์๋ค๊ณ ํ๋จํ์๋ค.
- ์คํํฌ์ค๋ฅผ ๋ํ๋ด๋ ๋ณ์ ViewGroup์ ๋จผ์ ์ ์ํ๊ณ , ๋ฏธ๋ฆฌ ์ ์ํ ์์ฑ์ ๋ฐํ์ผ๋ก ViewGroup์ ์ถ๊ฐํด์ผ ํ View์ ์ต๋ ๊ฐ์๋ฅผ ๋ฐํ์ผ๋ก width์ height๋ฅผ ์ธก์ ํ๋ค.
- ์ฌ๊ธฐ์ 5๋ฒ์งธ View์ 6๋ฒ์งธ View ๊ฐ์ ๊ฐ๊ฒฉ์ด ์กฐ๊ธ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ View์ width์ ์ ๋ฐ๋งํผ ViewGroup์ width๋ฅผ ๋๋ฆฐ๋ค.
- ์์ดํ ์ ์คํํฌ์ค๋ฅผ ๋ฐํ์ผ๋ก ์ถ๊ฐํด์ผ ํ ๋ ธ๋ ๋ณ๊ณผ ํ์ ๋ณ์ ๊ฐ์๋ฅผ ์ ํ๋ค.
- ํ์ดํผ ์คํฏ, ์ด๋น๋ฆฌํฐ UI๋ฅผ ํฌํจํ DialogFragment ๋ด๋ถ์ ViewPager2์ TabLayout์ ๋ฐฐ์นํ์๋ค.
- ViewPager2์ ์ฌ์ฉํ Fragment ๋ด๋ถ์ RecyclerView๋ฅผ ๋ฐฐ์นํ์ฌ, List ํํ์ ํ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ RecyclerView Adapter๋ก ๋ณด์ฌ์ค๋ค.
- ViewPager2์ TabLayout์ TabLayoutMediator๋ก ์ฐ๊ฒฐํ์ฌ ์ข์ฐ ์ค์์ดํ๋ฅผ ํ๋ฉด ํ๋ฆฌ์ ๋ฒํผ์ ์ํ๋ ๋ฐ๋๊ณ , ํ๋ฆฌ์ ๋ฒํผ์ ํฐ์นํ๋ฉด ์ข์ฐ ์ค์์ดํ ์ ๋๋ฉ์ด์ ์ผ๋ก ํ๋ฆฌ์ ํ๋ฉด์ ๋ฐ๊พธ๋๋ก ๊ตฌํํ์๋ค.