[Android] ViewModel

๐Ÿ’กAAC์˜ ViewModel์— ๋Œ€ํ•˜์—ฌ ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

ViewModel

  • ViewModel์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์•„ํ‚คํ…์ฒ˜ ์ปดํฌ๋„ŒํŠธ(AAC)์˜ ์ผ๋ถ€๋กœ UI ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ™”๋ฉด ํšŒ์ „ ๊ฐ™์€ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง€์†์ ์œผ๋กœ ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ViewModel ๊ฐœ์š”  |  Android Developers

 

ViewModel ๊ฐœ์š”  |  Android Developers

ViewModel์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ UI ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

developer.android.com

 

ํŠน์ง•

  • Activity๋‚˜ Fragment ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • UI ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์žฌ์ƒ์ƒ๋˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋˜์ง€ ์•Š๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

AAC?

  • Android Architecture Components
  • ๊ตฌ๊ธ€์—์„œ ์ œ์ž‘ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ์ข€ ๋” ์‰ฝ๊ณ  ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • AAC๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์•ฑ์„ ๋””์ž์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ViewModelStoreOwner

  • ViewModelStoreOwner๋Š” ViewModel์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • ViewModelStoreOwner๋Š” ViewModelStore๋ฅผ ์†Œ์œ ํ•˜๊ณ , ViewModel์„ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ViewModel์„ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ๋Š” ViewModelStoreOwner ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์—ญํ• 

  • ViewModel ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ
  • ViewModel ์žฌ์‚ฌ์šฉ & ๊ณต์œ 

ViewModelStoreOwner์™€ Navigation์˜ ํ†ตํ•ฉ

  • ViewModelStoreOwner๋Š” Navigation ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ†ตํ•ฉํ•˜์—ฌ ์ •๊ตํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • Navigation์€ NavController์™€ NavHostFragment๋ฅผ ์‚ฌ์šฉํ•ด ํ™”๋ฉด ์ „ํ™˜์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ๊ฐ Destination์ด ๊ณ ์œ ํ•œ ViewModelStoreOwner๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

val viewModel = ViewModelProvider(navController.getViewModelStoreOwner(R.id.navigation_graph)).get(MyViewModel::class.java)
  • ์œ„ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด NavController์™€ ํ•จ๊ป˜ ํŠน์ • navigation graph์— ๋Œ€ํ•ด ViewModel์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ViewModelProvider

  • ViewModelProvider๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ViewModel ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • ViewModel์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , Activity ๋˜๋Š” Fragment์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ์ ์ ˆํ•œ ์‹œ์ ์— ViewModel์„ ์ œ๊ณตํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ViewModelProvider ๊ธฐ๋ณธ ์‚ฌ์šฉ

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง„ ViewModel์„ Activity๋‚˜ Fragment์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ViewModelProvider๋ฅผ ํ†ตํ•ด ViewModel ๊ฐ€์ ธ์˜ค๊ธฐ
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    }
}
  • ViewModelProvider(this)๋ฅผ ํ†ตํ•ด ์ƒ๋ช… ์ฃผ๊ธฐ์— ์—ฐ๊ฒฐ๋œ ViewModel์„ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Factory๋ฅผ ์‚ฌ์šฉํ•œ ViewModel ์ƒ์„ฑ

  • ViewModel์ด ์˜์กด์„ฑ์„ ํ•„์š”๋กœํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ViewModelProvider.Factory๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(repository) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val repository = MyRepository()
        val factory = MyViewModelFactory(repository)

        // ViewModelProvider์™€ Factory๋ฅผ ํ†ตํ•ด ViewModel ๊ฐ€์ ธ์˜ค๊ธฐ
        viewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
    }
}

์ƒ๋ช… ์ฃผ๊ธฐ์™€์˜ ๊ด€๊ณ„

  • ViewModelProvider๋Š” ViewModelStoreOwner์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ViewModel์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

ViewModel LifeCycle

  • ๋ทฐ๋ชจ๋ธ์€ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ทธ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

image.png

ViewModel ๊ฐœ์š”  |  Android Developers

 

ViewModel ๊ฐœ์š”  |  Android Developers

ViewModel์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ UI ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

developer.android.com

์ƒ์„ฑ ์‹œ์ 

  • Activity ๋˜๋Š” Fragment๊ฐ€ ์ฒ˜์Œ ์ƒ์…ฉ๋  ๋•Œ ViewModelProvider์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • Activity๋‚˜ Fragment์™€ ์—ฐ๊ฒฐ๋œ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๋”ฐ๋ฅด์ง€๋งŒ, ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์œ ์ง€ ์‹œ์ 

  • ViewModel์€ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•ด๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†Œ๋ฉธ ์‹œ์ 

  • Activity, Fragment์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€๋งŒ, ์†Œ๋ฉธ ์‹œ์ ์€ ๋” ๋Šฆ์Šต๋‹ˆ๋‹ค.
    • Activity๊ฐ€ ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ, Activity๊ฐ€ ์žฌ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    • Fragment๊ฐ€ ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜์—ˆ์„ ๋•Œ, Fragment๊ฐ€ ์žฌ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

onCleared()

  • ViewModel์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์†Œ๋ฉธ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ ์ •๋ฆฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class MyViewModel : ViewModel() {
    override fun onCleared() {
        super.onCleared()
        // ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ, ๋ฐ์ดํ„ฐ ์ €์žฅ ๋“ฑ ์ž‘์—…์„ ์ˆ˜ํ–‰
    }
}

Configuration Change

  • ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‹œ onDestory()๊ฐ€ ํ˜ธ์ถœ๋˜์–ด๋„ ViewModel์„ ์†Œ๋ฉธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•กํ‹ฐ๋น„ํ‹ฐ ๋‚ด์—์„œ fiinish()๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๊ฐ€ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋‹ซ์„ ๋•Œ ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค.

onSaveInstanceState(), onRestoreInstanceState()

  • ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ onSaveInstanceState(), onRestoreInstanceState()๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ๋‹ค์‹œ ์ „๋‹ฌ๋ฐ›๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋ฅผ ์ œํ•œํ•˜๊ณ , ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์—๋Š” ์ œํ•œ์ด ์žˆ์œผ๋ฏ€๋กœ ViewModel์„ ํ™œ์šฉํ•ด์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ViewModel๊ณผ Context

  • ViewModel์€ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ํŒŒ๊ดด๋œ ํ›„์—๋„ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ViewModel์— Context๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด ๊ด€๋ จ๋œ ๊ตฌ์„ฑ์ด ํŒŒ๊ดด๋˜์–ด๋„ ๊ทธ ๊ฐ์ฒด๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Application Context, Activity Context

  • Context๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ActivityContext๊ฐ€ ์•„๋‹Œ ApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ์ง€์†๋˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜์ด ์—†๊ณ , ViewModel์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ApplicationContext๋Š” ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, UI ๊ด€๋ จ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AndroidViewModel ํ™œ์šฉ

  • AndroidViewModel์€ ViewModel์˜ ์„œ๋ธŒํด๋ž˜์Šค๋กœ Application Context๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.
  • AndroidViewModel๋ฅผ ์ƒ์†ํ•˜๋ฉด ์ƒ์„ฑ์ž์—์„œ ApplicationContext์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” Activity๋‚˜ Fragment์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋ฌด๊ด€ํ•˜๊ฒŒ Context๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class MyViewModel(application: Application) : AndroidViewModel(application) {

    // Application Context๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉ
    private val context: Context = getApplication<Application>().applicationContext

    fun doSomethingWithContext() {
        // Application Context ์‚ฌ์šฉ
        val sharedPreferences = context.getSharedPreferences("prefs", Context.MODE_PRIVATE)
    }
}

Context ์ „๋‹ฌ

  • ViewModel์—์„œ Context๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋งŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • Context๊ฐ€ ์ง€์†์ ์œผ๋กœ ์œ ์ง€๋˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
class MyViewModel : ViewModel() {

    fun performActionWithContext(context: Context) {
        // ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ Context ์‚ฌ์šฉ
        val sharedPreferences = context.getSharedPreferences("prefs", Context.MODE_PRIVATE)
    }
}
  • ์ด ๋ฐฉ์‹์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ViewModel์ด Context์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Repository ํŒจํ„ด ํ™œ์šฉ

  • Repository ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ Context๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์„ Repository์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ViewModel์€ Repository์™€ ํ†ต์‹ ํ•˜๊ณ , Context ๊ด€๋ จ ์ž‘์—…์€ Repository ๋‚ด๋ถ€์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
class MyRepository(private val context: Context) {
    fun saveDataToPreferences(data: String) {
        val sharedPreferences = context.getSharedPreferences("prefs", Context.MODE_PRIVATE)
        sharedPreferences.edit().putString("key", data).apply()
    }
}

class MyViewModel(private val repository: MyRepository) : ViewModel() {
    fun saveData(data: String) {
        repository.saveDataToPreferences(data)
    }
}
  • ViewModel์ด Context์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ฉฐ, ViewModel๊ณผ Context ๊ด€๋ จ ์ž‘์—…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.