/Android_Pattern

Repository, MVP, MVVM, AAC, Koin

Primary LanguageJava

๐ŸŒผ Android Architecture ๐ŸŒผ











๐ŸŒธ1์ฐจ Study

  • ํ•˜๋‚˜์˜ MainActivity์™€ 4๊ฐœ์˜ Fragment ๊ตฌํ˜„
  • Retrofit์„ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„ํ†ต์‹ 
  • QUOTATION API

    โ—๏ธISSUE

    • ํ”„๋ ˆ๊ทธ๋จผํŠธ 4๊ฐœ๋ฅผ ๊ฐ๊ฐ ๋งŒ๋“ค์—ˆ๋‹ค ํ•˜๋‚˜์˜ ํ”„๋ ˆ๊ทธ๋จผํŠธ๋ฅผ ์žฌํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ? ํ•ด๊ฒฐ
    • tickers๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ market์ด๋ฆ„์„ ํ•˜๋“œ์ฝ”๋”ฉํ•ด์„œ 10๊ฐœ๋งŒ ๊ฐ€์ ธ์™”๋‹ค. ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์€? ํ•ด๊ฒฐ
    • text์˜ ์ƒ‰์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. ํ•ด๊ฒฐ









๐ŸŒธ 2์ฐจ Study

  • Android Repository Pattern

  • Data ๋ ˆ์ด์–ด๋ฅผ Repository์™€ DataSource๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ

  • DataSource๋Š” RemoteDataSource์™€ LocalDataSource๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.

  • RemoteDataSource๋Š” APIํ†ต์‹ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

  • LocalDataSource์—๋Š” Room, SQLite, Realm, SharedPreference ๋“ฑ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ๋‚ด๋ถ€์ €์žฅ์†Œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ตฌ์ง์ด๋‹ค. image

  • google todo-list sample(repository)

  • ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ(repository)

    โ—๏ธISSUE

    • Adapter์— ViewHolder๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜? ํ•ด๊ฒฐ
    • ViewHolder์™€ Data Class๋Š” ๋ณ€์ˆ˜ํ˜•์ด var์ธ๊ฐ€ val์ธ๊ฐ€? ํ•ด๊ฒฐ
    • Adapter์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ context๊ฐ€ ํ•„์š”ํ•œ๊ฐ€? ํ•ด๊ฒฐ
    • RecyclerView setupํ•˜๋Š” ์‹œ์ ์€ ์–ธ์ œ์ธ๊ฐ€? ํ•ด๊ฒฐ









๐ŸŒธ 3์ฐจ, 4์ฐจ Study

  • 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์™€ ์—ฐ๋™๋œ๋‹ค. image

    • MVP ๋ธ”๋กœ๊ทธ

    • google todo-list sample(MVP)

      โ—๏ธISSUE

      • interface method๋ฅผ ๋งŒ๋“ค ๋•Œ ๋งŽ์ด ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ? ํ•ด๊ฒฐ
      • Fragment๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  bundle๋กœ ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ? ํ•ด๊ฒฐ









๐ŸŒธ 5์ฐจ Study

  • Databinding : ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ์  ํ˜•์‹์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์˜ UI ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์•ฑ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • @{} ํ˜•์‹์„ ํ†ตํ•ด findViewById๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ํ™œ๋™์—์„œ ๋งŽ์€ UI ํ”„๋ ˆ์ž„์›Œํฌ ํ˜ธ์ถœ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ํŒŒ์ผ์ด ๋”์šฑ ๊ฐ„์†Œํ™”๋˜๊ณ  ์œ ์ง€๊ด€๋ฆฌ ๋˜ํ•œ ์‰ฌ์›Œ์ง„๋‹ค. ์•ฑ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ null pointer exceptions๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

    1. build.gradle์˜ kotlin-extension์„ ์ œ๊ฑฐํ•œ๋‹ค. ์ œ๊ฑฐ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ข‹์ง€๋งŒ findViewId๋ฅผ ์ด์šฉ์„ ๋ง‰๊ธฐ ์œ„ํ•จ์ด๋‹ค.
    2. build.gradle ํŒŒ์ผ์— ์•„๋ž˜์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
      dataBinding{
          enabled = true
      }  
      
    3. xml์—์„œ ์ตœ์ƒ์œ„ ํƒœ๊ทธ๋ฅผ layout์œผ๋กœ ํ•œ๋‹ค.
    4. activity์—์„œ setContentView๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
      lateinit var binding = DataBindingUtil.setContentView(this, [layoutId])
      
    5. RecyclerView์—์„œ ๊ฐ๊ฐ์˜ item์„ setํ•ด์ฃผ๋Š” ์ž‘์—…๋„ xml์—์„œ ๋‹ค ์จ์ฃผ๋ฉด ์•Œ์•„์„œ ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด View๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
  • Android Developer Web Site- Data Binding

  • ๋ฐ•์ƒ๊ถŒ์˜ ์‚ฝ์งˆ๋ธ”๋กœ๊ทธ

    โ—๏ธISSUE

    • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์„ ๋•Œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ํ•ด๊ฒฐ
    • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ธธ ๋•Œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ํ•ด๊ฒฐ
    • run, let, apply, also ๋„๋Œ€์ฒด ์ด๊ฒƒ๋“ค์„ ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ํ•ด๊ฒฐ









๐ŸŒธ 6์ฐจ, 7์ฐจ Study

  • 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 [๊ฐœ๋ฐœํ•˜๋Š” ๋‘๋”์ง€]

  • google todo-list sample(MVVM)

    โ—๏ธISSUE

    • FragmentPagerAdapter์™€ FragmentStatePagerAdapter์ค‘ ์–ด๋Š๊ฒƒ์„ ์จ์•ผํ• ๊นŒ? ํ•ด๊ฒฐ
    • lateinit๊ณผ lazy ์ดˆ๊ธฐํ™” ์ค‘ ์–ด๋Š๊ฒƒ์„ ์จ์•ผํ• ๊นŒ? ํ•ด๊ฒฐ
    • compositeDisposable์„ ViewModel์—์„œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ณ ๋ คํ•ด ์–ด๋Š๊ณณ์— ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ? ํ•ด๊ฒฐ









๐ŸŒธ 8์ฐจ Study

  • 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 ๊ฐ์ฒด์ƒ์„ฑ ๋ฐฉ๋ฒ•

      1. ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  LiveData์ธ์Šคํ„ด์Šค๋ฅด ์ƒ์„ฑํ•œ๋‹ค. ์ด ์ž‘์—…์€ ์ฃผ๋กœ ViewModel ํด๋ž˜์Šค ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค.
      2. onChanged() ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š” Observer ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. onChanged() ๋ฉ”์„œ๋“œ๋Š” LiveData๊ฐ€ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€๋ฅผ ์ œ์–ดํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„ Activity๋‚˜ Fragment ๊ฐ™์€ UI์ปจํŠธ๋กค๋Ÿฌ์—์„œ Observer ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
      3. observe() ๋ฉ”์„œ๋“œ๋ฅผ Observer์ธ์Šคํ„ด์Šค๋ฅผ LiveData ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•œ๋‹ค.Observe ๋ฉ”์„œ๋“œ๋Š” LivecycleOwner ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ด๋Š” Observer ์ธ์Šคํ„ด์Šค๊ฐ€ LiveData ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋…ํ•˜๋„๋ก ํ•˜์—ฌ, ๋ณ€ํ™”์— ๋Œ€ํ•ด ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Observer ์ธ์Šคํ„ด์Šค๋Š” Activity๋‚˜ Fragment ๊ฐ™์€ UI์ปจํŠธ๋กค๋Ÿฌ์— ๋ถ™์ธ๋‹ค.
    • http://dktfrmaster.blogspot.com/2018/02/livedata.html

  • Architecture ViewModel๊ณผ AAC ViewModel๊ฐ„์˜ ์ฐจ์ด์ 

    1. Architecture ViewModel: View์— ๋ณด์—ฌ์งˆ ๋ฐ์ดํ„ฐ๋ฅผ Repository์—์„œ ๊ฐ€์ ธ์™€ ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค. observableField๋กœ data๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•œ๋‹ค.
    2. AAC ViewModel: ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค. ํŠนํžˆ ๊ฐ€๋กœ๋ชจ๋“œ์ผ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค. ViewModel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” onSaveInstanceState() ๋ฉ”์†Œ๋“œ๋ฅผ ์จ์„œ onCreate()์—์„œ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • https://duzi077.tistory.com/196 [๊ฐœ๋ฐœํ•˜๋Š” ๋‘๋”์ง€]

  • https://developer.android.com/topic/libraries/architecture/viewmodel

    โ—๏ธISSUE

    • ์ƒ‰์ƒ ๊ฐ’์ด binding๋˜์ง€ ์•Š๋Š”๋‹ค ํ•ด๊ฒฐ









๐ŸŒธ 9์ฐจ Study

  • Koin

    • DI(Dependency injection): ๊ตฌ์„ฑ์š”์†Œ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๊ฐ€ ์†Œ์Šค์ฝ”๋“œ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€ ์„ค์ • ํŒŒ์ผ๋“ฑ์„ ํ†ตํ•ด ์ •์˜๋˜๊ฒŒํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค

    • ๋ถ„๋ฆฌ์‹œ์ผœ ๋†“์œผ๋ฉด ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์„ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ์žฌ์‚ฌ์šฉ์ด ์œ ์—ฐํ•ด์ง‘๋‹ˆ๋‹ค.

    • ํ‚ค์›Œ๋“œ

      • module - Koin๋ชจ๋“ˆ์„ ์ •์˜ํ• ๋•Œ ์‚ฌ์šฉ
      • factory - injectํ•˜๋Š” ์‹œ์ ์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
      • single - ์•ฑ์ด ์‚ด์•„์žˆ๋Š” ๋™์•ˆ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
      • bind - ์ƒ์„ฑํ•  ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉ
      • get - ์ฃผ์ž…ํ•  ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

    โ—๏ธISSUE

    • ๋ชจ๋“ˆํ™”๋Š” ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๋Š”๊ฐ€? ํ•ด๊ฒฐ
    • Service, Datasource, Repository๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋ ค๋ฉด ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋“ค์„ ์ธ์ž, ์ƒ์†, ๋ณ€์ˆ˜ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ํ•ด๊ฒฐ