{"id":365,"date":"2018-06-20T14:28:03","date_gmt":"2018-06-20T05:28:03","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=365"},"modified":"2018-06-20T14:28:03","modified_gmt":"2018-06-20T05:28:03","slug":"android-architecture-component-viewmodel","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=365","title":{"rendered":"Android Architecture Component &#8211; ViewModel"},"content":{"rendered":"<h2>ViewModel \uac1c\uc694<\/h2>\n<p>ViewModel\uc740 UI\uc640 \uad00\ub828\ub41c data\ub97c \uc0dd\uba85\uc8fc\uae30\ub97c \uc2e0\uacbd\uc4f0\uba74\uc11c \uc800\uc7a5\ud558\uac70\ub098 \uad00\ub9ac\ud558\uae30\uc704\ud574\uc11c \uc124\uacc4\ub41c \ud074\ub798\uc2a4\uc774\ub2e4.<br \/>\nViewModel\uc740 screen rotation \uacfc \uac19\uc740 configuration\ubcc0\ud654\uc5d0\uc11c\ub3c4 \uc0b4\uc544\ub0a8\ub294\ub2e4.<br \/>\n\uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uc561\ud2f0\ube44\ud2f0\ub098 \ud504\ub808\uadf8\uba3c\ud2b8\uac19\uc740 UI\ucee8\ud2b8\ub864\ub7ec\uc758 \uc0dd\uba85\uc8fc\uae30\ub97c \uad00\ub9ac\ud55c\ub2e4.<br \/>\n\uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uc0ac\uc6a9\uc790\uc758 \ud589\ub3d9\uc774\ub098 \ub610\ub294 \uac1c\ubc1c\uc790\uac00 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \uc5b4\ub5a4 \uc774\ubca4\ud2b8(\uba54\ubaa8\ub9ac\ubd80\uc871 \ub4f1)\ub85c \uc778\ud574,\u00a0\uc544\ub9c8 UI\ucee8\ud2b8\ub864\ub7ec\ub97c \ud30c\uad34\ud558\uac70\ub098 \uc7ac\uc0dd\uc131\ud558\uac8c \ub41c\ub2e4.<br \/>\n\ub9cc\uc57d \uc2dc\uc2a4\ud15c\uc774 UI\ucee8\ud2b8\ub864\ub7ec\ub97c \ud30c\uad34\ud558\uac70\ub098 \uc7ac\uc0dd\uc131\ud55c\ub2e4\uba74 UI\uc640 \uad00\ub828\ub41c \uc77c\uc2dc\uc801\uc778 data\ub4e4\uc740 \uc544\ub9c8 \uc0ac\ub77c\uc9c0\uace0 \ub9d0\uac83\uc774\ub2e4. \uc608\ub97c \ub4e4\uba74, UI\ucee8\ud2b8\ub864\ub7ec\uc5d0\uc11c User\ub77c\ub294 \ud074\ub798\uc2a4\uc758 List\ub97c \uad00\ub9ac \ud558\uace0 \uc788\ub294\ub370 \uac00\ub85c\uc138\ub85c \ud654\uba74\uc804\ud658\uc73c\ub85c \uc778\ud574 \uc561\ud2f0\ube44\ud2f0\uac00 \uc7ac\uc131\uc131\ub41c\ub2e4\uba74 \uc0c8\ub85c \uc0dd\uc131\ub41c UI\ucee8\ud2b8\ub864\ub7ec\ub294 \uc774 \ub370\uc774\ud130\ub97c \ub2e4\uc2dc \uc0c8\ub85c \uac00\uc9c0\uace0 \uc640\uc57c \ud55c\ub2e4. \uc608\ub97c\ub4e4\uba74 \ubcf4\ud1b5 onSaveInstanceState() \uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 \ubc88\ub4e4\ub85c\ubd80\ud130 \ub370\uc774\ud130\ub97c \ubcf5\uad6c \ud558\uac8c \ub41c\ub2e4. \ud558\uc9c0\ub9cc \uc774\ub7f0 \uc811\uadfc \ubc29\uc2dd\uc740 \uc544\uc8fc \uc791\uc740 data\uc5d0\ub098 \uc801\ud569\ud558\uc9c0 bitmap\uc774\ub098 \uc0ac\uc6a9\uc790 \ubaa9\ub85d \uac19\uc740 \uc591\uc774 \ub9ce\uc740 data\uc5d0\ub294 \uc7a0\uc7ac\uc801\uc73c\ub85c \uc54c\ub9de\uc9c0 \uc54a\ub2e4.<br \/>\n\ub610 \ub2e4\ub978\ubb38\uc81c\uac00 \uc788\ub2e4. UI\ucee8\ud2b8\ub864\ub7ec\ub294 \uc885\uc885 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uace0 \ubc18\ud658\uac12\uc744 \ubc1b\uace4 \ud558\ub294\ub370, \ucf5c\ubc31\uc744 \ubc1b\uc73c\ub824\uace0 \ud560\ub54c UI\ucee8\ud2b8\ub864\ub7ec\uac00 \ubc15\uc0b4\ub0ac\ub2e4\uba74? \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud558\uac70\ub098 \uba54\ubaa8\ub9ac \ub204\uc218\uac00 \ub098\uae30 \uc27d\ub2e4. \uc774\ub7f0\uac70\uae4c\uc9c0 \uac1c\ubc1c\uc790\uac00 \ub2e4 \uad00\ub9ac\ud560\ub824\uba74<br \/>\n\uc5d0\ud734.. \ud55c\uc228\ubc16\uc5d0 \uc548\ub098\uc628\ub2e4. \u00a0\uadf8\ub9ac\uace0 UI\ucee8\ud2b8\ub864\ub7ec\uac00 \uc7ac\uc0dd\uc131\ub420\ub54c\ub9c8\ub2e4 \ub370\uc774\ud130\ub97c \ub2e4\uc2dc \uc5bb\uc73c\ub824\uace0 \ud558\ub294\uac83\ub3c4 \ub9ac\uc18c\uc2a4 \ub0ad\ube44\uc774\ub2e4.<br \/>\nUI\ucee8\ud2b8\ub864\ub7ec\ub294 \uc8fc\ub85c UI data\ub97c \ubcf4\uc5ec\uc8fc\uace0, \uc0ac\uc6a9\uc790\uc758 \ud589\ub3d9\uc5d0 \ubc18\uc751\ud558\uace0, \ub610\ub294 Runtime\uad8c\ud55c\uc694\uad6c\uc640 \uac19\uc740 \uc6b4\uc601\uccb4\uc81c\uc640 \uc18c\ud1b5\ud558\ub294\uac83\uc744 \ub2e4\ub8e8\ub294 \uacbd\ud5a5\uc774 \uc788\ub2e4.<br \/>\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub098 \ub124\ud2b8\uc6cc\ud06c\ub85c\ubd80\ud130 data\ub97c \uc694\uccad\ud558\uace0 \ubc18\uc751\ud558\ub294\uac83 \uae4c\uc9c0 UI\ucee8\ud2b8\ub864\ub7ec\uc5d0\uc11c \ub2e4 \ud558\ub2e4\ubcf4\uba74 \ub9c8\uce68\ub0b4 \uac70\ub300\ud574\uc9c4 \uc561\ud2f0\ube44\ud2f0\ub098 \ud504\ub808\uadf8\uba3c\ud2b8\ub97c \ubcfc \uc218 \uc788\ub2e4. \ubb38\uc81c\ub294 \uc774\ub7ec\ud55c UI\ucee8\ud2b8\ub864\ub7ec\uc758 \ube44\ub300\uc131\uc774 \uacc4\uc18d \ub420 \uac83\uc774\ub77c\ub294\uac70\ub2e4&#8230;(\uacf5\ud3ec)<\/p>\n<p style=\"text-align: left;\">UI\ucee8\ud2b8\ub864\ub7ec\uc5d0\uac8c \uc9c0\ub098\uce58\uac8c \ub9ce\uc740 \ucc45\uc784\uac10\uc744 \ubd80\uc5ec\ud558\ub294\uac83\uc758 \uacb0\uacfc\ub294 \uc571\uc758 \ubaa8\ub4e0 \ub3d9\uc791\uc744 \ud558\ub098\uc758 \ud074\ub798\uc2a4\uc5d0\uac8c \ub9e1\uae30\uac8c \ub418\uac8c \ub418\ub294\uc148\uc774\ub2e4. \uadf8\ub7f0\uacb0\uacfc\ub85c \ub2e8\uc704 \ud14c\uc2a4\ud2b8\uac00 \uac70\uc758 \ubd88\uac00\ub2a5\ud558\uac8c \ub41c\ub2e4.<\/p>\n<h2>ViewModel \uad6c\ud604\ud558\uae30<\/h2>\n<p>Architecture Components\ub294 ViewModel\uc744 \uc81c\uacf5\ud558\uace0 \uc788\ub2e4. ViewModel\uc740 UI\ucee8\ud2b8\ub864\ub7ec\uc640 \uc0c1\ud638\uc791\uc6a9\ud558\uba70 UI\uc5d0 \ud544\uc694\ud55c data\ub97c \uc900\ube44\ud558\ub294\ub370 \uc4f0\uc778\ub2e4.<br \/>\nViewModel\uac1d\uccb4\ub294 configuration changes(\ud658\uacbd\ubcc0\ud654) \uc5d0\uc11c\ub3c4\u00a0\uc790\ub3d9\uc73c\ub85c \uc720\uc9c0\uac00 \ub41c\ub2e4. \uadf8\ub798\uc11c ViewModel\uc774 \ub4e4\uace0 \uc788\ub358 data\ub4e4\ub3c4 \uc7ac\uc0dd\uc131\ub41c UI\ucee8\ud2b8\ub864\ub7ec\uc5d0\uc11c \ubc14\ub85c \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4.<br \/>\n\uc608\ub97c\ub4e4\uba74, \ub9cc\uc57d \uc0ac\uc6a9\uc790\ubaa9\ub85d\uc744 \uac1c\ubc1c\uc790\uac00 \ubcf4\uc5ec\uc8fc\uace0 \uc2f6\ub2e4\uba74 \uc0ac\uc6a9\uc790 \ubaa9\ub85d\uc744 \uc5bb\ub294 \ud589\uc704\ub294 ViewModel\uc5d0\uac8c \uc704\uc784\ud558\uace0 UI\ucee8\ud2b8\ub864\ub7ec\ub294 ViewModel\ub85c\ubd80\ud130 \ub370\uc774\ud130\ub97c \ubc1b\uc544 \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4.<br \/>\n\ub2e4\uc74c \uc0d8\ud50c \ucf54\ub4dc\ub97c \ud655\uc778\ud558\uc790<\/p>\n<table class=\"wysiwyg-macro\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\" data-macro-name=\"code\" data-macro-id=\"dadb6157-181f-462f-8055-fb505162ce09\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">public class MyViewModel extends ViewModel {\n    private MutableLiveData&lt;List&lt;User&gt;&gt; users;\n    public LiveData&lt;List&lt;User&gt;&gt; getUsers() {\n        if (users == null) {\n            users = new MutableLiveData&lt;List&lt;User&gt;&gt;();\n            loadUsers();\n        }\n        return users;\n    }\n    private void loadUsers() {\n        \/\/ \uc774\uacf3\uc5d0\uc11c \uc0ac\uc6a9\uc790\ubaa9\ub85d\uc744 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uac16\uace0 \uc624\uba74\ub41c\ub2e4.\n    }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uadf8\ub7fc \uc561\ud2f0\ube44\ud2f0\ub098 \ud504\ub808\uadf8\uba3c\ud2b8\uc5d0\uc11c\ub294 ViewModel\uc758 data\uc5d0 \uc5b4\ub5bb\uac8c \uc811\uadfc\ud560\uae4c?<\/p>\n<table class=\"wysiwyg-macro\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\" data-macro-name=\"code\" data-macro-id=\"4aeaaf3c-e8bd-426b-b550-62cb606532b0\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">public class MyActivity extends AppCompatActivity {\n    public void onCreate(Bundle savedInstanceState) {\n        \/\/ \uba3c\uc800 \uc5ec\uae30\uc11c ViewModel\uc744 \uc0dd\uc131\ud55c\ub2e4, \ubcf4\ud1b5 onCreate\uc5d0\uc11c \ud558\uba74\ub41c\ub2e4.\n        \/\/ \uc561\ud2f0\ube44\ud2f0\uac00 \uc7ac\uc0dd\uc131\ub418\ub354\ub77c\ub3c4 \ucc98\uc74c \uc561\ud2f0\ube44\ud2f0\ub97c \uc0dd\uc131\ud588\uc744\ub54c \uc5bb\uc5c8\ub358 ViewModel\uac1d\uccb4\uc640 \uac19\uc740 \uac1d\uccb4\ub85c \uc5bb\uc744 \uc218 \uc788\ub2e4\n        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);\n        model.getUsers().observe(this, users -&gt; {\n            \/\/ \uc5ec\uae30\uc11c UI\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\ub41c\ub2e4.\n        });\n    }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ub9cc\uc57d \uc561\ud2f0\ube44\ud2f0\uac00 \uc7ac\uc0dd\uc131\ub418\uba74 \ud574\ub2f9 \uc561\ud2f0\ube44\ud2f0\uac00 \uac00\uc9c0\uace0 \uc788\ub294 ViewModel\uc740 \uc561\ud2f0\ube44\ud2f0\uac00 finished \ub418\uae30\uc804\uae4c\uc9c0\ub294 \uac19\uc740 \uac1d\uccb4\uc774\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c\ub294 \uc774\ub54c ViewModel\uc758 onCleared()\uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uc5ec \ub9ac\uc18c\uc2a4\ub97c \uc815\ub9ac\ud560 \uc218 \uc788\uac8c \ub3c4\uc640\uc900\ub2e4.<\/p>\n<table class=\"wrapped confluenceTable\">\n<colgroup>\n<col \/><\/colgroup>\n<tbody>\n<tr>\n<th class=\"confluenceTh\"><strong>\uc8fc\uc758\uc0ac\ud56d: ViewModel\uc740 \uc808\ub300\ub85c Activity\ub098 Fragment\uac19\uc740 Lifecycle\uc744 \ucc38\uc870\ud558\uba74 \uc548\ub41c\ub2e4.<\/strong><\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>ViewModel\uac1d\uccb4\ub294 LifecycleOwner\ub098 \ud2b9\uc815 View\ubcf4\ub2e4 \uc624\ub798 \uc0b4\uc544\ub0a8\uc744 \uc218 \uc788\ub3c4\ub85d \uc124\uacc4 \ub418\uc5c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc740 ViewModel\uc5d0 \ub300\ud574\uc11c View\uc640 Lifecycle\uac1d\uccb4\uc5d0 \ub300\ud574 \ubaa8\ub974\ub354\ub77c\ub3c4 \ud14c\uc2a4\ud2b8 \ucf54\ub4dc \uc791\uc131\uc744 \uc27d\uac8c \ud55c\ub2e4.<br \/>\nViewModel\uac1d\uccb4\ub294 LiveData\uac1d\uccb4\uc640 \uac19\uc740 LifecycleObserver\ub97c \u00a0\ud3ec\ud568\ud560 \uc218 \uc788\ub2e4. \ud558\uc9c0\ub9cc ViewModel\uc740 \uc0dd\uba85\uc8fc\uae30\ub97c \uc54c\uace0\uc788\ub294 LiveData\uac19\uc740 Observable\uac1d\uccb4\uc5d0 \ub300\ud574 observe\ub97c \uc808\ub300\ub85c \ud574\uc11c\ub294 \uc548\ub41c\ub2e4.<br \/>\n\ub9cc\uc57d ViewModel\uc774 Application Context\uac00 \ud544\uc694\ud558\ub2e4\uba74, \uc608\ub97c\ub4e4\uba74 system service\ub97c \ucc3e\uae30 \uc704\ud574\uc11c, AndroidViewModel\uc744 \uc0ac\uc6a9\ud558\uba74\ub41c\ub2e4. AndroidViewModel\uc740 \uc0dd\uc131\uc790\uc5d0 Application\uc744 \uc778\uc790\ub85c \ud544\uc694\ub85c \ud55c\ub2e4.<\/p>\n<h2>ViewModel\uc758 \uc0dd\uba85\uc8fc\uae30<\/h2>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/developer.android.com\/images\/topic\/libraries\/architecture\/viewmodel-lifecycle.png\" width=\"522\" height=\"543\" class=\"alignnone size-full\" \/><br \/>\nViewModel\uac1d\uccb4\ub294 ViewModelProvider\ub97c \ud1b5\ud574 \uc5bb\uc744 \uc218 \uc788\uc73c\uba70, \uc774\ub54c Lifecycle\uac1d\uccb4\ub97c \ub118\uaca8\uc8fc\uac8c \ub428\uc73c\ub85c\uc11c \uc0dd\uba85\uc8fc\uae30\ub97c \uc0b4\ud544\uc218 \uc788\uac8c \ub41c\ub2e4.<br \/>\nViewModel\uc740 Lifecycle\uac1d\uccb4\uac00 \uc601\uad6c\uc801\uc73c\ub85c \uc0ac\ub77c\uc9c8\ub54c\uae4c\uc9c0 \uba54\ubaa8\ub9ac\uc5d0\ub0a8\uc544 \uc788\uac8c \ub41c\ub2e4. \u00a0\uc5ec\uae30\uc11c \uc601\uad6c\uc801\uc73c\ub85c \uc0ac\ub77c\uc9c4\ub2e4 \ud568\uc740 \uc561\ud2f0\ube44\ud2f0\uac00 \uc885\ub8cc\ub418\uac70\ub098, fragment\uac00 detached\ub420\ub54c\ub97c \uc758\ubbf8\ud55c\ub2e4.<br \/>\n\uc544\ub798\uc758 \uadf8\ub9bc\uc744 \ubcf4\uba74 \uc561\ud2f0\ube44\ud2f0\uac00 \ud68c\uc804\ud560\ub54c \uc2dc\uc810\uc5d0 \ub530\ub978 \ub2e4\uc591\ud55c \uc0dd\uba85\uc8fc\uae30 \uc0c1\ud0dc\ub97c \ud655\uc778 \ud560 \uc218 \uc788\ub2e4. \uc774 \uadf8\ub9bc\uc740 \ub610\ud55c \uc561\ud2f0\ube44\ud2f0\uc606\uc5d0\uc11c ViewModel\uc758 \uc0dd\uba85\uc8fc\uae30\ub3c4 \uac19\uc774 \ubcf4\uc5ec\uc8fc\uace0 \uc788\ub2e4. \uc774\ub7ec\ud55c \ud2b9\uc815 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc740 \uc561\ud2f0\ube44\ud2f0\uc758 \uc0c1\ud0dc\ub97c \uc124\uba85\ud574\uc8fc\uace0 \uc788\uace0, \ud504\ub808\uadf8\uba3c\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\uc2b7\ud558\uac8c \uc801\uc6a9\ub41c\ub2e4.<br \/>\n&nbsp;<br \/>\n\ubcf4\ud1b5 ViewModel\uc744 \uc694\uccad\ud560\ub54c \uc561\ud2f0\ube44\ud2f0\uc758 onCreate\uba54\uc18c\ub4dc\uc5d0\uc11c \ud558\uac8c \ub418\ub294\ub370 system\uc740 \uc561\ud2f0\ube44\ud2f0\uc758 \uc0dd\uba85\uc8fc\uae30\ub3d9\uc548 onCreate()\ub97c \uc5ec\ub7ec\ubc88 \ud638\ucd9c\ud560\uc218 \uc788\uace0, ViewModel\uc740 \uc561\ud2f0\ube44\ud2f0\uac00 \ud30c\uad34\ub420\ub54c\uae4c\uc9c0 \ub05d\uae4c\uc9c0 \ub0a8\uc544 \uc788\uac8c \ub41c\ub2e4.<\/p>\n<h2>Fragment\uc0ac\uc774\uc5d0\uc11c data \uacf5\uc720\ud558\uae30<\/h2>\n<p>\ub450\uac1c\uc774\uc0c1\uc758 \ud504\ub808\uadf8\uba3c\ud2b8\ub97c \ud558\ub098\uc758 \uc561\ud2f0\ube44\ud2f0\uc5d0\uc11c \ub2e4\ub8e8\uba70 \uc0c1\ud638\uac04\uc758 data\ub97c \uacf5\uc720\ud558\ub294\uac83\uc740 \ub9e4\uc6b0 \uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc774\ub2e4.<br \/>\n\uc77c\ubc18\uc801\uc778 Master-detail fragments\uc758 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\ubcf4\uc790. \ud558\ub098\uc758 \ud504\ub808\uadf8\uba3c\ud2b8\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790\uac00 \uc544\uc774\ud15c\uc744 \uc120\ud0dd\ud560\uc218 \uc788\uace0 \ub2e4\ub978 \ud504\ub808\uadf8\uba3c\ud2b8\uc5d0\uc11c\ub294 \ud574\ub2f9 \uc544\uc774\ud15c\uc758 \ub0b4\uc6a9\uc744 \ubcf4\uc5ec\uc8fc\uac8c \ub41c\ub2e4. \uc774\ub7ec\ud55c \uacbd\uc6b0 \ub450 \ud504\ub808\uadf8\uba3c\ud2b8\uc5d0\uc11c interface\ub97c \uc815\uc758\ud558\uace0 \u00a0\uc774 \ud504\ub808\uadf8\uba3c\ud2b8\ub97c \uac16\uace0 \uc788\ub294 \uc561\ud2f0\ube44\ud2f0\ub294 \uc774 \ub458\uc744 \ubc14\uc778\ub529 \ud574\uc11c \ub370\uc774\ud130\ub97c \uc8fc\uace0 \ubc1b\ub294\u00a0\uadf8\ub7f0 \uc791\uc5c5\ub4e4\uc774 \uc808\ub300 \uac04\ub2e8\ud558\uc9c0\uac00 \uc54a\ub2e4. \uac8c\ub2e4\uac00 \uc591\ucabd \ud504\ub808\uadf8\uba3c\ud2b8 \ubaa8\ub450 \ubc18\ub4dc\uc2dc fragment\uac00 \uc0dd\uc131\ub418\uc9c0 \uc54a\uc558\uac70\ub098 \uc544\uc9c1 \ubcf4\uc774\uc9c0 \uc54a\ub294 \ub2e4\ub294 \uc810\uc744 \uace0\ub824\ud558\uc5ec \ucf54\ub4dc\ub97c \uc791\uc131 \ud574\uc57c \ud55c\ub2e4. \uc27d\uac8c \ub9d0\ud574\u00a0\ub370\uc774\ud130\ub97c \ubcf4\uc5ec\uc8fc\ub294\uac83\uacfc \uad00\ub828\ud574\uc11c \uac1c\ubc1c\uc790\uac00 \uc0dd\uba85\uc8fc\uae30\ub97c \uc2e0\uacbd\uc368\uc57c\ud55c\ub2e4\ub294 \uac83\uc774\ub2e4.<br \/>\n\uc774\ub7f0 \uac1c\ubc1c\uc790\uc758 \uace0\ucda9\uc740 ViewModel\ub85c \ud574\uacb0\ub420 \u00a0\uc218 \uc788\ub2e4. \uc774\ub7ec\ud55c \ud504\ub808\uadf8\uba3c\ud2b8\ub4e4\uc740 Activity\ub0b4\uc5d0\uc11c ViewModel\uc744 \uacf5\uc720\ud568\uc73c\ub85c \uc11c\ub85c \uc0c1\ud638\uc791\uc6a9\ud560 \uc218 \uc788\uac8c \ub41c\ub2e4. \ub2e4\uc74c \uc0d8\ud50c \ucf54\ub4dc\ub97c \ud655\uc778\ud558\uc790<\/p>\n<table class=\"wysiwyg-macro\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\" data-macro-name=\"code\" data-macro-id=\"9f50c46a-86c4-4fce-af5f-70b41d44c3be\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">public class SharedViewModel extends ViewModel {\n    private final MutableLiveData&lt;Item&gt; selected = new MutableLiveData&lt;Item&gt;();\n    public void select(Item item) {\n        selected.setValue(item);\n    }\n    public LiveData&lt;Item&gt; getSelected() {\n        return selected;\n    }\n}\npublic class MasterFragment extends Fragment {\n    private SharedViewModel model;\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);\n        itemSelector.setOnClickListener(item -&gt; {\n            model.select(item);\n        });\n    }\n}\npublic class DetailFragment extends Fragment {\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);\n        model.getSelected().observe(this, item -&gt; {\n\t\t\t\/\/UI \uac31\uc2e0\uc791\uc5c5\n        });\n    }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ubb54\uac00 \uc774\uc81c \uac10\uc774 \uc624\ub294\uac00? \uc591\ucabd \ubaa8\ub450 getActivity() \ud638\ucd9c\uc744 \ud1b5\ud574 \ub3d9\uc77c \ud55c \uc561\ud2f0\ube44\ud2f0 \uac1d\uccb4\ub85c ViewModelProvider\ub85c \ubd80\ud130 ViewModel\uc744 \uc5bb\uc5b4\ub0b4\uace0 \uc788\ub2e4. \uadf8\ub7f0 \uacb0\uacfc\ub85c \uc591\ucabd \ud504\ub808\uadf8\uba3c\ud2b8\ubaa8\ub450 \uac19\uc740 SharedViewModel\uac1d\uccb4\ub97c \uc5bb\uc744\uc218 \uc788\uac8c \ub418\uc5c8\ub2e4.<br \/>\n\uc774\ub7ec\ud55c \uc811\uadfc \ubc29\uc2dd\uc740 \uc544\ub798\uc640 \uac19\uc740 \uc7a5\uc810\uc744 \uac00\uc9c4\ub2e4.<\/p>\n<ul style=\"list-style-type: square;\">\n<li>\uc561\ud2f0\ube44\ud2f0\uac00 \uc774 \ub458\uc744 \uc704\ud574 \ubb58 \ud574\uc918\uc57c \ud558\uac70\ub098 \uc54c\uc544\uc57c\ud560 \uac8c \uc5c6\ub2e4.<\/li>\n<li>\ud504\ub808\uadf8\uba3c\ud2b8\ub294 SharedViewModel \uc774\uc678\uc758 \uac83\ub4e4\uc5d0 \ub300\ud574 \uc54c\ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ub9cc\uc57d \ub2e4\ub978 \ud504\ub808\uadf8\uba3c\ud2b8\uac00 \uc0ac\ub77c\uc9c4\ub2e4 \ud558\ub354\ub77c\ub3c4 \ub610 \ub2e4\ub978 \ud558\ub098\uc758 \ud504\ub798\uadf8\uba3c\ud2b8\ub294 \uacc4\uc18d\ud574\uc11c \ub3d9\uc791\ud560 \uac83\uc785\ub2c8\ub2e4.<\/li>\n<li>\uac01\uac00\uc758 \ud504\ub808\uadf8\uba3c\ud2b8\uc758 \uc790\uc2e0\uc758 \uc0dd\uba85\uc8fc\uae30\ub97c \uac19\uc2b5\ub2c8\ub2e4 \uadf8\ub9ac\uace0 \uc774\uac83\uc740 \ub2e4\ub978 \ud504\ub808\uadf8\uba3c\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub9cc\uc57d \ud558\ub098\uc758 \ud504\ub808\uadf8\uba3c\ud2b8\uac00 \ub2e4\ub978\uac83\uc73c\ub85c \uad50\uccb4\ub41c\ub2e4\ud558\ub354\ub77c\ub3c4 \uc544\ubb34\ubb38\uc81c \uc5c6\uc774 UI\ub294 \uacc4\uc18d\ud574\uc11c \uc791\uc5c5\uc744 \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h2>Loader\ub97c ViewModel\ub85c \uad50\uccb4\ud558\uae30<\/h2>\n<p>CursorLoader\uc640 \uac19\uc740 Loader \ud074\ub798\uc2a4\ub4e4\uc740 DB\uc640 UI\uc758 \uc2f1\ud06c\ub97c \ub9de\ucd94\uae30 \uc704\ud574\uc11c \uc885\uc885 \ub370\uc774\ud130\ub97c \ubcf4\uad00\ud558\ub294\ub370 \uc0ac\uc6a9\ub418\uace4\ud55c\ub2e4. Loader\ub300\uc2e0\uc5d0 ViewModel\uc744 \uc0ac\uc6a9\ud574\ubcf4\uc790. ViewModel\uc744 \uc0ac\uc6a9\ud558\ub294\uac83\uc73c\ub85c UI\ucee8\ud2b8\ub864\ub7ec\uc640 \ub370\uc774\ud130\ub85c\ub529 \uc791\uc5c5\uc744 \ubd84\ub9ac \ud560 \uc218 \uc788\ub2e4. \uadf8\ub7ec\uba74 \ud074\ub798\uc2a4\uac04\uc758 \uac15\ud55c \ucc38\uc870\ub85c\ubd80\ud130 \ud574\ubc29\ub420 \uc218 \uc788\ub2e4.<br \/>\nLoader\ub97c \uc0ac\uc6a9\ud558\ub294 \uc77c\ubc18\uc801\uc778 \uc811\uadfc\ubc29\ubc95\uc5d0\uc11c \uc571\uc740 \uc544\ub9c8\ub3c4 CursorLoader\ub97c \uc0ac\uc6a9\ud558\uace0 database\uc758 \ucf58\ud150\uce20\ub97c \uad00\ucc30\ud560\uac83\uc774\ub2e4. \uac12\uc774 \ubcc0\uacbd\ub420\ub54c Loader\ub294 \uc790\ub3d9\uc73c\ub85c data\ub97c \ub2e4\uc2dc \ubd88\ub7ec\uc624\uace0 UI\ub97c \uac31\uc2e0\ud588\ub2e4.<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"size-full aligncenter\" src=\"https:\/\/developer.android.com\/images\/topic\/libraries\/architecture\/viewmodel-loader.png\" width=\"1024\" height=\"341\" \/><\/p>\n<p style=\"text-align: center;\">Loader\ub97c \ud1b5\ud574\uc11c data\ub97c \ubd88\ub7ec\uc624\ub294 \uacbd\uc6b0<\/p>\n<p style=\"text-align: left;\">ViewModel\uc740 Room\uacfc LiveData\uc640 \uac19\uc774 \ub3d9\uc791\ud558\uba70 Loader\ub97c \ub300\uccb4 \ud560 \uc218 \uc788\ub2e4. ViewModel\uc740 data\uac00 \uae30\uae30\uc758 \ud658\uacbd\ubcc0\ud654\uc5d0\ub3c4 \uc0b4\uc544\ub0a8\uc744 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud574\uc900\ub2e4. Room\uc740 LiveData\uc5d0\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ubcc0\uacbd\ub420\ub54c\ub97c \uc54c\ub824\uc8fc\uba70 LiveData\ub294 \uadf8\ub7f0 \ubcc0\uacbd\uc18d\uc5d0\uc11c \ubcc0\uacbd\ub41c \ub370\uc774\ud130\uc640 \ud568\uaed8 UI\ub97c \uc5c5\ub370\uc774\ud2b8\ub97c \ud558\uac8c \ub41c\ub2e4.<\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/medium.com\/google-developers\/lifecycle-aware-data-loading-with-android-architecture-components-f95484159de4\">\uc774 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud2b8<\/a>\ub97c \ud1b5\ud574 \uc5b4\ub5bb\uac8c ViewModel\uc744 LiveData\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud558\uace0, AsyncTaskLoader\ub97c \ub300\uccb4 \ud560 \uc218 \uc788\ub294\uc9c0 \uc54c \uc218 \uc788\ub2e4.<\/p>\n<p style=\"text-align: left;\">data\uac00 \uc810\uc810 \ub354 \ubcf5\uc7a1\ud574\uc9d0\uc5d0 \ub530\ub77c \uac1c\ubc1c\uc790\ub294 \uc5b4\ub5bb\uac8c \ub370\uc774\ud130\ub97c \ubd88\ub7ec\uc624\ub294 \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud574\uc57c\ud558\ub294\uc9c0\uc5d0 \ub300\ud55c \uace0\ubbfc\uc744 \ud574\uc57c\ud55c\ub2e4. ViewModel\uc758 \ubaa9\uc801\uc740 UI\ucee8\ud2b8\ub864\ub7ec\uc758 \ud658\uacbd\ubcc0\ud654\uc18d\uc5d0\uc11c\ub3c4 data\uac00 \uc0b4\uc544\ub0a8\uc744\uc218 \uc788\ub3c4\ub85d \ucea1\uc290\ud654\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ViewModel \uac1c\uc694 ViewModel\uc740 UI\uc640 \uad00\ub828\ub41c data\ub97c \uc0dd\uba85\uc8fc\uae30\ub97c \uc2e0\uacbd\uc4f0\uba74\uc11c \uc800\uc7a5\ud558\uac70\ub098 \uad00\ub9ac\ud558\uae30\uc704\ud574\uc11c \uc124\uacc4\ub41c \ud074\ub798\uc2a4\uc774\ub2e4. ViewModel\uc740 screen rotation \uacfc \uac19\uc740 configuration\ubcc0\ud654\uc5d0\uc11c\ub3c4 \uc0b4\uc544\ub0a8\ub294\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uc561\ud2f0\ube44\ud2f0\ub098 \ud504\ub808\uadf8\uba3c\ud2b8\uac19\uc740 UI\ucee8\ud2b8\ub864\ub7ec\uc758 \uc0dd\uba85\uc8fc\uae30\ub97c \uad00\ub9ac\ud55c\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uc0ac\uc6a9\uc790\uc758 \ud589\ub3d9\uc774\ub098 \ub610\ub294 \uac1c\ubc1c\uc790\uac00 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \uc5b4\ub5a4 \uc774\ubca4\ud2b8(\uba54\ubaa8\ub9ac\ubd80\uc871 \ub4f1)\ub85c \uc778\ud574,\u00a0\uc544\ub9c8 UI\ucee8\ud2b8\ub864\ub7ec\ub97c \ud30c\uad34\ud558\uac70\ub098 \uc7ac\uc0dd\uc131\ud558\uac8c \ub41c\ub2e4. \ub9cc\uc57d \uc2dc\uc2a4\ud15c\uc774 UI\ucee8\ud2b8\ub864\ub7ec\ub97c \ud30c\uad34\ud558\uac70\ub098 \uc7ac\uc0dd\uc131\ud55c\ub2e4\uba74 UI\uc640 \uad00\ub828\ub41c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[16],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/365"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=365"}],"version-history":[{"count":0,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/365\/revisions"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}