{"id":363,"date":"2018-06-20T14:27:30","date_gmt":"2018-06-20T05:27:30","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=363"},"modified":"2018-06-20T14:27:30","modified_gmt":"2018-06-20T05:27:30","slug":"android-architecture-component-livedata","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=363","title":{"rendered":"Android Architecture Component &#8211; LiveData"},"content":{"rendered":"<h1>\uac1c\uc694<\/h1>\n<p><code><a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/LiveData.html\">LiveData<\/a><\/code><span style=\"color: #212121;\">\u00a0<\/span>\ub294 Data\uc758 \ubcc0\uacbd\uc744 \uad00\uce21<span style=\"font-size: 10.0pt;\">\ud560 \uc218 \uc788\ub294 Data Holder \ud074\ub798\uc2a4 \uc785\ub2c8\ub2e4.<\/span><br \/>\n\uc77c\ubc18\uc801\uc778 Observable\uacfc\ub294 \ub2e4\ub974\uac8c LiveData\ub294 \uc0dd\uba85\uc8fc\uae30\ub97c \uc54c\uace0 \uc788\uc2b5\ub2c8\ub2e4.(Lifecycle-Aware)<br \/>\n<span style=\"font-size: 10.0pt;\">\uc561\ud2f0\ube44\ud2f0\ub098, \ud504\ub808\uadf8\uba3c\ud2b8, \uc11c\ube44\uc2a4 \ub4f1\uacfc \uac19\uc740 \ucef4\ud3ec\ub10c\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30(Lifecycle)\ub97c \uc874\uc911\ud558\uace0 \uadf8\uc5d0\ub530\ub77c <\/span><strong style=\"font-size: 10.0pt;\">LiveData\ub294 \ud65c\uc131\uc0c1\ud0dc(active)\uc77c\ub54c\ub9cc \ub370\uc774\ud130\ub97c \uc5c5\ub370\uc774\ud2b8<\/strong><span style=\"font-size: 10.0pt;\"> \ud569\ub2c8\ub2e4.<br \/>\n<\/span><span style=\"font-size: 10.0pt;\">\ud65c\uc131\uc0c1\ud0dc\ub780\u00a0STARTED \ub610\ub294 RESUMED\ub97c \uc758\ubbf8\ud569\ub2c8\ub2e4.<\/span><\/p>\n<table class=\"relative-table wrapped confluenceTable\" style=\"width: 55.021095%;\">\n<colgroup>\n<col style=\"width: 21.812595%;\" \/>\n<col style=\"width: 78.1874%;\" \/><\/colgroup>\n<tbody>\n<tr>\n<th class=\"confluenceTh\" colspan=\"2\">\n<h3>Lifecycle State<\/h3>\n<\/th>\n<\/tr>\n<tr>\n<td class=\"confluenceTd\">CREATED<\/td>\n<td class=\"confluenceTd\">Created state for a LifecycleOwner.<\/td>\n<\/tr>\n<tr>\n<td class=\"confluenceTd\">DESTROYED<\/td>\n<td class=\"confluenceTd\">Destroyed state for a LifecycleOwner.<\/td>\n<\/tr>\n<tr>\n<td class=\"confluenceTd\">INITIALIZED<\/td>\n<td class=\"confluenceTd\">Initialized state for a LifecycleOwner.<\/td>\n<\/tr>\n<tr>\n<td class=\"confluenceTd\">RESUMED<\/td>\n<td class=\"confluenceTd\">Resumed state for a LifecycleOwner.<\/td>\n<\/tr>\n<tr>\n<td class=\"confluenceTd\">STARTED<\/td>\n<td class=\"confluenceTd\">Started state for a LifecycleOwner.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/LiveData.html\"><code>LiveData<\/code><\/a><span style=\"color: #212121;\">\u00a0<\/span>\uac1d\uccb4\uc5d0 <a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/LifecycleOwner.html\"><code>LifecycleOwner<\/code><\/a>\uc640 \ud568\uaed8 \uc635\uc800\ubc84\ub97c \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n<code><a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/LifecycleOwner.html\">LifecycleOwner<\/a>\uac00 \ucd94\uac00\ub41c <a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/LiveData.html\">LiveData<\/a>\ub294 DESTROYED \uc0c1\ud0dc\uac00 \ub418\uba74 \uc790\ub3d9\uc73c\ub85c \uc81c\uac70 \ub429\ub2c8\ub2e4.<br \/>\n\uc774\uc810\uc740 \uba54\ubaa8\ub9ac \ub204\uc218\uc5d0 \uad00\ud574 \uac71\uc815\ud560 \ud544\uc694\uac00 \uc5c6\uc73c\uba70, \ud2b9\ud788 UI\ucef4\ud3ec\ub10c\ud2b8(\uc561\ud2f0\ube44\ud2f0, \ud504\ub808\uadf8\uba3c\ud2b8) \ub4f1\uc744 \uc0ac\uc6a9\ud560 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4.<br \/>\n<\/code><span style=\"font-family: monospace; font-size: 10.0pt;\">\ub610\ud55c UI\ucee8\ud2b8\ub864\ub7ec \uac1d\uccb4\uac00 \ud30c\uad34 \ub418\uc5b4\ub3c4 LiveData\ub294 \uc989\uc2dc \uad6c\ub3c5\uc774 \ucde8\uc18c\ub429\ub2c8\ub2e4.(Unsubscribed)<\/span><br \/>\n<span style=\"font-family: monospace; font-size: 10.0pt;\">\ucd94\uac00\uc801\uc73c\ub85c LiveData\ub294 onActive()\uc640 onInactive() \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uace0 \uc788\ub294\ub370 \uc774 \uba54\uc11c\ub4dc\ub97c \ud65c\uc6a9\ud558\uc5ec \ud65c\uc131\ud654\ub41c Observer\uc218\uac00 \ubcc0\uacbd\ub420 \ub54c \uc54c\ub9bc\uc744 \ubc1b\uc2b5\ub2c8\ub2e4.<br \/>\n\uc774\ub85c \uc778\ud574 LiveData\ub294 \uc774 \uac1d\uccb4\ub97c \uad00\ucc30\uc911\uc778(\ucc38\uc870\uc911\uc778) Observer\uac00 \uc5c6\uc744\ub54c \ubb34\uac70\uc6b4 \ub9ac\uc18c\uc2a4\ub97c \ud574\uc81c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><br \/>\n<span style=\"font-family: monospace; font-size: 10.0pt;\">onActive() : \ud65c\uc131\ud654\ub41c Observer\uc218\uac00 0\uc5d0\uc11c 1\ub85c \ubc14\ub014\ub54c \ud638\ucd9c \ub41c\ub2e4.<\/span><br \/>\n<span style=\"font-family: monospace; font-size: 10.0pt;\">onInactive() : \ud65c\uc131\ud654\ub41c Observer\uc218\uac00 1\uc5d0\uc11c 0\uc73c\ub85c \ubc14\ub014\ub54c \ud638\ucd9c \ub41c\ub2e4.<\/span><\/p>\n<h1><span style=\"font-family: monospace;\">LiveData\uc758 \uc7a5\uc810<\/span><\/h1>\n<ul style=\"list-style-type: square;\">\n<li><span style=\"font-family: monospace; font-size: 10.0pt;\">Data\uc640 UI\uac04 \ub3d9\uae30\ud654<br \/>\n\uc571\uc758 \uc0dd\uba85\uc8fc\uae30\uc758 \ubcc0\uacbd\uc5d0 \ub530\ub77c UI\ub97c \ub9e4\ubc88 \uac31\uc2e0\ud560 \ud544\uc694\uac00 \uc5c6\uace0, \uc635\uc800\ubc84\uac1d\uccb4\ub0b4\uc5d0\uc11c UI\ub97c \uac31\uc2e0\ud558\ub294\uac83\uc73c\ub85c \ud1b5\ud569\uc2dc\ud0ac \uc218 \uc788\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: monospace; font-size: 10.0pt;\">\uba54\ubaa8\ub9ac \ub204\uc218 \ubc29\uc9c0<br \/>\n\uc635\uc800\ubc84\ub294\u00a0<a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/Lifecycle.html\"><code>Lifecycle<\/code><\/a><span style=\"color: #212121;\">\u00a0\uac1d\uccb4\uc640 \ubc14\uc778\ub529 \ub418\uc5b4\uc788\uc73c\uba70 \uc5f0\uad00\ub41c \uc0dd\uba85\uc8fc\uae30\uac00 \uc18c\uba78\uc2dc\uc5d0 \uc635\uc800\ubc84\ub3c4 \uac19\uc774 \uba54\ubaa8\ub9ac\uc0c1\uc5d0\uc11c \uc815\ub9ac\uac00 \ub41c\ub2e4.<\/span><\/span><\/li>\n<li><span style=\"font-family: monospace; font-size: 10.0pt;\">\uc561\ud2f0\ube44\ud2f0\uac00 \uc885\ub8cc\ub428\uc73c\ub85c \uc778\ud55c \ud06c\ub798\uc26c\ub4e4\uc744 \ubc29\uc9c0 \ud560 \uc218 \uc788\ub2e4.<br \/>\n<\/span><span style=\"font-family: monospace; font-size: 10.0pt;\">\uc635\uc800\ubc84\uc758 \uc0dd\uba85\uc8fc\uae30\uac00 \ube44\ud65c\uc131\ud654 \ub41c\ub2e4\uba74, LiveData\uc758 \ub370\uc774\ud130 \ubcc0\uacbd \uc774\ubca4\ud2b8\ub97c \ubc1b\uc9c0 \uc54a\ub294\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: monospace; font-size: 10.0pt;\">\uc218\ub3d9\uc801\uc778 \uc0dd\uba85\uc8fc\uae30 \uad00\ub9ac\uac00 \ud544\uc694\uc5c6\ub2e4<br \/>\n<\/span><span style=\"font-family: monospace;\">UI\ucef4\ud3ec\ub10c\ud2b8\ub294 \uadf8\uc800 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \uad00\uce21(Observe)\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. onStop \uc774\ub098 onResume\uc5d0\uc11c \ud574\uc81c, \ub4f1\ub85d \ud558\ub294 \uc808\ucc28\ub97c \ud560\ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<br \/>\nLiveData\uac00 \uc790\ub3d9\uc73c\ub85c UI\ucef4\ud3ec\ub10c\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30\ub97c \uc54c\uace0 \uad00\ub9ac\ud569\ub2c8\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: monospace; font-size: 10.0pt;\">\ud56d\uc0c1 \ucd5c\uc2e0\uc758 \ub370\uc774\ud130\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.<br \/>\n\uc0dd\uba85\uc8fc\uae30\uac00 \ub9cc\uc57d \ube44\ud65c\uc131\ud654(Inactive)\uc0c1\ud0dc\uac00 \ub418\uc5b4\ub3c4 \ucd5c\uc2e0\uc758 \ub370\uc774\ud130\ub97c \ud65c\uc131(active)\uc0c1\ud0dc\uc77c\ub54c \ub2e4\uc2dc \ubc1b\uc2b5\ub2c8\ub2e4.\u00a0<\/span><\/li>\n<li><span style=\"font-family: monospace; font-size: 10.0pt;\">UI\ucee8\ud2b8\ub864\ub7ec\uc758 \uc0c1\ud0dc\ubcc0\uacbd\uc774 \uc27d\ub2e4.<\/span><br \/>\n<span style=\"font-family: monospace;\">UI\ucef4\ud3ec\ub10c\ud2b8\uac00 \ud658\uacbd\uc124\uc815(configuration)\uc758 \ubb38\uc81c\ub85c,\uc608\ub97c \ub4e4\uba74 \uac00\ub85c-\uc138\ub85c \ud654\uba74\uc804\ud658, \uc7ac\uc0dd\uc131(recreated)\ub418\uac70\ub098 \ud558\uc5ec\ub3c4 \uc989\uc2dc \ucd5c\uc2e0\uc758 \ub370\uc774\ud130\ub97c \ubc1b\uc544 \uc635\ub2c8\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: monospace;\">\uc790\uc6d0\uacf5\uc720<br \/>\nLiveData\ub97c \uc0c1\uc18d\ud558\uc5ec \uc790\uc2e0\ub9cc\uc758 LiveData\ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uace0, \uc2f1\uae00\ud1a4 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4\ub97c \ub458\ub7ec\uc2f8\uba74(wrap) \uc571 \uc5b4\ub514\uc5d0\uc11c\ub098 \uacf5\uc720 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<h1>LiveData \uc0ac\uc6a9\ud558\uae30<\/h1>\n<ol>\n<li>LiveData\ub294 \ubcf4\ud1b5 ViewModel\ub0b4\uc5d0\uc11c \ud568\uaed8 \uc4f0\uc785\ub2c8\ub2e4.<\/li>\n<li>\uc635\uc800\ubc84 \uac1d\uccb4\ub97c \ub9cc\ub4e4\uace0 onChange() \uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 LiveData\uc758 data\ubcc0\uacbd\uc744 \uac10\uc9c0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubcf4\ud1b5 Observer\ub294 \ud504\ub808\uadf8\uba3c\ud2b8\ub098 \uc561\ud2f0\ube44\ud2f0 \uac19\uc740 UI\ucee8\ud2b8\ub864\ub7ec\uc5d0\uc11c \ub9cc\ub4ed\ub2c8\ub2e4.<\/li>\n<li>observe()\uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 Observer\ub97c \ubd99\uc77c \uc218 \uc788\uc73c\uba70, observe()\ub294 LifecycleOwner \uac1d\uccb4\ub97c \ud3ec\ud568\ud574\uc57c \ud569\ub2c8\ub2e4. (Activity \ub610\ub294 Fragment\uac00 LifeCycleOwner\ub97c implement \ud558\uace0 \uc788\ub2e4.)<\/li>\n<\/ol>\n<table class=\"wrapped confluenceTable\">\n<colgroup>\n<col \/><\/colgroup>\n<tbody>\n<tr>\n<th class=\"confluenceTh\">Note: observeForever(Observer)\ub97c \ud1b5\ud574 LifeCycleOwner\uc5c6\uc774 Observer\ub97c \ub4f1\ub85d\ud560 \uc21c \uc788\uc9c0\ub9cc , \uc774\uacbd\uc6b0\uc5d0\ub294 \uc635\uc800\ubc84\ub294 \ud56d\uc0c1 active\uc0c1\ud0dc\uc774\ubbc0\ub85c \ub370\uc774\ud130\ubcc0\ud654\ub97c \ud56d\uc0c1 \ubc1b\ub294\ub2e4. removeObserver(Observer) \uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 Observer\ub97c \uc81c\uac70 \ud560 \uc218 \uc788\ub2e4.<\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>LiveData\uc758 data\uac00 \ubcc0\uacbd\ub420\ub54c\u00a0LifecycleOwner\uac00 \ud65c\uc131\ud654 \ub418\uc5b4\uc788\ub294\ud55c \ub4f1\ub85d\ub41c \ubaa8\ub4e0 \uc635\uc800\ubc84\ub4e4\uc5d0\uac8c \uc774\ubca4\ud2b8\ub97c \ubcf4\ub0b4\uac8c \ub41c\ub2e4.<br \/>\nLiveData\ub294 UI\ucee8\ud2b8\ub864\ub7ec \uc635\uc800\ubc84\ub4e4\uc774 \ub370\uc774\ud130 \ubcc0\ud654\ub97c \uac10\uc9c0\ud558\uace0 \uc54c\ub9de\uac8c UI\ub97c \uc790\ub3d9\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc900\ub2e4.<\/p>\n<h2>LiveData \uac1d\uccb4 \ub9cc\ub4e4\uae30<\/h2>\n<p>LiveData\ub294 Collections, List\uc640 \uac19\uc740 \uc5b4\ub5a4 data\uac74 \uac10\uc300 \uc218 \uc788\ub2e4. \ubcf4\ud1b5 ViewModel \ub0b4\uc5d0 \uc800\uc7a5\ub418\uc5b4\uc11c \uc0ac\uc6a9\ub41c\ub2e4.<\/p>\n<table class=\"wysiwyg-macro\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\" data-macro-name=\"code\" data-macro-id=\"d93a3db7-f446-4972-8235-845ee554653d\" data-macro-parameters=\"language=java\" 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 NameViewModel extends ViewModel {\n\t\/\/String\uc744 \uac10\uc2fc LiveData\ub9cc\ub4e4\uae30\n\tprivate MutableLiveData&lt;String&gt; mCurrentName;\n    public MutableLiveData&lt;String&gt; getCurrentName() {\n        if (mCurrentName == null) {\n            mCurrentName = new MutableLiveData&lt;String&gt;();\n        }\n        return mCurrentName;\n    }\n}\n\/\/\ucd08\uae30\uac12\uc740 \uc544\uc9c1 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\ub2e4.<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table class=\"wrapped confluenceTable\">\n<colgroup>\n<col \/><\/colgroup>\n<tbody>\n<tr>\n<th class=\"confluenceTh\">Note:LiveData\uc640 ViewModel\uc740 Activity\ub098 Fragment\uac00 \uac70\ub300\ud574\uc9c0\ub294\uac83\uc744 \ud53c\ud55c\ub2e4. UI Controller\ub294 \uadf8\uc800 data\ub97c \uc5b4\ub5bb\uac8c \ubcf4\uc5ec\uc8fc\uace0 \ud45c\ud604\ud558\ub290\ub0d0\uc5d0\ub9cc \uc2e0\uacbd\uc744 \uc4f0\uba74\ub41c\ub2e4. \uc608\uc804\ucc98\ub7fc data\ub97c \uc9c1\uc811 \uad00\ub9ac\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4. \uc9c1\uc811 \uad00\ub9ac\ud558\uba74 LifeCycle\uacfc \uad00\ub828\ud558\uc5ec \ucc98\ub9ac\ud574\uc57c\ud560 \uac83\uc774 \ub9ce\uc544\uc9c4\ub2e4.(\uc608\ub97c \ub4e4\uba74 Activity\uc758 Screen Rotation\uc774\ub77c\ub4e0\uac00&#8230;) \uadf8\ub798\uc11c UIController\uc640 LiveData\ub97c \ub514\ucee4\ud50c\ub9c1\ud558\uae30 \uc704\ud574 ViewModel\uc774 LiveData\ub97c \uad00\ub9ac\ud558\uace0 UI\ucee8\ud2b8\ub864\ub7ec\ub294 \uadf8\uc800 \uc635\uc800\ubc84\ub97c \ud1b5\ud574 UI\uac31\uc2e0\ub9cc \ud558\uba74\ub41c\ub2e4. \uadf8\ub7ec\uba74 configuration\uc758 \ubcc0\ud654\uc5d0\uc11c\ub3c4 LiveData \uac1d\uccb4\ub294 \uc0b4\uc544\ub0a8\uc744\uc218 \uc788\ub2e4.<\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>LiveData \ub370\uc774\ud130 \ubcc0\uacbd \uad00\uce21\ud558\uae30<\/h2>\n<p>\ub300\ubd80\ubd84\uc758 \uacbd\uc6b0 onCreate()\uc5d0\uc11c observe()\ub97c \ud558\uba74 \uc801\ub2f9\ud558\ub2e4. \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4<\/p>\n<ul style=\"list-style-type: square;\">\n<li>\uc911\ubcf5 \ud638\ucd9c\uc744 \ubc29\uc9c0\ud560 \uc218 \uc788\ub2e4. \uc608\ub97c \ub4e4\uba74 onResume()\uc774\ub77c\ub358\uac00 \ud558\ub294\uacf3\uc5d0 observe()\ub97c \ubc30\uce58\ud558\uba74 \uc911\ubcf5\ud638\ucd9c\uc744 \ubc30\uc81c\ud558\uae30 \ud798\ub4e4\ub2e4.<\/li>\n<li>\ucef4\ud3ec\ub10c\ud2b8\uac00 STARTED \uc0c1\ud0dc\uac00 \ub418\uc5c8\uc744\ub54c \ubc14\ub85c Activity\ub098 fragment\uc5d0\uc11c Data\ub97c \ud45c\ud604\ud574 \uc904 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/li>\n<\/ul>\n<p>\uc77c\ubc18\uc801\uc73c\ub85c LiveData\ub294 data\uac00 \ubcc0\uacbd\ub418\uc5c8\uc744\ub54c \uc635\uc800\ubc84\ub97c \ud65c\uc131\ud654 \uc2dc\ud0a4\uae30 \uc704\uc5d0 data\uc758 \ubcc0\uacbd \uc0ac\ud56d\uc744 \uc804\ub2ec\ud55c\ub2e4. \uc774\ub7f0 \uc0ac\ud56d\uc5d0 \ub300\ud55c \ud558\ub098\uc758 \uc608\uc678\uc0ac\ud56d\uc73c\ub85c \uc635\uc800\ubc84\ub4e4\uc740 inactive\uc5d0\uc11c active\uc0c1\ud0dc\ub85c \ubcc0\uacbd\ub420\ub54c\ub3c4 \ubcc0\uacbd \uc54c\ub9bc\uc744 \ubc1b\ub294\ub2e4.<br \/>\n\ub354\ub098\uc544\uac00 \ub9cc\uc57d \uc635\uc800\ubc84\uac00 inactive\uc5d0\uc11c active\ub85c \ub450\ubc88 \ubcc0\uacbd \ub418\uba74 \ub9c8\uc9c0\ub9c9\uc5d0 \ubcc0\uacbd\ub41c \ud558\ub098\uc758 \ubcc0\uacbd \uc54c\ub9bc\ub9cc \ubc1b\ub294\ub2e4.<\/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=\"7849e28c-01e1-47b6-a793-8662fc3486b4\" 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 NameActivity extends AppCompatActivity {\n    private NameViewModel mModel;\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\t\t\/\/ViewModel \uc5bb\uae30\n        mModel = ViewModelProviders.of(this).get(NameViewModel.class);\n        \/\/ UI\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\ub294 \uc635\uc800\ubc84 \ub9cc\ub4e4\uae30\n        final Observer&lt;String&gt; nameObserver = new Observer&lt;String&gt;() {\n            @Override\n            public void onChanged(@Nullable final String newName) {\n                \/\/ \uc774 \uacbd\uc6b0\uc5d0\ub294 \uc774\uacf3\uc5d0\uc11c TextView\uc758 \uac12\uc744 \ubcc0\uacbd\ud55c\ub2e4.\n                mNameTextView.setText(newName);\n            }\n        };\n        \/\/ observe()\uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 LiveData\ub97c \uac10\uc9c0\ud558\uace0 LifecycleOwner\uc640 Observer\ub97c \ub118\uaca8\uc900\ub2e4.\n        mModel.getCurrentName().observe(this, nameObserver);\n    }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>LiveData\uac1d\uccb4\uc758 data\ub97c \ubcc0\uacbd\ud574\ubcf4\uc790<\/h2>\n<p>LiveData\ub294 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\ub294 \uba54\uc18c\ub4dc\uac00 public\ud558\uac8c \uc788\uc9c0 \uc54a\ub2e4. \uadf8\ub7fc \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c?<br \/>\n<span style=\"font-size: 10.0pt;\">\uc815\ub2f5\uc740 LiveData\ub97c \uc0c1\uc18d\ud55c MutableLiveData\ub97c \uc4f0\ub3c4\ub85d\ud558\uc790.<br \/>\nMutableLiveData\ub294 setValue(T) \uc640 postValue(T) \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uace0 \uc788\uc5b4\uc11c \uc774\ub97c \ud1b5\ud574 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.<\/span><\/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=\"d96051c3-c504-43f4-b086-a80def40049d\" 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\">mButton.setOnClickListener(new OnClickListener() {\n    @Override\n    public void onClick(View v) {\n        String anotherName = \"Charles\";\n        mModel.getCurrentName().setValue(anotherName);\n    }\n});<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table class=\"wrapped confluenceTable\">\n<colgroup>\n<col \/><\/colgroup>\n<tbody>\n<tr>\n<th class=\"confluenceTh\">Note:setValue(T)\ub294 \ubc18\ub4dc\uc2dc mainThread\uc5d0\uc11c \ud638\ucd9c\ud574\uc57c\ud55c\ub2e4. \ub9cc\uc57d subThread\uc5d0\uc11c \ud638\ucd9c\ud55c\ub2e4\uba74 postValue(T)\ub97c \ud1b5\ud574 LiveData\ub97c \uc5c5\ub370\uc774\ud2b8 \ud558\ub3c4\ub85d \ud558\uc790.<\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>LiveData\uc640 Room \uac19\uc774 \uc368\ubcf4\uae30<\/h2>\n<p>Room\uc5d0\uc11c return \uac12\uc744 LiveData\ub85c \uac16\ub294 Observable queries\uac00 \uac00\ub2a5\ud558\ub2e4.<br \/>\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \ubcc0\uacbd\ub420\ub54c LiveData\ub3c4 \uac19\uc774 \uc5c5\ub370\uc774\ud2b8 \ub41c\ub2e4. \ud544\uc694\ud558\ub2e4\uba74 \ucffc\ub9ac\ub85c \uc778\ud574 \uc0dd\uc131\ub41c \ucf54\ub4dc\ub294 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc4f0\ub808\ub4dc\uc5d0\uc11c \uc0dd\uc131\ub41c\ub2e4.<\/p>\n<h2>LiveData \uc0c1\uc18d\ud558\uc5ec \ud655\uc7a5\ud558\uae30<\/h2>\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=\"e9510795-1693-49a9-a28f-5f6b249291cb\" 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 StockLiveData extends LiveData&lt;BigDecimal&gt; {\n    private StockManager mStockManager;\n    private SimplePriceListener mListener = new SimplePriceListener() {\n        @Override\n        public void onPriceChanged(BigDecimal price) {\n            setValue(price);\n        }\n    };\n    public StockLiveData(String symbol) {\n        mStockManager = new StockManager(symbol);\n    }\n    @Override\n    protected void onActive() {\n        mStockManager.requestPriceUpdates(mListener);\n    }\n    @Override\n    protected void onInactive() {\n        mStockManager.removeUpdates(mListener);\n    }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul style=\"list-style-type: square;\">\n<li>onActive() \uba54\uc18c\ub4dc\ub294 LiveData\uac00 \ud65c\uc131\ud654\ub41c \uc635\uc800\ubc84\ub97c \uac16\uace0 \uc788\uc744\ub54c \ud638\ucd9c\ub41c\ub2e4.<\/li>\n<li>onInactive() \uba54\uc18c\ub4dc\ub294 LiveData\uac00 \ud65c\uc131\ud654\ub41c \uc635\uc800\ubc84\ub97c \ud558\ub098\ub3c4 \uac16\uace0 \uc788\uc9c0 \uc54a\uc744\ub54c \ud638\ucd9c\ub41c\ub2e4.<\/li>\n<li>setValue()\ub294 LiveData\uc758 \uac12\uc744 \ubcc0\uacbd\ud558\uace0 \uc635\uc800\ubc84\uc5d0 \ub300\ud574 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc54c\ub824\uc900\ub2e4<\/li>\n<\/ul>\n<p>\uc704\uc758 StockLiveData\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \uc368\ubcf4\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=\"de4cd965-7553-427b-b073-a3d8f8415b32\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre>public class MyFragment extends Fragment {\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        LiveData&lt;BigDecimal&gt; myPriceListener = ...;\n        myPriceListener.observe(this, price -&gt; {\n            \/\/ Update the UI.\n        });\n    }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>observe()\uba54\uc18c\ub4dc\ub97c \ud1b5\ud574 fragment\uc640 \uc635\uc800\ubc84\ub97c \ub118\uaca8 \uc8fc\uace0 \uc788\ub2e4. fragment\ub294 LifecycleOwner\ub85c \uc4f0\uc778\ub2e4. fragment\ub97c \ub118\uaca8\uc8fc\ub294 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<ul style=\"list-style-type: square;\">\n<li>Lifecycle\uac1d\uccb4\uac00 active\uc0c1\ud0dc\uac00 \uc544\ub2c8\ub77c\uba74, \uc635\uc800\ubc84\ub294 data\ubcc0\uacbd\uc5d0\ub3c4 \ud638\ucd9c\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/li>\n<li>Lifecycle\uac1d\uccb4\uac00 \ud30c\uad34\ub41c\ub2e4\uba74, \uc635\uc800\ubc84\ub3c4 \uc790\ub3d9\uc73c\ub85c \uc81c\uac70 \ub41c\ub2e4.<\/li>\n<\/ul>\n<p>LiveData\uac00 \ub77c\uc774\ud504\uc0ac\uc774\ud074\uc744 \uc54c\uace0\uc788\ub294 (Lifecycle-aware) \uc774\uc720\uac00 \ubc14\ub85c fragment, activity \ub098 service\uac19\uc740 \uac1d\uccb4\ub97c \uacf5\uc720 \ud558\uae30 \ub54c\ubb38\uc774\ub2e4.<br \/>\n\ub450\uac1c\uc774\uc0c1\uc758 \ud504\ub798\uadf8\uba3c\ud2b8\ub098 \uc561\ud2f0\ube44\ud2f0\uc5d0\uc11c\ub3c4 \ub3d9\uc77c\ud55c LiveData\uac1d\uccb4\ub97c \ub3d9\uc2dc\uc5d0 observe() \ud560 \uc218 \uc788\ub2e4.<\/p>\n<h2>LiveData\uc758 \ubcc0\ud615<\/h2>\n<p>\uc544\ub9c8\ub3c4 \uac1c\ubc1c\uc790\ub294 LiveData\uc758 data\ub97c \ubcc0\uacbd\ud558\uac70\ub098 \uadf8 data\ub97c \uae30\ubc18\uc73c\ub85c\ud558\ub294 \ub2e4\ub978 \ubd80\uac00\uc801\uc778 \uac83\ub4e4\uc744 Observer\ub97c \ud1b5\ud574 \uc5bb\uace0 \uc2f6\uc744\ub54c\ub3c4 \uc788\uc744\uac83\uc774\ub2e4.<br \/>\n<span style=\"font-size: 10.0pt;\">LiveData\ub294 \uadf8\ub7f0 \uc2dc\ub098\ub9ac\uc624\ub3c4 \uc774\ubbf8 \uc608\uce21\ud558\uace0 \uc900\ube44\ud574\ub1a8\uc9c0 \ud760\ud760.\u00a0<\/span><\/p>\n<ul style=\"list-style-type: square;\">\n<li>Transformation.map()<br \/>\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=\"051c4c06-fff1-4c7f-9a7c-b003a248a7f9\" 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\">LiveData&lt;User&gt; userLiveData = ...;\nLiveData&lt;String&gt; userName = Transformations.map(userLiveData, user -&gt; {\n    user.name + \" \" + user.lastName\n});<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li>Transformations.switchMap()<br \/>\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=\"7fa3438d-d690-431a-8ba1-6058033e56fb\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre>private LiveData&lt;User&gt; getUser(String id) {\n  ...;\n}\nLiveData&lt;String&gt; userId = ...;\nLiveData&lt;User&gt; user = Transformations.switchMap(userId, id -&gt; getUser(id) );<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>map()\uacfc switchMap()\uc740 \ube44\uc2b7\ud574\ubcf4\uc774\uc9c0\ub9cc \ub2e4\ub974\ub2e4. map()\uc5d0\uc11c\ub294 \ub450\ubc88\uc9f8 \uc778\uc790\uc758 \ud568\uc218\uc758 \ub9ac\ud134\uac12\uc774 object\uba74 \ub418\uc9c0\ub9cc switchMap()\uc5d0\uc11c\ub294 \ub9ac\ud134\uac12\uc774 \ubc18\ub4dc\uc2dc LiveData\uc774\uc5ec\uc57c \ud55c\ub2e4.<\/li>\n<\/ul>\n<p>Transformation\uba54\uc18c\ub4dc\ub97c \uc635\uc800\ubc84\uc758 Lifecycle\uc744 \uae30\ubc18\uc73c\ub85c \ud558\uc5ec \uc815\ubcf4\ub97c \uac00\uc838\uc624\ub294\ub370 \uc4f8\uc218 \uc788\ub2e4\ub294\uac83\uc744 \uc54c\uc558\ub2e4. Transformation\uc740 \uc635\uc800\ubc84\uac00 LiveData\ub97c \ubc18\ud658\ud558\ub294\uac83\uc744 \uac10\uc2dc\ud558\uace0 \uc788\uc9c0 \uc54a\ub294\ud55c \ubcc4\ub3c4\uc758 \uc791\uc5c5\uc744 \ud558\uc9c0 \uc54a\ub294\ub2e4. \uc65c\ub0d0\uba74 Transformation\uc740 lazy\ud558\uac8c \uc791\ub3d9\ub418\uae30 \ub584\ubb38\uc774\ub2e4. \uc0dd\uba85\uc8fc\uae30\uc640 \uad00\ub828\ub41c \ud589\ub3d9\uc740 \ucd94\uac00\uc801\uc778 \uba85\ubc31\ud55c \ud638\ucd9c\ub610\ub294 \uc758\uc874\uc131\uc744 \uc694\uad6c\ud558\ub294\uac83 \uc5c6\uc774 \uc554\ubb35\uc801\uc73c\ub85c \ubb3c\ub824\uc8fc\uac8c \ub41c\ub2e4.<br \/>\n\ub9cc\uc57d Lifecycle\uac1d\uccb4\uac00 ViewModel \ub0b4\uc5d0\uc11c \ud544\uc694\ud558\ub2e4\uba74, Transformation\uc740 \uc801\ud569\ud55c \ubc29\ubc95\uc77c\uac83\uc774\ub2e4. \uc608\ub97c\ub4e4\uba74 Activity\ub098 Fragment\uac00 \uc8fc\uc18c\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \uc8fc\uc18c\ub97c \ud1b5\ud574 \uc6b0\ud3b8\ubc88\ud638\ub97c \uc5bb\ub294 \ub85c\uc9c1\uc744 \uc9e0\ub2e4 \uce58\uba74, LiveData\uc640 ViewModel\uc5d0\uc11c \uac04\ub7b5\ud788 \ubc30\uc6b4\uc774\uc0c1 \uc544\ub9c8 \uc774\uc81c\ubd80\ud130\ub294 ViewModel\uc744 \uc0ac\uc6a9\ud558\ub824 \ud560\uac70\uace0, \ucd08\uc2ec\uc790\uc778 \ub2f9\uc2e0\uc740 \uc774\ub807\uac8c \uc9e4\uac8c \ubd84\uba85\ud558\ub2e4.<\/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=\"72bf7a6e-c614-4189-a5da-a77eaff79c36\" 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\">class MyViewModel extends ViewModel {\n    private final PostalCodeRepository repository;\n    public MyViewModel(PostalCodeRepository repository) {\n       this.repository = repository;\n    }\n    private LiveData&lt;String&gt; getPostalCode(String address) {\n       \/\/ \uc774.\ub807.\uac8c.\uc9dc.\uba74.\uc544.\ub2c8.\ub418.\uc624.\n       return repository.getPostCode(address);\n    }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc774\ub807\uac8c \uc9dc\uba74 UI\ucee8\ud2b8\ub864\ub7ec\uc5d0\uc11c\ub294 \uc774\uc804 LiveData\uc744 \ud574\uc81c\ud558\ub294 \uc791\uc5c5\uc774 \ud544\uc694\ud558\uace0 \ub2e4\uc2dc \uc0c8\ub85c\uc6b4 \uac1d\uccb4\uc5d0 \ub300\ud574\uc11c getPostalCode()\uac00 \ud638\ucd9c\ub420\ub54c\ub9c8\ub2e4 \ub4f1\ub85d\ud558\ub294 \uacfc\uc815\uc774 \ud544\uc694\ud558\ub2e4. \uac8c\ub2e4\uac00 UI\ucee8\ud2b8\ub864\ub7ec\uac00 \uc7ac\uc0dd\uc131 \ub418\uae30\ub77c\ub3c4 \ud55c\ub2e4\uba74 \ub610\ub2e4\ub978 getPostCode()\ub97c \ud638\ucd9c\ud558\uac8c \ub418\uace0 \uc774\uc804\uc758 \ub370\uc774\ud130\ub294 \uc4f8\ubaa8\uac00 \uc5c6\uc5b4\uc9c4\ub2e4.(\uc911\ubcf5\uc791\uc5c5)<br \/>\n\uadf8\ub7fc \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c?<br \/>\n\uc6b0\ud3b8\ubc88\ud638\uac80\uc0c9\uc744 \uc8fc\uc18c\ub97c \uc77c\ub825\ud558\ub294\uac83\uc5d0 \ub300\ud55c \ubcc0\ud615(transformation)\uc73c\ub85c \uad6c\ud604\ud558\uba74 \ub41c\ub2e4. \ub2e4\uc74c \ucf54\ub4dc\ub97c \ud655\uc778\ud574\ubcf4\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=\"d5029e75-51b6-49b6-aeb0-ef1433e6070f\" 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\">class MyViewModel extends ViewModel {\n    private final PostalCodeRepository repository;\n    private final MutableLiveData&lt;String&gt; addressInput = new MutableLiveData();\n    public final LiveData&lt;String&gt; postalCode =\n            Transformations.switchMap(addressInput, (address) -&gt; {\n                return repository.getPostCode(address);\n             });\n  public MyViewModel(PostalCodeRepository repository) {\n      this.repository = repository\n  }\n  private void setInput(String address) {\n      addressInput.setValue(address);\n  }\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc774\ub807\uac8c \uc9e0\ub2e4\uba74 postalCode \ud544\ub4dc\ub294 public\uc774\uba70 final \uc774\ub2e4 \uc65c\ub0d0\uba74 \ubcc0\uacbd\ub420 \uc77c\uc774 \uc5c6\uc73c\ub2c8\uae4c!<br \/>\npostalCode\ud544\ub4dc\ub294 addressInput\uc758 \ubcc0\ud615\uc73c\ub85c \uc815\uc758\ub418\uc5c8\uc73c\uba70, \uc774\uac83\uc774 \uc758\ubbf8\ud558\ub294\ubc14\ub294 repository.getPostCode()\uba54\uc18c\ub4dc\uac00 addressInput data\uc758 \ubcc0\uacbd\uc2dc\uc810\ub9c8\ub2e4 \ud638\ucd9c\ub41c\ub2e4\ub294 \uc810\uc774\ub2e4.<br \/>\nObserver\uac00 \ucd94\uac00\ub418\uae30 \uc804\uae4c\uc9c0\ub294 \uc5b4\ub5a0\ud55c \uc791\uc5c5\ub3c4 \uc77c\uc5b4\ub098\uc9c0 \uc54a\ub294\ub2e4.<br \/>\n\uc774\ub7f0 \uba54\ucee4\ub2c8\uc998\uc740 \ub85c\uc6b0\ub808\ubca8\uc5d0\uc11c \ud544\uc694\ud560\ub54c LiveData\ub97c \uc0dd\uc131\ud558\uace0 \ub4a4\ub2a6\uac8c(lazily) \uacc4\uc0b0\ub418\uc5b4\uc9c0\ub294\uac83\uc744 \ud5c8\uc6a9\ud558\uac8c \ub41c\ub2e4. ViewModel\uc740 \uc27d\uac8c LiveData\uc758 \uac1d\uccb4\ub97c \ucc38\uc870\ud558\uace0 \ubcc0\ud615\uaddc\uce59\uc744 \ucd5c\uc0c1\uc704\uc5d0\uc11c \uc815\uc758\ud560 \uc218 \uc788\ub2e4.<\/p>\n<h2>\uc0c8\ub85c\uc6b4 \ubcc0\ud615(Transformation) \uaddc\uce59 \uc0dd\uc131\ud558\uae30<\/h2>\n<p>\uc544\ub9c8 \uc571\uac1c\ubc1c\uc744 \ud558\ub2e4\ubcf4\uba74 \uc4f8\ub9cc\ud55c \ub2e4\uc591\ud55c \ubcc0\ud615\ud558\ub294 \ubc29\ubc95\uc774 \uc874\uc7ac\ud560 \uac83\uc774\ub2e4. \ud558\uc9c0\ub9cc \uadf8\ub7f0\uac83\ub4e4\uc774 \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ub418\ub294\uac83\ub4e4\uc774 \uc544\ub2d0\uc218\ub3c4 \uc788\ub2e4.<br \/>\n\uc790\uc2e0\ub9cc\uc758 \u00a0\ubcc0\ud615\uc744 \uad6c\ud604\ud558\ub824\uba74 MediatorLiveData\ub97c \uc774\uc6a9\ud558\uba74\ub41c\ub2e4. MediatorLiveData\ub294 \ub2e4\ub978 LiveData\ubcc0\ud654\ub97c \uac10\uc9c0\ud558\uba70 \uadf8 \uc774\ubca4\ud2b8\ub4e4\uc744 \uc62c\ubc14\ub974\uac8c \uc804\ub2ec\ud569\ub2c8\ub2e4.<\/p>\n<h1>\uc5ec\ub7ec\uac1c\uc758 LiveData \uc18c\uc2a4\ub97c \ud569\uce58\uae30<\/h1>\n<p>MediatorLiveData\ub294 LiveData\uc758 subclass\ub85c\uc11c \ubcf5\uc218\uac1c\uc758 LiveData\ub97c \ud569\uce60\uc218 \uc788\uac8c\ud55c\ub2e4.<br \/>\nMediatorLiveData\uc758 \uc635\uc800\ubc84\ub4e4\uc740 \uc5b8\uc81c\ub4e0\uc9c0 source\uac00 \ubcc0\uacbd\ub420\ub54c\ub9c8\ub2e4 \uc774\ubca4\ud2b8\uac00 \ud638\ucd9c\ub41c\ub2e4.<br \/>\n\uc608\ub97c \ub4e4\uba74 \ub9cc\uc57d UI\uc5d0 \uc788\ub294 LiveData\uac1d\uccb4\uac00 \ub124\ud2b8\uc6cc\ud06c\ub098 \ub610\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \uc5c5\ub370\uc774\ud2b8\uac00 \ub418\uba74, \uc544\ub9c8 MediatorLiveData\ub97c \uc0ac\uc6a9\ud574\ubcfc\uc218\ub3c4 \uc788\ub2e4.<br \/>\n\uc561\ud2f0\ube44\ud2f0\ub098 \ud504\ub808\uadf8\uba3c\ud2b8\uc5d0\uc11c \ud544\uc694\ud55c\uac74 \uc624\ub85c\uc9c0 MediatorLiveData\uc758 \uac10\uc9c0 \ubfd0\uc774\ub2e4. \uc774\ub97c\ud1b5\ud574 \uc5ec\ub7ec\uac1c\uc758 \uc18c\uc2a4\ub85c\ubd80\ud130 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uac10\uc9c0 \ud560 \uc218 \uc788\ub2e4.<br \/>\n\uc790\uc138\ud55c \uc0ac\ud56d\uc740\u00a0<a href=\"https:\/\/developer.android.com\/jetpack\/docs\/guide#addendum\">https:\/\/developer.android.com\/jetpack\/docs\/guide#addendum<\/a>\u00a0\uc774 \uc139\uc158\uc744 \ud655\uc778\ud574\ubcf4\ub3c4\ub85d \ud558\uc790.<\/p>\n<h2>Snackbar\uc640 \ud568\uaed8 LiveData\uc0ac\uc6a9\ud558\uae30<\/h2>\n<p><a href=\"https:\/\/medium.com\/google-developers\/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150\">https:\/\/medium.com\/google-developers\/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uac1c\uc694 LiveData\u00a0\ub294 Data\uc758 \ubcc0\uacbd\uc744 \uad00\uce21\ud560 \uc218 \uc788\ub294 Data Holder \ud074\ub798\uc2a4 \uc785\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc778 Observable\uacfc\ub294 \ub2e4\ub974\uac8c LiveData\ub294 \uc0dd\uba85\uc8fc\uae30\ub97c \uc54c\uace0 \uc788\uc2b5\ub2c8\ub2e4.(Lifecycle-Aware) \uc561\ud2f0\ube44\ud2f0\ub098, \ud504\ub808\uadf8\uba3c\ud2b8, \uc11c\ube44\uc2a4 \ub4f1\uacfc \uac19\uc740 \ucef4\ud3ec\ub10c\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30(Lifecycle)\ub97c \uc874\uc911\ud558\uace0 \uadf8\uc5d0\ub530\ub77c LiveData\ub294 \ud65c\uc131\uc0c1\ud0dc(active)\uc77c\ub54c\ub9cc \ub370\uc774\ud130\ub97c \uc5c5\ub370\uc774\ud2b8 \ud569\ub2c8\ub2e4. \ud65c\uc131\uc0c1\ud0dc\ub780\u00a0STARTED \ub610\ub294 RESUMED\ub97c \uc758\ubbf8\ud569\ub2c8\ub2e4. Lifecycle State CREATED Created state for a LifecycleOwner. DESTROYED Destroyed state for a LifecycleOwner. [&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\/363"}],"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=363"}],"version-history":[{"count":0,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/363\/revisions"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}