๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] MVVM ๊ตฌ์กฐ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

interfacer_han 2024. 1. 22. 12:04

#1 ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์˜ '์ „ํ†ต์ ์ธ' ๋ฐฉ์‹ vs MVVM ํŒจํ„ด

#1-1 ๋„์‹๋„์™€ ์ข…์†์„ฑ

ํ™”์‚ดํ‘œ๋Š” ํด๋ž˜์Šค ๊ฐ„์˜ ์ข…์†์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, View๋Š” ViewModel์— ์ข…์†๋œ๋‹ค. ์ข…์†์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” '์ž์ฃผ์„ฑ์ด ์—†์ด ์ฃผ๊ฐ€ ๋˜๋Š” ๊ฒƒ์— ๋”ธ๋ ค ๋ถ™์Œ'์ด๋‹ค. ์ข…์†์€ '์•Œ์•„์•ผ ํ•œ๋‹ค'๋ผ๋Š” ๋ง๋กœ๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ View๋Š” ViewModel์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋ฐ˜๋ฉด, ViewModel์€ View๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค. ViewModel์„ ์„ค๊ณ„ํ•  ๋• View์—์„œ ๋ญ˜ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ „ํ˜€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค (๋Œ€์‹ , ViewModel์€ Model์— ๋Œ€ํ•ด ์ข…์†์ ์ด๋ฏ€๋กœ Model๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค). View๋ฅผ ์„ค๊ณ„ํ•  ๋• ViewModel์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. '์•Œ์•„์•ผ ํ•˜๋Š” ์ชฝ'์—์„œ '๋ชฐ๋ผ๋„ ๋˜๋Š” ์ชฝ'์œผ๋กœ ํ™”์‚ดํ‘œ๋ฅผ ์ด์€ ๊ฒƒ์ด ์œ„ ๋„์‹๋„๋‹ค.

 

#1-2 ๋ชจ๋“ˆ์„ฑ๊ณผ ๊ฒฐํ•ฉ๋„

์ „ํ†ต์ ์ธ ๋ฐฉ์‹์—์„œ๋Š” Activity๊ฐ€ UI ๋กœ์ง(ํ™”๋ฉด ํ‘œ์‹œ ๋ฐ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์ฒ˜๋ฆฌ)๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ ๋“ฑ)์„ ๋ชจ๋‘ ๋‹ด๋‹นํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ, Activity์˜ ์ฝ”๋“œ๋Ÿ‰์ด ๋ฐฉ๋Œ€ํ–ˆ๋‹ค. ๋ชจ๋“ˆ์„ฑ์ด ๋‚ฎ๊ณ , ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์—ˆ๋‹ค. MVVM ํŒจํ„ด์€ Activity์˜ UI ๋กœ์ง์„ View๊ฐ€, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ViewModel๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค. Activity์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜์”ฉ ๊ฐ€์ ธ๊ฐ„๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค.

 

๋˜, MVVM ํŒจํ„ด์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ์•”์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๋™์ž‘์„ ์ •์˜ํ•˜๊ณ , LiveData์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ๊นŒ์ง€ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ, View์™€ ViewModel ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋”์šฑ ๋‚ฎ์ถ˜๋‹ค.

 

#1-3 ๊ตฌ๊ธ€์˜ ๊ถŒ์žฅ ์„ค๊ณ„

https://developer.android.com/topic/architecture ์— '์žˆ์—ˆ๋˜' ๋„์‹๋„. ํ˜„์žฌ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์œผ๋‚˜ ์ด ์˜ˆ์ „ ๋„์‹๋„๊ฐ€ ํ•œ ๋ˆˆ์— ๋ณด๊ธฐ ์ข‹์•„ ์ฒจ๋ถ€ํ–ˆ๋‹ค.

์œ„ ๋„์‹๋„์—” Repository๋ผ๋Š” ๋ชจ๋“ˆ์ด ์ถ”๊ฐ€๋กœ ์žˆ๋‹ค. Repository๋Š” Model์—์˜ ์ ‘๊ทผ์„ ํ•œ ์ธต ๋” ์บก์Šํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. Activity๋‚˜ Fragment๋Š” ViewModel์„ ์•Œ์•„์•ผํ•˜๊ณ , ViewModel์€ Repository๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค. Repository๋Š” Model์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ, Repository๊ฐ€ ViewModel์„ ์•Œ๊ฑฐ๋‚˜(= ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ๋“ฑ์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜), ViewModel์ด Activity๋‚˜ Fragment๋ฅผ ์•Œ์•„์„œ๋Š” (= ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ๋“ฑ์„ ์ฐธ์กฐํ•ด์„œ๋Š”) ์•ˆ ๋œ๋‹ค.

 

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๊ตฌํ˜„ํ•œ MVVM ํŒจํ„ด์˜ ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ์ด๋‹ค.

 

#2 Data Binding

 

[Android] Data Binding - ๊ธฐ์ดˆ

#1 ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ ์ „ #1-1 ์˜ˆ์‹œ ์•ฑ ์œ„๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์•ฑ์ด ์žˆ๋‹ค. Button์„ ๋ˆ„๋ฅด๋ฉด, EditText์˜ text๊ฐ€ ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” TextView์˜ text์— ๋Œ€์ž…๋œ๋‹ค. ์ด ์•ฑ์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. #1-2 activity_main.xml #1-3 Main

kenel.tistory.com

Activity์—์„œ ์˜ˆ๋ฅผ ๋“ค DataBindingUtil.setContentView(this, R.layout.activity_main)์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ View์™€ ์—ฐ๊ฒฐํ•œ๋‹ค. ์ด ์ž์ฒด๋กœ findViewById()๋ฅผ ์ผ์ผ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ์— ๋ฒŒ์จ ์ฝ”๋“œ๋Ÿ‰์ด ์ค„์–ด๋“ ๋‹ค.

 

 

[Android] Data Binding - View์— ๊ฐ์ฒด ์ „๋‹ฌ

#1 ๊ฐ์ฒด ์ „๋‹ฌ์˜ ํ•„์š”์„ฑ #1-1 ์ด์ „ ๊ธ€ Data Binding - ๊ธฐ์ดˆ #1 ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ ์ „ #1-1 ์˜ˆ์‹œ ์•ฑ ์œ„๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์•ฑ์ด ์žˆ๋‹ค. Button์„ ๋ˆ„๋ฅด๋ฉด, EditText์˜ text๊ฐ€ ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” TextView์˜ text์— ๋Œ€์ž…๋œ๋‹ค. ์ด

kenel.tistory.com

View์—์„œ Activity ๋˜๋Š” ViewModel์˜ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

#3 ViewModel

 

[Android] ViewModel - ๊ธฐ์ดˆ

#1 View Model์˜ ํ•„์š”์„ฑ #1-1 ์˜ˆ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด TextView์˜ text๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์˜ˆ์‹œ ์•ฑ์ด๋‹ค. MainActivity.kt ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. // package com.example.viewmodelbasics import androidx.appcompat.app.AppCompatActivity import and

kenel.tistory.com

ViewModel์€ ๋จผ์ €, Activity์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋…๋ฆฝ์ ์ธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ธฐ์— Activity์— ๋น„ํ•ด View์— ์ผ๊ด€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๊ฒƒ๋„ ์žฅ์ ์ด์ง€๋งŒ, Activity์— ์žˆ๋˜ ๋ฐ์ดํ„ฐ(Model) ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ViewModel๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Activity์˜ ๋ฌด๊ฒŒ๊ฐ€ ํ•œ๊ฒฐ ์ค„์–ด๋“œ๋Š” ํšจ๊ณผ๋„ ์žˆ๋‹ค.

 

 

[Android] ViewModel - ๋ทฐ ๋ชจ๋ธ์— ์ธ์ž(Argument) ์ „๋‹ฌ

#1 ViewModelProvider ํด๋ž˜์Šค ๋ถ„์„ #1-1 ์ด์ „ ๊ธ€์˜ ์˜ˆ์ œ ์ˆ˜์ • [Android] View Model - ๊ธฐ์ดˆ #1 View Model์˜ ํ•„์š”์„ฑ#1-1 ์˜ˆ์ œ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด TextView์˜ text๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์˜ˆ์‹œ ์•ฑ์ด๋‹ค. MainActivity.kt ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

kenel.tistory.com

Activity์—์„œ ViewModel์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ, ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ฝ”๋“œ.

 

 

[Android] ViewModel - View์— ๊ฐ์ฒด(ViewModel) ์ „๋‹ฌ

#1 ๊ฐœ์š” #1-1 Data Binding๊ณผ ViewModel [Android] Data Binding - View์— ๊ฐ์ฒด ์ „๋‹ฌ #1 ๊ฐ์ฒด ์ „๋‹ฌ์˜ ํ•„์š”์„ฑ #1-1 ์ด์ „ ๊ธ€ Data Binding - ๊ธฐ์ดˆ #1 ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ ์ „ #1-1 ์˜ˆ์‹œ ์•ฑ ์œ„๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์•ฑ์ด ์žˆ๋‹ค. Button์„

kenel.tistory.com

View์—์„œ ViewModel ์ž์ฒด๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

#4 LiveData

 

[Android] LiveData - ๊ธฐ์ดˆ

#1 ๊ฐœ์š” #1-1 LiveData LiveData ๊ฐœ์š” | Android ๊ฐœ๋ฐœ์ž | Android Developers LiveData๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. developer.android.com LiveData. ๋ฌธ์„œ์ ์ธ ์ •์˜๋Š” Data์˜ ๋ณ€๊ฒฝ์„ ๊ด€

kenel.tistory.com

LiveData๋Š” '๊ด€์ฐฐ(observe)'์„ ํ†ตํ•ด, ๊ทธ ๊ฐ’์ด ํ‘œ์‹œ๋˜๋Š” View๋ฅผ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

[Android] LiveData - ์•”์‹œ์ ์œผ๋กœ '๊ด€์ฐฐ'ํ•˜๊ธฐ

#1 ViewModel ์†์— LiveData๊ฐ€ ์žˆ๋Š” ์ƒ˜ํ”Œ ์•ฑ [Android] ViewModel - View์— ๊ฐ์ฒด(ViewModel) ์ „๋‹ฌ #1 ๊ฐœ์š” #1-1 Data Binding๊ณผ ViewModel [Android] Data Binding - View์— ๊ฐ์ฒด ์ „๋‹ฌ #1 ๊ฐ์ฒด ์ „๋‹ฌ์˜ ํ•„์š”์„ฑ #1-1 ์ด์ „ ๊ธ€ Data Binding -

kenel.tistory.com

LiveData์˜ '๊ด€์ฐฐ'์„ ์•”์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด ์ฝ”๋“œ๋Ÿ‰์„ ์ค„์ธ๋‹ค.

 

 

[Android] LiveData - ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

#1 ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ #1-1 ๋‹จ๋ฐฉํ–ฅ๊ณผ ์–‘๋ฐฉํ–ฅ ์ง€๊ธˆ๊นŒ์ง€ ํ•ด์˜จ Data Binding์€ ๋‹จ๋ฐฉํ–ฅ(One Way) ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด์—ˆ๋‹ค. Model ๋˜๋Š” ViewModel์—์„œ View๋กœ ๊ฐ€๋Š” ํ๋ฆ„์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค. ์—ญ์€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š

kenel.tistory.com

ViewModel์˜ LiveData๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด View์— ๊ฐฑ์‹ ํ•  ๋•Œ ๊ทธ ๋ณ€ํ™”์˜ ํ๋ฆ„์€ ViewModel → View๋‹ค. ์ด์™€ ๋ฐ˜๋Œ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ View์—์„œ LiveData์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด๋ฅผ ViewModel์˜ LiveData์— ๊ฐฑ์‹ ํ• ์ˆ˜๋„ ์žˆ๋‹ค. (View → ViewModel)

 

#5 ์š”์•ฝ

MVVM ํŒจํ„ด์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์„ ์ง๊ด€ํ™”ํ•œ๋‹ค.