{"id":635,"date":"2020-10-26T13:09:04","date_gmt":"2020-10-26T04:09:04","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=635"},"modified":"2025-09-12T17:40:24","modified_gmt":"2025-09-12T08:40:24","slug":"android-mvvm-android-architecture-components","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2020\/10\/26\/635\/","title":{"rendered":"Android: MVVM &#038; Android Architecture Components"},"content":{"rendered":"\n<p>viewmodel\uc774\ub098 livedata\ub97c \ub9d0\ud558\uae30\uc804\uc5d0 \uc774\uac8c \uc5b4\ub514\uc11c \ud280\uc5b4\ub098\uc628\uac74\uc9c0 \uc54c\uae30\uc704\ud574 app architecture\uc5d0 \ub300\ud574 \uc54c\uc544\uc57c\ud55c\ub2e4. \ub354\ubd88\uc5b4 Android\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 Architecture Components\ub3c4 \uac04\ub2e8\ud558\uac8c \uc54c\uc544\ubcf4\uc790. \uc774 \ubd80\ubd84\uc5d0 \uc788\uc5b4 <a href=\"https:\/\/academy.realm.io\/kr\/posts\/eric-maxwell-mvc-mvp-and-mvvm-on-android\/\">\uc798 \uc124\uba85\ub41c \ubb38\uc11c<\/a>\uac00 \uc788\uc73c\ub2c8 \uc774\uac83\uc744 \ucc38\uc870\ud574\ub3c4 \uc88b\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MVC \ud328\ud134<\/h2>\n\n\n\n<p> \ub300\ubd80\ubd84 \ud504\ub85c\uadf8\ub7a8\uc774 \uac1c\ubc1c\uacfc\uc815\uacfc \uc720\uc9c0\ubcf4\uc218\ub97c \uc6a9\uc774\ud558\uac8c \ud558\uae30\uc704\ud574 \uad6c\uc870\uc801 \ub514\uc790\uc778\ud328\ud134\ub4e4\uc744 \uc774\uc6a9\ud55c\ub2e4. \uc5ec\uae30\uc11c \uac00\uc7a5 \uae30\ubcf8\uac1c\ub150\uc740 UI, DATA \uadf8\ub9ac\uace0 \ube44\uc9c0\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\ub294 \uac83\uc774\ub2e4. <br> \uc624\ub7ab\ub3d9\uc548 \uc0ac\ub791\ubc1b\uc544\uc628 \ub514\uc790\uc778 \ud328\ud134\uc73c\ub85c MVC(model-view-controller)\uac00 \uc788\ub2e4. model\uc740 data\ub97c \ub2e4\ub8e8\ub294 \ubd80\ubd84\uc73c\ub85c DB, filesystem, network\ub4f1\uc744 \ud1b5\ud574 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uace0 \uac00\uc838\uc624\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. android\uc5d0\uc11c\ub294 jetpack \uc774\uc804\uc5d0 \ud2b9\ubcc4\ud788 \uc9c0\uc6d0\ud558\uc9c4 \uc54a\uc558\uc5c8\uc9c0\ub9cc, sqlite db\uc0ac\uc6a9\uc774 \uac00\ub2a5\ud588\uace0, content provider\ub85c \uc911\uc559\uc9d1\uc911\uc2dd \ub370\uc774\ud130 \uad00\ub9ac\ub97c \uc9c0\uc6d0\ud574\uc11c \uc774\ub4e4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 \ub610\ub294 \ub124\ud2b8\uc6cd\uc73c\ub85c \ub9ac\ubaa8\ud2b8 \ub370\uc774\ud130 \uc804\uc1a1\ud30c\ud2b8\ub97c \ub9cc\ub4dc\ub294 \uc791\uc5c5\uc774 \uc774\uc5d0 \ud574\ub2f9\ud574\uc654\ub2e4. <br> view\ub294 UI\ub97c \ub9d0\ud558\uba70, data\uc640 \ub3c5\ub9bd\uc801\uc73c\ub85c \ud654\uba74\uad6c\uc131\uc744 \uc9c0\uc6d0\ud55c\ub2e4. android\uc5d0\uc120 UI xml\ub4e4\uc774 \uc774\uc5d0 \ud574\ub2f9\ud55c\ub2e4. <br> controller\ub294 \ube44\uc9c0\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0 \ud574\ub2f9\ud558\uba70, View\ub85c\ubd80\ud130 \uc0ac\uc6a9\uc790\uc758 \uc785\ub825\uc744 \ubc1b\uc544 Model\uc774 \uac00\uc9c4 \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\uac70\ub098, \ub9ac\ubaa8\ud2b8 \ub124\ud2b8\uc6cc\ud06c\ub85c\ubd80\ud130\uc758 \uc751\ub2f5\uc744 \ucc98\ub9ac\ud558\ub294\ub4f1\uc758 \uc5ed\ud560\uc744 \ud55c\ub2e4. android \uc5d0\uc11c jetpack \uc9c0\uc6d0 architecture\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 activity class, fragment class \ub4f1 layout xml\uc5d0 \ub300\uc751\ud558\ub294 \ud074\ub798\uc2a4\ub4e4\uc774 \uc774\uc5d0 \ud574\ub2f9\ud55c\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"200\" height=\"220\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/10\/200px-MVC-Process.svg_.png\" alt=\"\" class=\"wp-image-719\"\/><\/figure>\n<\/div>\n\n\n<p>\uc544\ub9c8\ub3c4 \uc5b4\ub5a4\uc0ac\ub78c\ub4e4\uc740 MVC\uc5d0 \ub300\uc751\ud558\ub294 android \ud30c\ud2b8\uc5d0 \ub3d9\uc758\ud558\uc9c0 \uc54a\uc744\uac83\uc774\ub2e4. \uc65c\ub0d0\ud558\uba74 \uc815\ud655\ud788 1:1\ub85c \ub9e4\uce6d\uc774 \ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc774\ub2e4. activity\ub098 fragment class\ub4e4\uc774 UI\uc640 \uac15\ud558\uac8c \uacb0\ud569\ub418\uc5b4 \uc788\uc5b4\uc11c UI\ub85c \ubd84\ub958\ud560\uc218\ub3c4 \uc788\ub2e4. \uc774 \ubd80\ubd84\uc740 \uac1c\ubc1c\uc790\uac00 \uc5b4\ub5bb\uac8c \ub2e4\ub8f0\uc9c0\uc5d0 \ub530\ub77c \uacb0\uc815\ub418\ub294 \ubd80\ubd84\uc774\ub2e4. <br> MVC \ud328\ud134\uc758 \ubb38\uc81c\uc810\uc774\ub77c\uba74, controller\uc5d0 \uc810\uc810 \ub354 \ub9ce\uc740 \ucf54\ub4dc\ub4e4\uc774 \uc9d1\uc911\ub41c\ub2e4\ub294 \uc0ac\uc2e4\uacfc UI\uc640 \ub4a4\uc11e\uc77c \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\ub294 \uc810\uc778\ub370, android\uc758 activity\ub098 fragment\uc758 \uacbd\uc6b0 UI\uc640 \uac15\ud55c \uacb0\ud569\uc744 \uac16\uace0\uc788\uae30\uc5d0 \uc774\ub97c \ub354 \ubcf5\uc7a1\ud558\uac8c \ub9cc\ub4e0\ub2e4. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MVP \ud328\ud134<\/h2>\n\n\n\n<p> \uc774\ub7ec\ud55c \uc548\ub4dc\ub85c\uc774\ub4dc\uc758 \ubb38\uc81c\ub97c \uac1c\uc120\ud558\ub824\uba74 MVP(Model-View-Presenter)\ub97c \uc0ac\uc6a9\ud558\uae30\ub3c4 \ud55c\ub2e4. \uc774 \uacbd\uc6b0, activity\ub098 fragment \ud074\ub798\uc2a4\ub4e4\uc740 \uc790\uc5f0\uc2a4\ub7fd\uac8c View\uc5d0 \uc18d\ud558\uac8c\ub418\uba70, \ub2e8\uc21c \uc778\ud130\ud398\uc774\uc2a4\ud615\ud0dc\ub85c presenter\ub97c \ubcc4\ub3c4\ub85c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. Model\ub85c\ubd80\ud130 \ub370\uc774\ud130 \ubcc0\uacbd\uc740 MVC\uc5d0\uc11c\ucc98\ub7fc \uc9c1\uc811 View\ub85c \uc804\ub2ec\ub418\uc9c0 \uc54a\uace0, Presenter\ub97c \ud1b5\ud574 \uc804\ub2ec\ub41c\ub2e4. Presenter\ub294 View\uc758 \ubaa8\uc2b5\uc5d0 \uad00\uc5ec\ud558\uc9c0 \uc54a\uace0, \ubcf4\uc5ec\uc904 data\ub9cc \uc804\ub2ec\ud558\uac8c\ub418\uc5b4, View\uc640 \ub3c5\ub9bd\ub41c controller\ub85c\uc11c\uc758 \uc5ed\ud560\uc5d0 \ucda9\uc2e4\ud55c \ubaa8\ub378\uc774\ub77c\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MVVM \ud328\ud134<\/h2>\n\n\n\n<p> MVC \ubaa8\ub378\uc774 \uc624\ub79c\uae30\uac04 \uc0ac\ub791\ubc1b\uc73c\uba70 \uc0ac\uc6a9\ub418\uc5b4 \uc654\uc73c\ub098, \uc774\ub97c \uac1c\uc120\ud558\ub824\ub294 \ub178\ub825\ub4e4\ub3c4 \uc788\uc5b4\uc654\ub2e4. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Model%E2%80%93view%E2%80%93controller#History\">\uc601\ubb38 \uc704\ud0a4 \ud788\uc2a4\ud1a0\ub9ac\ud56d\ubaa9 \ucc38\uc870<\/a>. MVA(Model-View-Adapter), MVP(Model-View-Presenter), MVVM(Model-View-ViewModel) \ub4f1. \uac01\uac01 \uad6c\ud604\ud658\uacbd\uc5d0 \ub530\ub77c \uc9c4\ud654\ud574 \ub098\uac14\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc120 \uad6c\uc870\uc801 \ubb38\uc81c\ud574\uacb0\uc744 \uc704\ud574 MVP\ubaa8\ub378\uc758 \uc9c4\ud654\ud615\ud0dc\uc778 MVVM \ud328\ud134\uc744 \uc120\ud0dd\ud55c \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. <\/p>\n\n\n\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Model%E2%80%93view%E2%80%93viewmodel\">\uc6b0\uc120 \uc704\ud0a4\ubb38\uc11c\ub97c \ucc38\uc870<\/a>\ud574\ubcf4\uc790.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"150\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/10\/500px-MVVMPattern.png\" alt=\"\" class=\"wp-image-720\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/500px-MVVMPattern.png 500w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/500px-MVVMPattern-300x90.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n\n\n\n<p> MVC\uc758 \uac1c\uc120\ubaa8\ub378\uc778 MVP\uac00 \ub354 \uc9c4\ubcf4\ud55c \uac83\uc73c\ub85c MVP\uc640\uc758 \ube44\uad50\uac00 \ub354 \uc26c\uc6b8 \uac83\uc774\ub2e4. Model\uacfc View\ub294 MVP\uc5d0\uc11c\uc640 \uac70\uc758 \ub3d9\uc77c\ud558\ub2e4.  Presenter \ubd80\ubd84\uc5d0 ViewModel\uc774 \ub4e4\uc5b4\uac00\uace0, View\uc640\ub294 \uc778\ud130\ud398\uc774\uc2a4 \ub300\uc2e0\uc5d0, DataBinding\uc73c\ub85c \uc5f0\uacb0\ub41c\ub2e4. DataBinding\uc774\ub780\uac74, View\uc5d0\uc11c \ud45c\uc2dc\ud560 \ub370\uc774\ud130\uac00 ViewModel\uc5d0 Binder\ub85c \uc9c1\uc811 \uc5f0\uacb0\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. \ub370\uc774\ud130\ub97c \ud45c\uc2dc\ud560 \ub54c, ViewModel\uc758 \ub370\uc774\ud130\ub97c \uc77d\uc5b4\uc640\uc11c \ud45c\uc2dc\ud558\uba70, Data\ubcc0\uacbd\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, ViewModel\uc5d0\uc11c\uc758 \uac12 \ubcc0\uacbd\uc744 View\uc5d0\uc11c Observer \ud328\ud134\uc73c\ub85c \ubaa8\ub2c8\ud130\ub9c1 \ud558\ub2e4\uac00 \ubcc0\uacbd\ub41c \uac12\uc744 \uc801\uc6a9\ud558\uac8c \ub41c\ub2e4.  <\/p>\n\n\n\n<p>Android\uc5d0\uc11c\ub294 Jetpack \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ud1b5\ud574 MVVM\uc744 \uc9c0\uc6d0\ud55c\ub2e4. DataBinding\uc774 \uc6a9\uc774\ud558\ub3c4\ub85d XML \uae30\ub2a5\uc744 \ud655\uc7a5\ud588\uace0, ViewModel \ud074\ub798\uc2a4\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \ub610\ud55c, LiveData\ub97c \ud1b5\ud574 Data Binding\uc758 Observer \ud328\ud134\uc744 \uc9c0\uc6d0\ud55c\ub2e4. LiveData\ub294 \uac04\ub2e8\ud788 \uc5b8\uae09\ud558\uc790\uba74, Observable data wrapper\uc815\ub3c4\ub2e4. Model \ubd80\ubd84 \uc9c0\uc6d0\uc744 \uc704\ud574\uc11c\ub294 Database\ub97c \ubcf4\ub2e4 \uc27d\uac8c \uc0ac\uc6a9\ud558\ub3c4\ub85d Room \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc81c\uacf5\ud55c\ub2e4. <\/p>\n\n\n\n<p>Android\uc5d0\uc11c MVVM \ud328\ud134\uc744 \uc801\uc6a9\ud558\uba74, activity \ub098 fragment \ud074\ub798\uc2a4\ub294 \uba85\ud655\ud558\uac8c View\uc5d0 \ud3ec\ud568\uc2dc\ucf1c \uae30\uc874\uc758 \uc560\ub9e4\ubaa8\ud638\ud568\uc774 \uc0ac\ub77c\uc9c0\uba70, ViewModel\uc740 View\uc5d0 \ub300\ud55c \uc758\uc874\uc131\uc774 \uac70\uc758 \uc5c6\uc73c\ubbc0\ub85c \ub354 \uc88b\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. <br> \uc774\uc804\uc5d0 \uac00\uc7a5 \ud070 \ubb38\uc81c\uc911 \ud558\ub098\ub85c \ud654\uba74 rotation\uc774\uc288\uac00 \uc788\ub2e4. rotation\uc2dc View\uac00 Destroy\ub418\uace0 \ub2e4\uc2dc Create\ub418\uac8c\ub418\uba70 View\ub97c \ub530\ub77c Activity, Fragment \ud074\ub798\uc2a4\ub4e4\ub3c4 \uac19\uc774 Destroy\ub418\uba70 \uc774\uc804 \ub370\uc774\ud130\ub97c \uc720\uc9c0\ud558\uc9c0 \ubabb\ud558\ub294 \ubb38\uc81c\uac00 \uc788\ub2e4. onSaveInstanceState()\uc640 \uac19\uc740 \ud568\uc218\ub85c \ub370\uc774\ud130\ub97c \uc800\uc7a5, \ubcf5\uc6d0\ud558\ub3c4\ub85d \uad6c\ud604\ub418\uc5b4 \uc788\uc9c0\ub9cc, Activity, Fragment \ud074\ub798\uc2a4\ub4e4\uc774 View\uc5d0 \uc885\uc18d\ub418\ub294 \uac00\uc7a5 \ud070 \uc774\uc720\uc911 \ud558\ub098\uc600\ub2e4. MVVM \ud328\ud134\uc5d0\uc120 \ub370\uc774\ud130\ub4e4\uc774 ViewModel\uc5d0 \uc874\uc7ac\ud558\uace0, ViewModel\uc740 rotation\uc5d0 \ubb34\uad00\ud558\uac8c \uc720\uc9c0\ub418\uba70 \uc644\uc804\ud788 finished \ub410\uc744 \ub54c\ub9cc onCleared()\uac00 \ubd88\ub9ac\uba70 \uc885\ub8cc\ub418\uae30 \ub54c\ubb38\uc5d0 \ubb38\uc81c\uac00 \uae54\ub054\ud558\uac8c \ud574\uacb0\ub41c\ub2e4. \uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub098\uc640\uc788\ub294 \ub77c\uc774\ud504\uc0ac\uc774\ud074\uc744 \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"522\" height=\"543\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/10\/viewmodel-lifecycle.png\" alt=\"\" class=\"wp-image-721\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/viewmodel-lifecycle.png 522w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/viewmodel-lifecycle-288x300.png 288w\" sizes=\"auto, (max-width: 522px) 100vw, 522px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">AAC(Android Architecture Component)<\/h2>\n\n\n\n<p> \uadf8\ub7fc, MVVM\uc744 Android\uac00 \uc5b4\ub5bb\uac8c \uc9c0\uc6d0\ud558\uace0 \uc788\ub294\uc9c0 \uc54c\uc544\ubcf4\uc790. Android\uc5d0\uc11c\ub294 <a href=\"https:\/\/developer.android.com\/jetpack\/getting-started\">Jetpack \ub77c\uc774\ube0c\ub7ec\ub9ac<\/a>\ub85c \uc571 \uac1c\ubc1c\uc744 \uc880 \ub354 \uc27d\uac8c \ud560\uc218\uc788\ub3c4\ub85d \uc9c0\uc6d0\ud558\uace0 \uc788\ub2e4. \uadf8 \uc77c\ubd80\ub85c <a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/adding-components\">Architecture component\ub4e4<\/a>\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \uc774 \ucef4\ud3ec\ub10c\ud2b8\ub4e4\uc911\uc5d0 MVVM\ubaa8\ub378\uc744 \uc9c0\uc6d0\ud558\uace0 \uc788\ub2e4. \uc138\ubd80\uc801\uc73c\ub85c\ub294 <a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/livedata\">LiveData<\/a>\uc640 <a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/viewmodel\">ViewModel<\/a>\uc744 \ud3ec\ud568\ud55c <a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/lifecycle\">Lifecycle component<\/a>, SQLite \ub798\ud37c\uc778 <a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/room\">Room <\/a>\uc815\ub3c4\uac00 \uc774\uc5d0 \ud574\ub2f9\ub41c\ub2e4. <\/p>\n\n\n\n<p> \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \uc81c\uacf5\ud558\ubbc0\ub85c, gradle \ud30c\uc77c\uc5d0 repository\uc640 library\uac00 \ucd94\uac00\ub418\uc5b4\uc57c \ud55c\ub2e4. repository\ub294 google\uc744 \uc774\uc6a9\ud558\ubbc0\ub85c \ub531\ud788 \ucd94\uac00\uac00 \ud544\uc694\ud558\uc9c0\ub294 \uc54a\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>allprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">allprojects<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">repositories<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">google<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">jcenter<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uac01 \ucef4\ud3ec\ub10c\ud2b8\uc758 \ucd94\uac00\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \ubb38\uc11c\ub97c \ucc38\uace0\ud574\uc11c \ucd94\uac00\ud55c\ub2e4. <a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/lifecycle\">lifecycle \ubb38\uc11c<\/a>\ub97c \uc608\ub85c\ub4e4\uba74, viewmodel\uacfc livedata\ub9cc \ud3ec\ud568\uc2dc\ud0a4\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uc744 \ucd94\uac00\ud558\ub294 \uac83\uc73c\ub85c \ucda9\ubd84\ud558\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>dependencies {\n    def lifecycle_version = \"2.2.0\"\n    \/\/ ViewModel\n    implementation \"androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version\"\n    \/\/ LiveData\n    implementation \"androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version\"\n...<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">dependencies<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    def lifecycle_version <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;2.2.0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ ViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    implementation <\/span><span style=\"color: #96D0FF\">&quot;androidx.lifecycle:lifecycle-viewmodel-ktx:<\/span><span style=\"color: #6CB6FF\">$lifecycle_version<\/span><span style=\"color: #96D0FF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ LiveData<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    implementation <\/span><span style=\"color: #96D0FF\">&quot;androidx.lifecycle:lifecycle-livedata-ktx:<\/span><span style=\"color: #6CB6FF\">$lifecycle_version<\/span><span style=\"color: #96D0FF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">App Architecture<\/h2>\n\n\n\n<p> \uacf5\uc2dd\ubb38\uc11c\uc758 <a href=\"https:\/\/developer.android.com\/jetpack\/guide\">Guide to app architecture<\/a>\uc5d0 \uc774 \ubaa8\ub4e0\uac8c \uc0c1\uc138\ud788 \uae30\uc220\ub418\uace0 \uc788\ub2e4. \uc5ec\uae30\uc5d0\uc11c  \uad8c\uc7a5\ud558\ub294 \uc571\uc758 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"720\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/10\/final-architecture.png\" alt=\"\" class=\"wp-image-738\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/final-architecture.png 960w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/final-architecture-300x225.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/final-architecture-768x576.png 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/figure>\n\n\n\n<p>\uc704 \uadf8\ub9bc\uc740 MVVM \ubaa8\ub378\uc744 \ud45c\ud604\ud558\uace0 \uc788\ub2e4. Activity\/Fragment\uac00 View\uc774\uace0 LiveData\ub97c \uc774\uc6a9\ud558\uc5ec ViewModel\uacfc Data binding\uc73c\ub85c \uc5f0\uacb0\ub418\uc5b4 \uc788\uc73c\uba70, Room \ubc0f \ub9ac\ubaa8\ud2b8 \ub370\uc774\ud130 \uc5d1\uc138\uc2a4 \ubc29\ubc95\uc73c\ub85c Model\uc744 \ud45c\ud604\ud558\uace0 \uc788\ub2e4. \uc0c1\uc138\ud55c \ub0b4\uc6a9\uc744 \uc54c\uace0 \uc2f6\ub2e4\uba74, <a href=\"https:\/\/developer.android.com\/jetpack\/guide\">\uacf5\uc2dd\ubb38\uc11c\uc758 \uac00\uc774\ub4dc<\/a>\ub97c \ucc38\uace0\ubc14\ub780\ub2e4. <\/p>\n\n\n\n<p>\uae30\ubcf8\uc801\uc778 \ubc30\uacbd\uc740 \ub300\ucda9 \uc54c\uac8c\ub41c\uac70 \uac19\uc73c\ub2c8, \ucd94\uac00 \ud3ec\uc2a4\ud305\uc73c\ub85c ViewModel \uacfc LiveData\uc5d0 \ub300\ud55c \uc815\ub9ac\ub97c \ud574\ubcf4\uc790.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>viewmodel\uc774\ub098 livedata\ub97c \ub9d0\ud558\uae30\uc804\uc5d0 \uc774\uac8c \uc5b4\ub514\uc11c \ud280\uc5b4\ub098\uc628\uac74\uc9c0 \uc54c\uae30\uc704\ud574 app architecture\uc5d0 \ub300\ud574 \uc54c\uc544\uc57c\ud55c\ub2e4. \ub354\ubd88\uc5b4 Android\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 Architecture Components\ub3c4 \uac04\ub2e8\ud558\uac8c \uc54c\uc544\ubcf4\uc790. \uc774 \ubd80\ubd84\uc5d0 \uc788\uc5b4 \uc798 \uc124\uba85\ub41c \ubb38\uc11c\uac00 \uc788\uc73c\ub2c8 \uc774\uac83\uc744 \ucc38\uc870\ud574\ub3c4 \uc88b\ub2e4. MVC \ud328\ud134 \ub300\ubd80\ubd84 \ud504\ub85c\uadf8\ub7a8\uc774 \uac1c\ubc1c\uacfc\uc815\uacfc \uc720\uc9c0\ubcf4\uc218\ub97c \uc6a9\uc774\ud558\uac8c \ud558\uae30\uc704\ud574 \uad6c\uc870\uc801 \ub514\uc790\uc778\ud328\ud134\ub4e4\uc744 \uc774\uc6a9\ud55c\ub2e4. \uc5ec\uae30\uc11c \uac00\uc7a5 \uae30\ubcf8\uac1c\ub150\uc740 UI, DATA \uadf8\ub9ac\uace0 \ube44\uc9c0\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\ub294 \uac83\uc774\ub2e4. \uc624\ub7ab\ub3d9\uc548 \uc0ac\ub791\ubc1b\uc544\uc628 \ub514\uc790\uc778 \ud328\ud134\uc73c\ub85c MVC(model-view-controller)\uac00 \uc788\ub2e4. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,34],"tags":[186,192,193,194,191,20],"class_list":["post-635","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-android-2","tag-app-architecture","tag-architecture","tag-jetpack","tag-mvvm","tag-android"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=635"}],"version-history":[{"count":30,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/635\/revisions"}],"predecessor-version":[{"id":3510,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/635\/revisions\/3510"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=635"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}