- 1์ฐจ Study - MVC
- 2์ฐจ Study - Repository
- 3์ฐจ Study - MVP
- 4์ฐจ Study - MVP
- 5์ฐจ Study - DataBinding
- 6์ฐจ Study - MVVM
- 7์ฐจ Study - MVVM
- 8์ฐจ Study - AAC LiveData, AAC ViewModel
- 9์ฐจ Study - Koin
- ํ๋์ MainActivity์ 4๊ฐ์ Fragment ๊ตฌํ
- Retrofit์ ์ด์ฉํ์ฌ ์๋ฒํต์
- QUOTATION API
โ๏ธISSUE
-
Android Repository Pattern
-
Data ๋ ์ด์ด๋ฅผ Repository์ DataSource๋ก ๊ตฌํํ ๊ฒ
-
DataSource๋ RemoteDataSource์ LocalDataSource๋ก ๋๋์ด์ ธ ์๋ค.
-
RemoteDataSource๋ APIํต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ด ๊ตฌํ๋์ด ์๋ค.
-
LocalDataSource์๋ Room, SQLite, Realm, SharedPreference ๋ฑ์ผ๋ก ๊ตฌํ๋์ด ์์ด ๋ด๋ถ์ ์ฅ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ตฌ์ง์ด๋ค.
-
์ฐ์ํ ํ์ ๋ค ๊ธฐ์ ๋ธ๋ก๊ทธ(repository)
โ๏ธISSUE
-
Model: ๋ฐ์ดํฐ, ์ํ, ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋น
-
View: xml, ui(Fragment, Activity), Presenter์ ์ด๋ฒคํธ ์ ๋ฌ, Presenter๋ก ๋ฐ์ ๋ฐ์ดํฐ ๋ณด์ฌ์ค
-
Presenter: View๋ก ๋ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ(๋ก์ง๊ตฌํ)ํ๊ณ Model์ ์ ๋ฐ์ดํธ
-
Contract์์๋ View ์ธํฐํ์ด์ค์, Presenter ์ธํฐํ์ด์ค๋ฅผ ์ ์ contract๋ง ๋ณด๊ณ ๋ ๋๋ต์ ์ธ ์ฝ๋๋ฅผ ์ ์ ์๋ค.
-
contract ์๋ view ์ธํฐํ์ด์ค์ presenter ์ธํฐํ์ด์ค๊ฐ ์๋ค.
-
view ์ธํฐํ์ด์ค๋ ui์์ ์์๋ฐ์ ๊ตฌํํ๋ค.
-
presenter ์ธํฐํ์ด์ค๋ presenter ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ด ๊ฐ์ฒด๊ฐ presenter ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ตฌํํ๋ค.
-
๊ตฌํ๋ presenter ๊ฐ์ฒด๋ ui์์ ๋ณ์๋ก ๊ฐ์ฒด ์์ฑํ์ฌ view์ ์ฐ๋๋๋ค.
-
โ๏ธISSUE
-
-
Databinding : ํ๋ก๊ทธ๋๋งคํฑ ๋ฐฉ์์ด ์๋๋ผ ์ ์ธ์ ํ์์ผ๋ก ๋ ์ด์์์ UI ๊ตฌ์ฑ์์๋ฅผ ์ฑ์ ๋ฐ์ดํฐ ์์ค์ ๊ฒฐํฉํ ์ ์๋ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
-
@{} ํ์์ ํตํด findViewById๋ฅผ ๊ตฌํํ ํ์๊ฐ ์๋ค.
-
๋ ์ด์์ ํ์ผ์์ ๊ตฌ์ฑ์์๋ฅผ ๊ฒฐํฉํ๋ฉด ํ๋์์ ๋ง์ UI ํ๋ ์์ํฌ ํธ์ถ์ ์ญ์ ํ ์ ์์ผ๋ฉฐ ์ด๋ก ์ธํด ํ์ผ์ด ๋์ฑ ๊ฐ์ํ๋๊ณ ์ ์ง๊ด๋ฆฌ ๋ํ ์ฌ์์ง๋ค. ์ฑ ์ฑ๋ฅ์ด ํฅ์๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ null pointer exceptions๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
-
์ฌ์ฉ ๋ฐฉ๋ฒ
- build.gradle์ kotlin-extension์ ์ ๊ฑฐํ๋ค. ์ ๊ฑฐ๋ฅผ ํ์ง ์์๋ ์ข์ง๋ง findViewId๋ฅผ ์ด์ฉ์ ๋ง๊ธฐ ์ํจ์ด๋ค.
- build.gradle ํ์ผ์ ์๋์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
dataBinding{ enabled = true }
- xml์์ ์ต์์ ํ๊ทธ๋ฅผ layout์ผ๋ก ํ๋ค.
- activity์์ setContentView๋ฅผ ์ญ์ ํ๊ณ ์๋ ์ฝ๋๋ก ๋์ฒดํ๋ค.
lateinit var binding = DataBindingUtil.setContentView(this, [layoutId])
- RecyclerView์์ ๊ฐ๊ฐ์ item์ setํด์ฃผ๋ ์์ ๋ xml์์ ๋ค ์จ์ฃผ๋ฉด ์์์ ๊ฐ์ด ๋ค์ด๊ฐ๋ค. ์ฆ, ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ฉด View๊ฐ ์๋์ผ๋ก ๊ฐฑ์ ํ๋ค.
-
โ๏ธISSUE
-
MVVM
: MVVM์ Model-View-ViewModel์ ์ฝ์์ด๋ค. Model์ UI์ ํ์๋ ๋ฐ์ดํฐ ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๊ณ View๋ UI๋ฅผ ์๋ฏธํ๋ฉฐ ViewModel์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋, Model๊ณผ์ ์ธํฐ๋์ ๋ฑ์ ๋ด๋นํ๋ค. -
AAC๊ฐ ํ์ํ ๊ฒ์ ์๋๋ค. AAC๊ฐ ์์ด๋ ์ถฉ๋ถํ MVVM ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
-
AAC(Android Architecture component) : LiveData, ViewModel, Room, Paging ๋ฑ
-
https://duzi077.tistory.com/196 [๊ฐ๋ฐํ๋ ๋๋์ง]
-
โ๏ธISSUE
-
AAC ViewModel
-
ViewModel ํด๋์ค๋ UI ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ฆ, ์คํฌ๋ฆฐ ํ์ ๊ฐ์ ์ํ ๋ณํ์๋ ๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋ ์ ์๋๋ก ํ์ฉํด์ค๋๋ค.
-
๋ง์ฝ ์กํฐ๋นํฐ๊ฐ ์ฌ ์์ฑ์ด ๋๋ค๋ฉด, ์ฒ์ ๋ง๋ค์ด์ง ViewModel ์ธ์คํด์ค๋ฅผ ๋ฐ๊ฒ๋ฉ๋๋ค. ์ด ์ธ์คํด์ค๋ฅผ ํธ์ถํ ์กํฐ๋นํฐ ๋๋ ํ๋๊ทธ๋จผํธ๊ฐ destory ๋์ด ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ๋๊ธฐ์ ๊น์ง ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ณ ์์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ค๊ฐ ํ๋ฉด ํ์ ๊ฐ์ ์ํ ๋ณํ๊ฐ ๋ฐ์ํด๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ฒ ๋ฉ๋๋ค. </img src='https://developer.android.com/images/topic/libraries/architecture/viewmodel-lifecycle.png' width='60%'>
-
sharedViewModel
- Viewmodel์ ๊ณต์ ํ๋ ๊ธฐ๋ฅ
- activity, fragment ๋ค์ ViewModel์ ๋ณ์๋ฅผ ๊ณต์ ํ ์ ์๋ค.
sharedViewModel?.inputNumber?.postValue(input)
์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ค.- ์๋ ์ฝ๋๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ ๊ฒ์ ๊ฐ์งํ๋ค.
sharedViewModel.inputNumber.observe(this,Observer { it?.let { // do some thing with the number } })
- https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
-
-
AAC LiveData
-
LiveData๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ๋ ํด๋์ค์ด๋ค. ์ผ๋ฐ์ ์ธ ๊ด์ฐฐ๊ฐ๋ฅํจ๊ณผ๋ ๋ค๋ฅด๊ฒ, LiveData๋ Activity, Fragment, Service์ ๊ฐ์ ์ฑ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ธ์ํ๊ณ , ๊ทธ๋๋ก ๋ฐ๋ฅด๋๋ก ๊ตฌํ๋์ด ์๋ค. ์ด๋ LiveData๊ฐ ํ์ฌ ํ์ฑํ๋ ์๋ช ์ฃผ๊ธฐ์ ์๋ ์ฑ ์ปดํฌ๋ํธ์ ์ต์ ๋ฒ(Observer)๋ง ์ ๋ฐ์ดํธ ํ๋๋ก ๋ณด์ฅํ๋ค.
-
LifecycleOwner ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด์ ์์ ์ด๋ฃจ๋ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋ก ํ ์ ์๋ค. ์ด๋ฌํ ํน์ฑ์ ํนํ Activity, Fragment์ ์๋ช ์ฃผ๊ธฐ๊ฐ destroy ์ํ๊ฐ ๋์์ ๋, ์ฆ์ ๊ด์ฐฐ์ ์ทจ์ํ๋ฏ๋ก LiveData๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ๊ด์ฐฐํ ์ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ ๋ํ ์ฐ๋ ค๋ ์์ด์ง๋ฏ๋ก ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค.
-
LiveData ์ฅ์
1. UI๋ฅผ ๋ฐ์ดํฐ ์ํ์ ์ผ์น ์ํฌ ์ ์๋ค.
- LiveData๋ ์ต์ ๋ฒํจํด์ ๋ฐ๋ฅด๊ณ ์๋ค. ์๋ช ์ฃผ๊ธฐ ์ํ์ ๋ณํ๊ฐ ์๊ธฐ๋ฉด LiveData๋ Observer์ธ์คํด์ค์ ์๋ฆผ์ ๋ณด๋ธ๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ๊ฐ๋ฐ์๋ Observer ๊ฐ์ฒด ์์์ UI๊ฐ ๊ฐฑ์ ๋๋๋ก ์ฝ๋๋ฅผ ํตํฉํ ์ ์๋ค. ์ฑ์ ๋ฐ์ดํฐ๊ฐ ๋ณํ ๋๋ง๋ค ๋งค๋ฒ UI๋ฅผ ๊ฐฑ์ ํ๋ ๋์ , ์ต์ ๋ฒ์ ๋ณํ๊ฐ ๊ฐ์ง๋ ๋๋ง๋ค UI๋ฅผ ๊ฐฑ์ ํ๋๋ก ๋ฐ๊ฟ ์ ์๋ค.
2. ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ ์์๋ฅผ ์์จ ์ ์๋ค.
-
์ต์ ๋ฒ๋ค์ Lifecycle ๊ฐ์ฒด์ ๋ฐ์ธ๋๋๊ณ , ๊ทธ Lifecycle ๊ฐ์ฒด๊ฐ destroy ์ํ๊ฐ ๋๋ฉด ์๋์ ์ผ๋ก ์ง์์ง๋ค. 3. ์ ์ง๋ ์ํฐ๋นํฐ๋ค ๋๋ฌธ์ Crash๋ ์ผ์ด ์๋ค.
-
์ํฐ๋นํฐ๊ฐ ๋ฐฑ์คํ์ ์์๋์ ๊ฐ์ด, ์ต์ ๋ฒ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋นํ์ฑํ ์ํ์ผ ๋๋, ์ด๋ ํ LiveData ์ด๋ฒคํธ๋ ๋ฐ์ง ์๋๋ค.
4. ์ง์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํธ๋ค๋งํ ํ์๊ฐ ์๋ค.
- UI ์ปดํฌ๋ํธ๋ ๋จ์ง ์ฐ๊ด๋ ์์ดํฐ๋ฅผ ๊ด์ฐฐํ๊ธฐ๋ง ํ๊ณ , resume/stop์ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค. LiveData๊ฐ ์ํ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ์์์ ์ฒ๋ฆฌํ๋ค.
5. ํญ์ ์ต์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ค.
- ์๋ช ์ฃผ๊ธฐ๊ฐ ๋นํ์ฑํ ์ํ์์ ํ์ฑํ ์ํ๋ก ๋ณํ์ ๋,UI์ปดํฌ๋ํธ๋ ์ต์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค.
6. ๊ตฌ์ฑ(Configuration)์ด ๋ณ๊ฒฝ๋์์ ๋ ์ ์ ํ๊ฒ ๋์ํ๋ค.
-
Activity๋ Fragment๊ฐ ๊ตฌ์ฑ๋ณ๊ฒฝ๋์ด ์ฌ์์ฑ๋ ๋, ๊ทธ ์ปดํฌ๋ํธ๋ค์ LiveData๋ก ๋ถํฐ ์ฆ์ ์ฌ์ฉ๊ฐ๋ฅํ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต๋ฐ๋๋ค.
-
์ฑ๊ธํด ํจํด์ ์ด์ฉํด ์์คํ ์๋น์ค๋ฅผ ๋ํํ์ฌ LiveData๊ฐ์ฒด๊ฐ ๊ณต์ ๋ ์ ์๋๋ก ํ์ฅํ ์ ์๋ค. LiveData์ค๋ธ์ ํธ๊ฐ ์์คํ ์๋น์ค์ ํ๋ฒ ์ฐ๊ฒฐ๋๋ฉด, ๋ฆฌ์์ค๊ฐ ํ์ํ ๋ชจ๋ ์ต์ ๋ฒ๋ LiveData ๊ฐ์ฒด๋ฅผ ๋ณผ ์ ์๋ค.
-
LiveData ๊ฐ์ฒด์์ฑ ๋ฐฉ๋ฒ
- ํน์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ LiveData์ธ์คํด์ค๋ฅด ์์ฑํ๋ค. ์ด ์์ ์ ์ฃผ๋ก ViewModel ํด๋์ค ์์์ ์ด๋ฃจ์ด์ง๋ค.
- onChanged() ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์๋ Observer ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. onChanged() ๋ฉ์๋๋ LiveData๊ฐ ์ ์งํ๊ณ ์๋ ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ๊ฐ์ง๋์์ ๋ ์ด๋ป๊ฒ ๋์ํ ์ง๋ฅผ ์ ์ดํ๋๋ก ๊ตฌํํ๋ค. ๋๋ถ๋ถ Activity๋ Fragment ๊ฐ์ UI์ปจํธ๋กค๋ฌ์์ Observer ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
- observe() ๋ฉ์๋๋ฅผ Observer์ธ์คํด์ค๋ฅผ LiveData ์ธ์คํด์ค์ ์ฐ๊ฒฐํ๋ค.Observe ๋ฉ์๋๋ LivecycleOwner ์ธ์คํด์ค๋ฅผ ๋ฐ๋๋ค. ์ด๋ Observer ์ธ์คํด์ค๊ฐ LiveData ์ธ์คํด์ค๋ฅผ ๊ตฌ๋ ํ๋๋ก ํ์ฌ, ๋ณํ์ ๋ํด ์๋ฆผ์ ๋ฐ๋๋ก ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก Observer ์ธ์คํด์ค๋ Activity๋ Fragment ๊ฐ์ UI์ปจํธ๋กค๋ฌ์ ๋ถ์ธ๋ค.
-
-
Architecture ViewModel
๊ณผAAC ViewModel
๊ฐ์ ์ฐจ์ด์ - Architecture ViewModel: View์ ๋ณด์ฌ์ง ๋ฐ์ดํฐ๋ฅผ Repository์์ ๊ฐ์ ธ์ ๋ก์ง์ ๊ตฌํํ๋ค. observableField๋ก data๊ฐ ๋ฐ๋๋ ๊ฒ์ ๊ฐ์งํ๋ค.
- AAC ViewModel: ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ฝ๋ค. ํนํ ๊ฐ๋ก๋ชจ๋์ผ ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐฑ์ ๋๋ค. ViewModel์ ์ฌ์ฉํ์ง ์์ ๋๋
onSaveInstanceState()
๋ฉ์๋๋ฅผ ์จ์onCreate()
์์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์์ง๋ง ์ด๋ฅผ ๊ตฌํํ์ง ์์๋ ๋๋ค.
-
https://duzi077.tistory.com/196 [๊ฐ๋ฐํ๋ ๋๋์ง]
-
https://developer.android.com/topic/libraries/architecture/viewmodel
โ๏ธISSUE
- ์์ ๊ฐ์ด binding๋์ง ์๋๋ค ํด๊ฒฐ
-
Koin
-
DI(Dependency injection): ๊ตฌ์ฑ์์๊ฐ์ ์์กด ๊ด๊ณ๊ฐ ์์ค์ฝ๋ ๋ด๋ถ๊ฐ ์๋ ์ธ๋ถ ์ค์ ํ์ผ๋ฑ์ ํตํด ์ ์๋๊ฒํ๋ ๋์์ธ ํจํด์ค ํ๋์ ๋๋ค
-
๋ถ๋ฆฌ์์ผ ๋์ผ๋ฉด ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ์ํฌ ์ ์๊ณ , ์ฌ์ฌ์ฉ์ด ์ ์ฐํด์ง๋๋ค.
-
ํค์๋
- module - Koin๋ชจ๋์ ์ ์ํ ๋ ์ฌ์ฉ
- factory - injectํ๋ ์์ ์ ํด๋น ๊ฐ์ฒด๋ฅผ ์์ฑ
- single - ์ฑ์ด ์ด์์๋ ๋์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์์ฑ
- bind - ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ํ์ ์ผ๋ก ๋ฐ์ธ๋ฉํ๊ณ ์ถ์๋ ์ฌ์ฉ
- get - ์ฃผ์ ํ ๊ฐ ์ปดํฌ๋ํธ๋ผ๋ฆฌ์ ์์กด์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ
โ๏ธISSUE
-