{"id":44568,"date":"2020-10-19T11:02:28","date_gmt":"2020-10-19T02:02:28","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=44568"},"modified":"2020-10-19T11:02:28","modified_gmt":"2020-10-19T02:02:28","slug":"%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c-paging3-%ec%bb%b4%ed%8f%ac%eb%84%8c%ed%8a%b8-%ec%a0%95%eb%b3%b5%ed%95%98%ea%b8%b0-part2-%eb%84%a4%ed%8a%b8%ec%9b%8c%ed%81%ac%ec%97%90%ec%84%9c%ec%9d%98","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=44568","title":{"rendered":"\uc548\ub4dc\ub85c\uc774\ub4dc Paging3 \ucef4\ud3ec\ub10c\ud2b8 \uc815\ubcf5\ud558\uae30 &#8211; Part2 (\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c\uc758 \ud398\uc774\uc9d5\uacfc \ub85c\uceec \ub370\uc774\ud130 \uce90\uc2f1)"},"content":{"rendered":"<h1>\uc548\ub4dc\ub85c\uc774\ub4dc Paging3 \ucef4\ud3ec\ub10c\ud2b8 \uc815\ubcf5\ud558\uae30 &#8211; Part2<\/h1>\n<p><a href=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-paging-data-with-paging-3.0-v03.png\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-paging-data-with-paging-3.0-v03.png\" alt=\"\" width=\"1024\" height=\"512\" class=\"aligncenter size-full wp-image-44565\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-paging-data-with-paging-3.0-v03.png 1024w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-paging-data-with-paging-3.0-v03-300x150.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-paging-data-with-paging-3.0-v03-768x384.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a>\uc9c0\ub09c <a href=\"https:\/\/www.charlezz.com\/?p=44562\">Part1<\/a> \uc5d0\uc11c\ub294 Paging3 \uc804\ubc18\uc801\uc778 \ub0b4\uc6a9\uacfc PagingSource\ub97c \ud1b5\ud574 \ub124\ud2b8\uc6cc\ud06c\ub85c\ubd80\ud130 \ud398\uc774\uc9d5 \ub41c \ub370\uc774\ud130\ub97c \ub85c\ub4dc\ud558\uace0 \ud654\uba74\uc5d0 \ub098\ud0c0\ub0b4\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \uc0b4\ud3b4\ubcf4\uc558\ub2e4.<\/p>\n<p>\uc774\ubc88 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uc624\ud504\ub77c\uc778 \uc0c1\ud0dc \ub610\ub294 \ucee4\ub125\uc158\uc774 \ubd88\uc548\uc815\ud55c \uc0c1\ud0dc\uc5d0\uc11c\ub3c4 \uc571 \uc0ac\uc6a9\uc131\uc744 \ubcf4\uc7a5\ud558\uc5ec \ud5a5\uc0c1\ub41c \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uc81c\uacf5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf8\ub2e4. \ud398\uc774\uc9d5\uc744 \ud558\ub294 \ubc29\ubc95\uc740 \ub124\ud2b8\uc6cc\ud06c\uc640 \ub85c\uceec \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \ub3d9\uc2dc\uc5d0 \ud398\uc774\uc9d5\uc744 \ud558\ub294 \uac83\uc774\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \uc571\uc774 \ub85c\uceec \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uce90\uc2dc\uc5d0\uc11c \uc9c1\uc811 \ub370\uc774\ud130\ub97c \ub85c\ub4dc\ud558\uace0, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub354 \uc774\uc0c1 \ub370\uc774\ud130\uac00 \uc5c6\uc744 \ub54c\ub9cc \ub124\ud2b8\uc6cc\ud06c\uc5d0 \ub370\uc774\ud130\ub97c \uc694\uccad\ud558\uac8c \ub41c\ub2e4.<\/p>\n<h2>\uae30\ubcf8\uc801\uc778 \uc0ac\uc6a9\ubc29\ubc95<\/h2>\n<p><span>\uc571\uc774 \ub124\ud2b8\uc6cc\ud06c \ub370\uc774\ud130 \uc18c\uc2a4\ub85c\ubd80\ud130 Post \uc544\uc774\ud15c\ub4e4\uc744 \ud398\uc774\uc9d5\uc73c\ub85c \ub85c\ub4dc\ud558\uc5ec Room \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub85c\uceec \uce90\uc2dc\ub85c \uc800\uc7a5\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uc790. \ub2e4\uc74c \ub098\uc62c \uadf8\ub9bc\uc740 RemoteMediator\uc640 PagingSource\uac00 \uc774 \uc720\uc988\ucf00\uc774\uc2a4\ub97c \ucda9\uc871\ud558\uae30 \uc704\ud574 \ud568\uaed8 \uc791\ub3d9\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc900\ub2e4.<\/span><\/p>\n<p><span><a href=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-part2-paging3-layered-architecture.png\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-part2-paging3-layered-architecture.png\" alt=\"\" width=\"744\" height=\"420\" class=\"aligncenter size-full wp-image-44574\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-part2-paging3-layered-architecture.png 744w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-part2-paging3-layered-architecture-300x169.png 300w\" sizes=\"(max-width: 744px) 100vw, 744px\" \/><\/a>RemoteMediator\ub294 \ud398\uc774\uc9d5 \ub41c \ub370\uc774\ud130\ub4e4\uc744 \ub124\ud2b8\uc6cc\ud06c\ub85c\ubd80\ud130 \uac00\uc838\uc640 \ub85c\uceec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub294 \uac83\uc744 \uad00\ub9ac\ud55c\ub2e4. \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ubd88\ub7ec\uc628 \ub370\uc774\ud130\ub97c \ub85c\ub4dc\ud558\uc5ec \uc9c1\uc811\uc801\uc73c\ub85c UI\uc5d0 \ub098\ud0c0\ub0b4\uc9c0 \uc54a\uc73c\uba70, \uc571\uc740 \ub85c\uceec \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c <a href=\"https:\/\/developer.android.com\/jetpack\/guide#truth\">\ub2e8\uc77c \uc18c\uc2a4 \uc800\uc7a5\uc18c<\/a>\ub85c \uc0ac\uc6a9\ud55c\ub2e4. (\uc608\ub97c \ub4e4\uc5b4, Room\uc5d0 \uc758\ud574 \uc0dd\uc131\ub41c) PagingSource \uad6c\ud604\uc740 \ub85c\uceec \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \uce90\uc2dc\ub41c \ub370\uc774\ud130\ub97c \ubd88\ub7ec\uc640 UI\uc5d0 \ud45c\ud604\ud558\ub294 \uac83\uc744 \ub2f4\ub2f9\ud55c\ub2e4.<br \/>\n<\/span><\/p>\n<h3>Room entity \uc0dd\uc131\ud558\uae30<\/h3>\n<p>\uac00\uc7a5 \uba3c\uc800 \ud574\uc57c\ud560 \uc77c\uc740 Room \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \ub370\uc774\ud130 \uc18c\uc2a4\ub85c \ubd80\ud130 \uc5bb\uc740 \ud398\uc774\uc9d5 \ub41c \ub370\uc774\ud130\ub97c \ub85c\uceec \uce90\uc2dc\ub85c \uac16\ub3c4\ub85d \ud558\ub294 \uac83\uc774\ub2e4.\u00a0<\/p>\n<p>Room\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/developer.android.com\/training\/data-storage\/room\">\uacf5\uc2dd \ubb38\uc11c<\/a>\ub97c \ud655\uc778\ud558\uc790<\/p>\n<p>\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc0dd\uc131\ud588\ub2e4\uba74, Room\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 Entity\ub97c \uad6c\uc131\ud558\ub294 \uac83\uc778\ub370 \ub2e4\uc74c\uacfc \uac19\uc774 Long \ud0c0\uc785\uc758 id\ub97c \uae30\ubcf8\ud0a4\ub85c \uac16\ub3c4\ub85d \uc124\uc815\ud588\ub2e4.<\/p>\n<pre class=\"lang: decode:true\">@Entity\r\ndata class Post(\r\n        @PrimaryKey val id: Long,\r\n        val date: String,\r\n        val link: String,\r\n        val title: String,\r\n        val content: String,\r\n        val excerpt: String,\r\n        val categories: List&lt;Int&gt;,\r\n        val author: Int\r\n)<\/pre>\n<p>\uadf8\ub9ac\uace0 Room \uc5b4\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc11c\uc5d0 \uc758\ud574 \uc0dd\uc131\ub418\ub294 PagingSource\uc640 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud398\uc774\uc9d5 \ub41c \ub370\uc774\ud130\ub97c \ucffc\ub9ac\ud558\uae30 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc774 DAO(Data Access Object)\ub97c \uc815\uc758\ud588\ub2e4.<\/p>\n<pre class=\"lang: decode:true\">@Dao\r\ninterface PostDao{\r\n\r\n    \/\/\uc804\uccb4 Post \ubaa9\ub85d\uc744 PagingSource\ub85c \uac00\uc838\uc628\ub2e4.\r\n    @Query(\"SELECT * FROM post ORDER BY date DESC\")\r\n    fun getPosts(): PagingSource&lt;Int, Post&gt;\r\n\r\n    \/\/\uac00\uc7a5 \ucd5c\uadfc Post\ub97c \ud558\ub098 \uac00\uc838\uc628\ub2e4.\r\n    @Query(\"SELECT * FROM post ORDER BY date DESC LIMIT 1\")\r\n    fun getLatestPost(): Post?\r\n\r\n    \/\/\uac00\uc7a5 \uc624\ub798 \ub41c Post\ub97c \ud558\ub098 \uac00\uc838\uc628\ub2e4.\r\n    @Query(\"SELECT * FROM post ORDER BY date ASC LIMIT 1\")\r\n    fun getEarliestPost(): Post?\r\n\r\n    \/\/Post \ubaa9\ub85d \uc0bd\uc785\r\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\r\n    fun insertAll(posts : List&lt;Post&gt;)\r\n\r\n    \/\/ Post \ub370\uc774\ud130 \uc804\uccb4 \uc0ad\uc81c\r\n    @Query(\"DELETE FROM post\")\r\n    fun deleteAll()\r\n\r\n}<\/pre>\n<h3>RemoteMediator \uad6c\ud604\ud558\uae30<\/h3>\n<p>RemoteMediator \ub294 PagingSource \uad6c\uc131\uc694\uc18c\uc640 \uc720\uc0ac\ud558\ub2e4. RemoteMediator\ub294 load() \uba54\uc11c\ub4dc\ub97c \uac00\uc9c0\uace0 \uc788\uace0, \uc774\ub97c \ubc18\ub4dc\uc2dc \uc7ac\uc815\uc758 \ud558\uc5ec \uc5b4\ub5bb\uac8c \ub370\uc774\ud130\ub97c \ub85c\ub529\ud560 \uac83\uc778\uc9c0 \uc815\uc758\ud574\uc57c \ud55c\ub2e4. \ub2e8\uc9c0 \ucc28\uc774\uc810\uc740 \ud398\uc774\uc9d5\ub41c \ub370\uc774\ud130\ub97c \ub370\uc774\ud130\uc18c\uc2a4\ub85c \ubd80\ud130 \uac00\uc838\uc640 RecyclerView\uc5d0 \ub85c\ub529\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, RemoteMediator \uac1d\uccb4\uac00 \ud398\uc774\uc9d5 \ub41c \ub370\uc774\ud130\ub97c \ub124\ud2b8\uc6cc\ud06c \ub370\uc774\ud130 \uc18c\uc2a4\ub85c \ubd80\ud130 \ubd88\ub7ec\uc624\uace0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud55c\ub2e4\ub294 \uc810\uc774\ub2e4. \uc55e\uc5d0\uc11c \ub098\uc628 \uadf8\ub9bc\uc744 \ucc38\uc870\ud558\uc5ec \uc774 \uc810\uc744 \uaf2d \uba85\uc2ec\ud558\uc790.<\/p>\n<p>\ub2e4\uc74c \ub098\uc62c \uc608\uc81c\uc758 RemoteMediator\uc758 \uad6c\ud604\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 2\uac00\uc9c0 \ub9e4\uac1c\ubcc0\uc218\ub97c \ud3ec\ud568\ud558\uace0 \uc788\ub2e4.<\/p>\n<ul>\n<li>db: \ub85c\uceec \uce90\uc2dc\ub85c \uc0ac\uc6a9\ud560 Room \ub370\uc774\ud130 \uac1d\uccb4<\/li>\n<li>api: \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\ub97c \uc704\ud55c API \uc778\uc2a4\ud134\uc2a4 (Retrofit service)<\/li>\n<\/ul>\n<p>Note:\ub9cc\uc57d query\uac00 \ud544\uc694\ud558\ub2e4\uba74 \ubb38\uc790\uc5f4 \ubc0f \uc22b\uc790\ub97c \ub9e4\uac1c\ubcc0\uc218\ub85c \ucd94\uac00\ud560 \uc218\ub3c4 \uc788\uc9c0\ub9cc, \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 db\uc640 api\ub9cc \ub2e4\ub8ec\ub2e4.<\/p>\n<p>RemoteMediator&lt;Key, Value&gt; \uad6c\ud604\uc744 \uc0dd\uc131\ud55c\ub2e4. Key \ud0c0\uc785\uacfc Value \ud0c0\uc785\uc740 \ubc18\ub4dc\uc2dc PagingSource\uc5d0\uc11c \uc815\uc758\ud55c \ub0b4\uc6a9\uacfc \uac19\uc544\uc57c\ud55c\ub2e4.(PostDao#getPosts \ud655\uc778)<\/p>\n<pre class=\"lang: decode:true\">@OptIn(ExperimentalPagingApi::class)\r\nclass PostRemoteMediator(\r\n        private val db: AppDatabase,\r\n        private val api: PostService\r\n) : RemoteMediator&lt;Int, Post&gt;() {\r\n\r\n    override suspend fun load(loadType: LoadType, state: PagingState&lt;Int, Post&gt;): MediatorResult {\r\n        ...\r\n    }\r\n    ...\r\n}<\/pre>\n<p><a href=\"https:\/\/github.com\/Charlezz\/FinalArchitecture\/blob\/master\/app\/src\/main\/java\/com\/charlezz\/android\/feature\/post\/PostRemoteMediator.kt\">PostRemoteMediator \uc804\uccb4 \uc18c\uc2a4 \ucf54\ub4dc<\/a><\/p>\n<p>load() \uba54\uc11c\ub4dc\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uac31\uc2e0\ud558\uace0 PagingSource\ub97c \ubb34\ud6a8\ud654(invalidating)\ud558\ub294 \ucc45\uc784\uc774 \uc788\ub2e4. Room\uacfc \uac19\uc740 Paging3\ub97c \uc9c0\uc6d0\ud558\ub294 \uba87\uac00\uc9c0 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \uc790\ub3d9\uc801\uc73c\ub85c PagingSource \uac1d\uccb4\ub97c \ubb34\ud6a8\ud654\ud558\ub294 \uad6c\ud604\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n<p>load() \uba54\uc11c\ub4dc\ub294 \ub2e4\uc74c \ub450\uac00\uc9c0 \ub9e4\uac1c\ubcc0\uc218\ub97c \ucde8\ud55c\ub2e4<\/p>\n<ul>\n<li>LoadType: REFRESH, APPEND \ub610\ub294 PREPEND \uac19\uc740 \ub85c\ub4dc \uc720\ud615\uc744 \uc54c\ub824\uc900\ub2e4.<\/li>\n<li>PagingState: \uc9c0\uae08\uae4c\uc9c0 \ub85c\ub529 \ub41c \ud398\uc774\uc9c0\ub4e4\uc5d0 \ub300\ud55c \uc815\ubcf4, \uac00\uc7a5 \ucd5c\uadfc\uc5d0 \uc5d1\uc138\uc2a4\ud55c \uc778\ub371\uc2a4 \uadf8\ub9ac\uace0 \ud398\uc774\uc9d5 \uc2a4\ud2b8\ub9bc\uc744 \ucd08\uae30\ud654 \ud558\ub294\ub370 \uc0ac\uc6a9\ud588\uc5c8\ub358 PagingConfig\ub97c \ud3ec\ud568\ud55c\ub2e4.<\/li>\n<\/ul>\n<p>load() \uba54\uc11c\ub4dc\uc5d0\uc11c \ubc18\ud658\ub418\ub294 \uac12\uc740 MediatorResult \uac1d\uccb4\ub2e4. MediatorResult\ub294 MediatorResult.Error \uac70\ub098 MediatorResult.Success \ub458 \uc911 \ud558\ub098\ub2e4. MediatorResult.Error\ub294 \uc5d0\ub7ec \uc815\ubcf4\ub97c \ub2f4\uace0 \uc788\uace0, MediatorResult.Success\ub294 \ub85c\ub4dc\ud560 \ub370\uc774\ud130\uac00 \ub354 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ub098\ud0c0\ub0b4\ub294 \uc2e0\ud638\ub97c \ud3ec\ud568\ud55c\ub2e4.<\/p>\n<p>load() \uba54\uc11c\ub4dc\ub294 \ubc18\ub4dc\uc2dc \ub2e4\uc74c \ub2e8\uacc4\ub4e4\uc744 \uc218\ud589\ud574\uc57c \ud55c\ub2e4.<\/p>\n<ol>\n<li>load type \ubc0f \uc9c0\uae08\uae4c\uc9c0 \ub85c\ub4dc\ub41c \ub370\uc774\ud130\uc5d0 \uc758\uc874\ud558\uc5ec \ub124\ud2b8\uc6cc\ud06c\ub85c\ubd80\ud130 \uc5b4\ub5a4 \ud398\uc774\uc9c0\ub97c \ub85c\ub4dc \ud560 \uc9c0 \uacb0\uc815\ud55c\ub2e4.<\/li>\n<li>\ub124\ud2b8\uc6cc\ud06c \uc694\uccad\uc744 \ud2b8\ub9ac\uac70 \ud55c\ub2e4.<\/li>\n<li>\ub85c\ub4dc \uc791\uc5c5 \uacb0\uacfc\uc5d0 \ub530\ub77c \ub2e4\uc74c\uacfc \uac19\uc740 \uc561\uc158\uc744 \uc218\ud589\ud55c\ub2e4<br \/>\n&#8211; \ub85c\ub4dc\uac00 \uc131\uacf5\ud588\uace0 \ubc1b\uc740 \uc544\uc774\ud15c \ubaa9\ub85d\uc774 \ube44\uc5b4\uc788\uc9c0 \uc54a\ub2e4\uba74, \uc544\uc774\ud15c \ubaa9\ub85d\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\uace0 MediatorResult.Success(endOfPaginationReached = false)\ub97c \ubc18\ud658\ud55c\ub2e4.<br \/>\n&#8211; \ub85c\ub4dc\uac00 \uc131\uacf5\ud588\uace0 \ubc1b\uc740 \uc544\uc774\ud15c \ubaa9\ub85d\uc774 \ube44\uc5b4 \uc788\ub2e4\uba74, MediatorResult.Success(endOfPaginationReached = true)\ub97c \ubc18\ud658\ud55c\ub2e4.<br \/>\n&#8211; \ub9cc\uc57d \ub124\ud2b8\uc6cc\ud06c \uc694\uccad\uc73c\ub85c \uc778\ud574 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 MediatorResult.Error\ub97c \ubc18\ud658\ud55c\ub2e4.<\/li>\n<\/ol>\n<h3>Pager \uc0dd\uc131\ud558\uae30<\/h3>\n<p>\ub4dc\ub514\uc5b4 Pager \uc778\uc2a4\ud134\uc2a4\ub97c \ub9cc\ub4e4 \uc900\ube44\uac00 \ub418\uc5c8\ub2e4. Pager\ub97c \ud1b5\ud574 \ud398\uc774\uc9d5 \ub41c \ub370\uc774\ud130\ub97c \ubc1b\uc744 \uc218 \uc788\ub294 \uc2a4\ud2b8\ub9bc\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub2e4. Pager \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc740\u00a0<a href=\"https:\/\/www.charlezz.com\/?p=44562\">Part1<\/a>\uc5d0\uc11c \ub098\uc628 \ub124\ud2b8\uc6cc\ud06c \ub370\uc774\ud130 \uc18c\uc2a4\ub85c \ubd80\ud130 \uac04\ub2e8\ud788 Pager\ub97c \uc0dd\uc131\ud558\ub294 \ubc29\uc2dd\uacfc \ube44\uc2b7\ud558\uc9c0\ub9cc \ub450\uac00\uc9c0 \ub2e4\ub978 \uc810\uc774 \uc788\ub2e4.<\/p>\n<ul>\n<li>PagingSource \uc0dd\uc131\uc790\ub97c \uc9c1\uc811\uc801\uc73c\ub85c \uc804\ub2ec\ud558\ub294 \ub300\uc2e0\uc5d0, \ubc18\ub4dc\uc2dc DAO\ub85c \ubd80\ud130 PagingSource\ub97c \ubc18\ud658\ud558\ub294 query \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4.<\/li>\n<li>\ub9e4\uac1c\ubcc0\uc218 &#8220;remoteMediator&#8221;\ub85c RemoteMediator \uad6c\ud604 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4.<\/li>\n<\/ul>\n<pre class=\"lang: decode:true \">class PostRepository @Inject constructor(\r\n        private val db: AppDatabase,\r\n        private val api: PostService\r\n) {\r\n    fun getPosts(pageSize: Int) = Pager(\r\n            config = PagingConfig(pageSize = pageSize, enablePlaceholders = false),\r\n            remoteMediator = PostRemoteMediator(db, api)\r\n\r\n    ) {\r\n        db.postDao().getPosts()\r\n    }.flow\r\n\r\n}<\/pre>\n<h3>\uc0d8\ud50c \uc571 \ubc0f \uc18c\uc2a4\ucf54\ub4dc<\/h3>\n<p>\ucd5c\ub300\ud55c \uad6c\uae00\uc5d0\uc11c \uac00\uc774\ub4dc \ud558\ub294 \ubc29\uc2dd\ub300\ub85c Paging3 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uc0d8\ud50c \uc571\uc744 \ub9cc\ub4e4\uc5c8\ub2e4. \uc774 \uc571\uc740 \ucc30\uc2a4\uc758 \uc548\ub4dc\ub85c\uc774\ub4dc \ube14\ub85c\uadf8(https:\/\/charlezz.com)\uc758 \uac8c\uc2dc\ubb3c\uc744 \ud398\uc774\uc9d5\ud558\uc5ec \ubd88\ub7ec\uc640 \ubcf4\uc5ec\uc8fc\ub294 \ub2e8\uc21c\ud55c \uc571\uc774\ub2e4. Room\uacfc Paging3 \ub9cc\uc73c\ub85c \uac04\ub2e8\ud788 \ub9ac\uc18c\uc2a4\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uba70, \uc624\ud504\ub77c\uc778 \ubaa8\ub4dc\ub97c \uc9c0\uc6d0\ud558\ub294 \uc571\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc5b4\uc11c \ub180\ub77c\uc6e0\ub2e4.\u00a0<\/p>\n<p>\uc0d8\ud50c \uc571\uc740 \uad6c\uae00 \ud50c\ub808\uc774\uc2a4\ud1a0\uc5b4\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc \ud560 \uc218 \uc788\uc73c\uba70, \uc18c\uc2a4\ucf54\ub4dc\ub294 <a href=\"https:\/\/github.com\/Charlezz\/FinalArchitecture\">github<\/a> \uc5d0\uc11c \ud655\uc778 \uac00\ub2a5\ud558\ub2e4.<br \/>\n<a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.charlezz.android\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-part2-ko-badge-web-generic-300x116.png\" alt=\"\" width=\"300\" height=\"116\" class=\"alignleft wp-image-44576 size-medium\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-part2-ko-badge-web-generic-300x116.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2020\/10\/www.charlezz.com-paging3-part2-ko-badge-web-generic.png 646w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc548\ub4dc\ub85c\uc774\ub4dc Paging3 \ucef4\ud3ec\ub10c\ud2b8 \uc815\ubcf5\ud558\uae30 &#8211; Part2 \uc9c0\ub09c Part1 \uc5d0\uc11c\ub294 Paging3 \uc804\ubc18\uc801\uc778 \ub0b4\uc6a9\uacfc PagingSource\ub97c \ud1b5\ud574 \ub124\ud2b8\uc6cc\ud06c\ub85c\ubd80\ud130 \ud398\uc774\uc9d5 \ub41c \ub370\uc774\ud130\ub97c \ub85c\ub4dc\ud558\uace0 \ud654\uba74\uc5d0 \ub098\ud0c0\ub0b4\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \uc0b4\ud3b4\ubcf4\uc558\ub2e4. \uc774\ubc88 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uc624\ud504\ub77c\uc778 \uc0c1\ud0dc \ub610\ub294 \ucee4\ub125\uc158\uc774 \ubd88\uc548\uc815\ud55c \uc0c1\ud0dc\uc5d0\uc11c\ub3c4 \uc571 \uc0ac\uc6a9\uc131\uc744 \ubcf4\uc7a5\ud558\uc5ec \ud5a5\uc0c1\ub41c \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uc81c\uacf5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf8\ub2e4. \ud398\uc774\uc9d5\uc744 \ud558\ub294 \ubc29\ubc95\uc740 \ub124\ud2b8\uc6cc\ud06c\uc640 \ub85c\uceec \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \ub3d9\uc2dc\uc5d0 \ud398\uc774\uc9d5\uc744 [&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\/44568"}],"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=44568"}],"version-history":[{"count":2,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/44568\/revisions"}],"predecessor-version":[{"id":44577,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/44568\/revisions\/44577"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=44568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=44568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=44568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}