{"id":2075,"date":"2015-12-16T01:04:39","date_gmt":"2015-12-16T01:04:39","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2075"},"modified":"2024-09-12T01:44:14","modified_gmt":"2024-09-12T08:44:14","slug":"display-sync-progress-indicator-ios","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/display-sync-progress-indicator-ios\/","title":{"rendered":"iOS \uc571\uc5d0\uc11c \ub3d9\uae30\ud654 \uc9c4\ud589\ub960 \ud45c\uc2dc\uae30 \ud45c\uc2dc\ud558\uae30"},"content":{"rendered":"<p><code>NSProgress<\/code>\u00a0\ub294 Foundation\uc5d0\uc11c \uc5b4\ub5a4 \uc791\uc5c5\uc758 \uc644\ub8cc\ub97c \ub098\ud0c0\ub0b4\ub294 \uac1d\uccb4\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc791\uc5c5\uc740 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc, \uc571 \uc124\uce58 \ub610\ub294 \uc790\uccb4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc218\ud589\ud558\ub294 \uc791\uc5c5\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub9ac\uace0 <code>NSProgress<\/code> \ub294 UI\uc640 \uc2dc\uc2a4\ud15c \ubaa8\ub450\uc5d0\uc11c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ub2e4\uc591\ud55c \uad6c\uc131 \uc694\uc18c\uc5d0 \ub300\ud55c \uc9c4\ud589 \uc0c1\ud669\uc744 \uc27d\uac8c \ubcf4\uace0\ud560 \uc218 \uc788\ub3c4\ub85d \uc874\uc7ac\ud569\ub2c8\ub2e4. Couchbase Mobile\uc744 \uc0ac\uc6a9\ud558\uba74 \ubcf5\uc81c\ub97c \uc2dc\uc791\ud558\uc5ec \ub370\uc774\ud130\ub97c \uad50\ud658\ud558\uace0 \uc9c4\ud589 \uc0c1\ud669\uc744 \uc54c\ub824\uc8fc\ub294 \ubcc0\uacbd \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \ub370\uc774\ud130\ub97c \uad50\ud658\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c\ub294 Google Places API\uc5d0\uc11c \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\ub85c \ub370\uc774\ud130\ub97c \uac00\uc838\uc640\uc11c iOS \uc571\uc5d0 \ubcf5\uc81c\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubd05\ub2c8\ub2e4.<\/p>\n<p>&gt; <a href=\"https:\/\/developers.google.com\/places\/\" data-cke-saved-href=\"https:\/\/developers.google.com\/places\/\">https:\/\/developers.google.com\/places\/<\/a><\/p>\n<p>\uadf8 \uacfc\uc815\uc5d0\uc11c \ubc29\ubc95\uc744 \ubc30\uc6b0\uac8c \ub429\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774 \uad00\ub9ac\uc790 REST API\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc678\ubd80 \uc18c\uc2a4\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>iOS SDK\ub85c \ud480 \ubcf5\uc81c\ub97c \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<li>\ubcf5\uc81c \ubcc0\uacbd \uc54c\ub9bc\uc744 \uc0ac\uc6a9\ud558\uc5ec UI\uc5d0 \uc9c4\ud589\ub960 \ud45c\uc2dc\uc904\uc744 \ud45c\uc2dc\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uc2dc\uc791\ud574\ubcf4\uc790!<\/p>\n<h2>\uc2dc\uc791\ud558\uae30<\/h2>\n<p>\uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c Google Places API\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 Google \uac1c\ubc1c\uc790 \ucf58\uc194\uc5d0\uc11c \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e0 \ub2e4\uc74c \uc11c\ubc84 API \ud0a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>Google \uac1c\ubc1c\uc790 \ucf58\uc194\uc744 \uc5f4\uace0 \uacc4\uc815\uc5d0 \ub85c\uadf8\uc778\ud569\ub2c8\ub2e4:<\/p>\n<p>&gt;\u00a0<a href=\"https:\/\/console.developers.google.com\/\" data-cke-saved-href=\"https:\/\/console.developers.google.com\">https:\/\/console.developers.google.com<\/a><\/p>\n<p>\ub77c\ub294 \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. <strong>\ub3c4\uc2dc \ud0d0\uc0c9\uae30<\/strong>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10371\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/create_app.gif\" alt=\"\" width=\"596\" height=\"540\" \/><br \/>\n\uc0c8 \ud504\ub85c\uc81d\ud2b8\uac00 \ubaa9\ub85d\uc5d0 \ub098\ud0c0\ub098\uba74 \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8\ub97c \ud074\ub9ad\ud558\uace0 \ub2e4\uc74c\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. <strong>API \ubc0f \uc778\uc99d &gt; API<\/strong>\u00a0\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. \uc67c\ucabd \ud0d0\uc0c9 \uba54\ub274\uc5d0\uc11c <strong>Google Places API \uc6f9 \uc11c\ube44\uc2a4<\/strong>.<\/p>\n<p>\ud65c\uc131\ud654\ub418\uba74 <strong>\uc790\uaca9 \uc99d\uba85<\/strong>\u00a0\ud0ed\uc5d0\uc11c \uc0c8 \ud0a4(\uc11c\ubc84 \ud0a4)\ub97c \uc0dd\uc131\ud558\uace0 \uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \ud544\uc694\ud55c API \ud0a4\ub97c \ubcf5\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \uc139\uc158\uc5d0\uc11c\ub294 \uba87 \uac00\uc9c0 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc640 \uad00\ub9ac\uc790 REST API\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc7a5\uc18c \ub370\uc774\ud130\ub97c \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0 \ub3d9\uae30\ud654\ud569\ub2c8\ub2e4.<\/p>\n<h2>\ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774<\/h2>\n<p>\ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\uace0 \ud30c\uc77c\uc758 \uc555\ucd95\uc744 \ud489\ub2c8\ub2e4:<\/p>\n<p>&gt; <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/nosql-databases\/downloads\/#Couchbase\\_Mobile\" data-cke-saved-href=\"https:\/\/www.couchbase.com\/nosql-databases\/downloads#Couchbase\\_Mobile\">https:\/\/www.couchbase.com\/nosql-databases\/downloads#Couchbase\\_Mobile<\/a><\/p>\n<p>\ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774 \ubc14\uc774\ub108\ub9ac\ub294 \ub2e4\uc74c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>bin<\/strong>\u00a0\ud3f4\ub354\uc5d0 \uc788\ub294 \uad6c\uc131 \ud30c\uc77c\uc758 \uc608\uc640 <strong>\uc608\uc81c<\/strong>\u00a0\ud3f4\ub354\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. \ud3f4\ub354\ub97c \ubcf5\uc0ac\ud569\ub2c8\ub2e4. <strong>basic-walrus-bucket.json<\/strong>\u00a0\ud30c\uc77c\uc744 \ud504\ub85c\uc81d\ud2b8\uc758 \ub8e8\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"whitespace-before:1 whitespace-after:1 lang:default decode:true\">$ cp \/Downloads\/couchbase-sync-gateway\/examples\/basic-walrus-bucket.json \/path\/to\/proj\/sync-gateway-config.json<\/pre>\n<p>\ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc2dc\uc791\ud569\ub2c8\ub2e4:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"9\">\n<pre data-cke-widget-data=\"%7B%22lang%22%3A%22bash%22%2C%22code%22%3A%22%5Cn%24%20~%2FDownloads%2Fcouchbase-sync-gateway%2Fbin%2Fsync_gateway%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"language-bash hljs\">\r\n$ ~\/Downloads\/couchbase-sync-gateway\/bin\/sync_gateway\r\n<\/code><\/pre>\n<\/div>\n<p>\uad00\ub9ac \ub300\uc2dc\ubcf4\ub4dc\ub97c \uc5f4\uc5b4 \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0 \uc800\uc7a5\ub41c \ubb38\uc11c\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud569\ub2c8\ub2e4.<\/p>\n<p>&gt;\u00a0<a href=\"https:\/\/localhost:4985\/_admin\/\" data-cke-saved-href=\"https:\/\/localhost:4985\/_admin\/\">https:\/\/localhost:4985\/_admin\/<\/a><\/p>\n<p>\ub2e4\uc74c \uc139\uc158\uc5d0\uc11c\ub294 \uc7a5\uc18c \ub370\uc774\ud130\ub97c \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\ub85c \uac00\uc838\uc624\uae30 \uc704\ud574 RxJS \ubc0f \uc694\uccad \ubaa8\ub4c8\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc791\uc740 NodeJS \uc571\uc744 \uc791\uc131\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uc7a5\uc18c API \u2192 \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774<\/h2>\n<p>\uc571 \uc11c\ubc84 \uc2a4\ud06c\ub9bd\ud305\uc744 \uc2dc\uc791\ud558\uae30 \uc804\uc5d0 API \ud0a4\uac00 \uc62c\ubc14\ub974\uac8c \uc791\ub3d9\ud558\ub294\uc9c0 \ud655\uc778\ud558\uace0 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ub2e4\uc74c URL\uc744 \uc5f4\uba74 JSON \uc751\ub2f5\uc774 \ud45c\uc2dc\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>&gt; https:\/\/maps.googleapis.com\/maps\/api\/place\/textsearch\/json?query=restaurants+in+London&amp;key=API_KEY<\/p>\n<p><strong>\ucc38\uace0<\/strong>: URL\uc5d0 API \ud0a4\ub97c \ucd94\uac00\ud558\ub294 \uac83\uc744 \uc78a\uc9c0 \ub9c8\uc138\uc694.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-10372\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/diagram-1024x501.png\" alt=\"\" width=\"900\" height=\"440\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/diagram-1024x501.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/diagram-300x147.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/diagram-768x376.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/diagram-1536x752.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/diagram-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/diagram-1320x646.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/diagram.png 1600w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Places API\uc5d0\uc11c \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\ub85c \ub370\uc774\ud130\ub97c \uac00\uc838\uc62c \uc571 \uc11c\ubc84\ub97c \uad6c\ucd95\ud558\ub824\uba74 \ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/Reactive-Extensions\/RxJS\" data-cke-saved-href=\"https:\/\/github.com\/Reactive-Extensions\/RxJS\">RxJS<\/a>\u00a0\uadf8\ub9ac\uace0 <a href=\"https:\/\/github.com\/request\/request\" data-cke-saved-href=\"https:\/\/github.com\/request\/request\">\uc694\uccad<\/a>. \ub458 \uc774\uc0c1\uc758 \uc774\ubca4\ud2b8 \ub610\ub294 \ube44\ub3d9\uae30 \uc5f0\uc0b0\uc744 \ucc98\ub9ac\ud558\ub294 \ucf54\ub4dc\ub294 \ube60\ub974\uac8c \ubcf5\uc7a1\ud574\uc9d1\ub2c8\ub2e4. RxJS\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uacc4\uc0b0\uc744 \uc218\ud589\ud569\ub2c8\ub2e4. <em>\uc77c\ub4f1\uc11d \uc2dc\ubbfc<\/em>\u00a0\uc774\ub7ec\ud55c \ube44\ub3d9\uae30 \uc5f0\uc0b0\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\ub294 \uc77d\uae30 \ubc0f \ucef4\ud3ec\uc800\ube14 API\ub97c \ud5c8\uc6a9\ud558\ub294 \ubaa8\ub378\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. Request \ubaa8\ub4c8\uc740 NodeJS\uc5d0\uc11c http \uc694\uccad\uc744 \uadf8 \uc5b4\ub290 \ub54c\ubcf4\ub2e4 \uac04\ub2e8\ud558\uac8c \ub9cc\ub4dc\ub294 \uc0ac\uc2e4\uc0c1\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4. \uacc4\uc18d\ud574\uc11c \uc885\uc18d \uc694\uc18c\ub97c \uc124\uce58\ud558\uc138\uc694:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"8\">\n<pre data-cke-widget-data=\"%7B%22lang%22%3A%22bash%22%2C%22code%22%3A%22%5Cn%24%20npm%20install%20request%20rx%20--save%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"language-bash hljs\">\r\n$ npm install request rx --save\r\n<\/code><\/pre>\n<\/div>\n<p>\ubcf5\uc0ac <strong>requestRx.js<\/strong>\u00a0\uc5d0\uc11c <a href=\"https:\/\/github.com\/couchbaselabs\/Couchbase-by-Example\/blob\/master\/04-ios-sync-progress-indicator\/requestRx.js\" data-cke-saved-href=\"https:\/\/github.com\/couchbaselabs\/Couchbase-by-Example\/blob\/master\/04-ios-sync-progress-indicator\/requestRx.js\">GitHub \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac<\/a>\u00a0to your project folder. We\u2019re simply wrapping the Request api in RxJS constructs (flatMap, filter, subscribe&#8230;). For example, instead of using `request.get`, you will use `requestRx.get`.<\/p>\n<p>\ub77c\ub294 \uc0c8 \ud30c\uc77c\uc744 \ub9cc\ub4ed\ub2c8\ub2e4. <strong>sync.js<\/strong>\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 <code>\uc694\uccadRx<\/code> \uadf8\ub9ac\uace0 <code>Rx<\/code> \ubaa8\ub4c8\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uba87 \uac00\uc9c0 \uc0c1\uc218\ub97c \uc815\uc758\ud569\ub2c8\ub2e4:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"7\">\n<pre data-cke-widget-data=\"%7B%22lang%22%3A%22javascript%22%2C%22code%22%3A%22%5Cn%20%20%20%20const%20api_key%20%3D%20'AIzaSyBGRQzQ2Sy1zgIrMrbYUknd1L25idYOoII'%3B%5Cn%20%20%20%20const%20url%20%3D%20'https%3A%2F%2Fmaps.googleapis.com%2Fmaps%2Fapi%2Fplace'%3B%5Cn%20%20%20%20const%20gateway%20%3D%20'http%3A%2F%2Flocalhost%3A4985%2Fdb'%3B%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"language-javascript hljs\">\r\n    const api_key = 'AIzaSyBGRQzQ2Sy1zgIrMrbYUknd1L25idYOoII';\r\n    const url = 'https:\/\/maps.googleapis.com\/maps\/api\/place';\r\n    const gateway = 'https:\/\/localhost:4985\/db';\r\n<\/code><\/pre>\n<\/div>\n<p><strong>\ucc38\uace0<\/strong>: \ud504\ub85c\uadf8\ub7a8\uc744 \ub354 \uc9e7\uace0 \uac00\ub3c5\uc131 \uc788\uac8c \ub9cc\ub4dc\ub294 JavaScript ES 6 \uad6c\ubb38(\ubcf4\ub2e4 \uad6c\uccb4\uc801\uc73c\ub85c \ubb38\uc790\uc5f4 \ubcf4\uac04 \ubc0f \ud654\uc0b4\ud45c \ud568\uc218)\uc744 \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7f0 \ub2e4\uc74c <code>\uc694\uccadRx<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc5d0 \uc124\uba85\ub41c \uc694\uccad \uccb4\uc778\uc744 \ub530\ub974\ub3c4\ub85d \ud569\ub2c8\ub2e4.<\/p>\n<p>\ubc18\uc751\ud615 \ud655\uc7a5 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uad81\uae08\ud558\ub2e4\uba74 \ub2e4\uc74c\uc744 \ub530\ub974\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/reactive-extensions.github.io\/learnrx\/\" data-cke-saved-href=\"https:\/\/reactive-extensions.github.io\/learnrx\/\">\uc774 \ud29c\ud1a0\ub9ac\uc5bc<\/a>. \uc644\ub8cc\ud558\ub294 \ub370 \uba87 \uc2dc\uac04\uc774 \uac78\ub9ac\uc9c0\ub9cc \ubc18\uc751\ud615 \ud655\uc7a5\uc5d0 \ub300\ud574 \ub9e4\uc6b0 \uba85\ud655\ud558\uac8c \uc774\ud574\ud558\uac8c \ub420 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ubc1b\uc544\ub4e4\uc774\ub294 \uac83\uc774 \ub9ce\uc744 \uc218 \uc788\uc9c0\ub9cc \ub2e4\uc591\ud55c \uc5f0\uc0b0\uc790(flatMap, zip, subscribe, fromArray)\ub97c \uc2e4\ud5d8\ud574 \ubcf4\ub294 \uac83\uc774 \uac00\uc7a5 \uc88b\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"whitespace-after:1 lang:default decode:true\">\/\/ 1. Search for Places\r\nrequestRx.get(`${url}\/textsearch\/json?key=${api_key}&amp;query=restaurants+in+london`)\r\n  .subscribe((res) =&gt; {\r\n      var places = JSON.parse(res.body).results;\r\n      var placesStream = Rx.Observable.fromArray(places);\r\n      \/\/ 2. Send the Places in bulk to Sync Gateway\r\n      requestRx({uri: `${gateway}\/_bulk_docs`, method: 'POST', json: {docs: places}})\r\n        .flatMap((docsRes) =&gt; {\r\n            var docsStream = Rx.Observable.fromArray(docsRes.body);\r\n            \/\/ Merge the place's photoreference with the doc id and rev\r\n            return Rx.Observable.zip(placesStream, docsStream, (place, doc) =&gt; {\r\n                return {\r\n                    id: doc.id,\r\n                    rev: doc.rev,\r\n                    ref: place.photos[0].photo_reference\r\n                }\r\n            });\r\n        })\r\n        .flatMap((doc) =&gt; {\r\n            \/\/ 3. Get the binary jpg photo using the ref property (i.e. photoreference)\r\n            var options = {\r\n                uri: `${url}\/photo?key=${api_key}&amp;maxwidth=400&amp;photoreference=${doc.ref}`,\r\n                encoding: null\r\n            };\r\n            return requestRx.get(options)\r\n              .flatMap((photo) =&gt; {\r\n                  \/\/ 4. Save the photo as an attachment on the corresponding document\r\n                  return requestRx({\r\n                      uri: `${gateway}\/${doc.id}\/photo?rev=${doc.rev}`,\r\n                      method: 'PUT',\r\n                      headers: {'Content-Type': 'image\/jpg'},\r\n                      body: photo.body\r\n                  })\r\n              })\r\n        })\r\n        .subscribe((res) =&gt; {\r\n        });\r\n  });<\/pre>\n<ol>\n<li>\uac80\uc0c9\uc5b4\uc640 \uc77c\uce58\ud558\ub294 \uc7a5\uc18c \uac00\uc838\uc624\uae30 <code>\ub7f0\ub358\uc758 \ub808\uc2a4\ud1a0\ub791<\/code>. URL\uc5d0\uc11c ES 6 \ubb38\uc790\uc5f4 \ubcf4\uac04 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uadf8\ub9ac\uace0 <code>_bulk_docs<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 \ub300\uc6a9\ub7c9 \ub370\uc774\ud130 \uc138\ud2b8\ub97c \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774 \uc778\uc2a4\ud134\uc2a4\ub85c \uac00\uc838\uc624\ub294 \ub370 \ub9e4\uc6b0 \ud3b8\ub9ac\ud569\ub2c8\ub2e4. \uc774\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/developer.couchbase.com\/mobile\/develop\/references\/sync-gateway\/rest-api\/database\/post-bulk-docs\/index.html\" data-cke-saved-href=\"https:\/\/developer.couchbase.com\/mobile\/develop\/references\/sync-gateway\/rest-api\/database\/post-bulk-docs\/index.html\">\ubb38\uc11c<\/a>.<\/li>\n<li>\ubb38\uc11c\ub97c \uc800\uc7a5\ud55c \ud6c4 \uc0ac\uc9c4\uc744 \ucca8\ubd80\ud30c\uc77c\ub85c \uc800\uc7a5\ud558\ub824\uba74 \uba3c\uc800 Places API\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uac00\uc838\uc640\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 <code>\uc778\ucf54\ub529<\/code> property is set to `null`. This is required by the Request module for any response body that isn\u2019t a string. Read more about it in the <a href=\"https:\/\/github.com\/request\/request#user-content-requestoptions-callback\" data-cke-saved-href=\"https:\/\/github.com\/request\/request#user-content-requestoptions-callback\">\ubb38\uc11c \uc694\uccad<\/a>.<\/li>\n<li>\ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0 \uc774 \ucca8\ubd80\ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \ubb38\uc11c(\ubb38\uc11c ID\ub97c \uc9c0\uc815\ud558\uc5ec)\uc640 \ud574\ub2f9 \ubb38\uc11c\uc758 \uc218\uc815\ubcf8(\uc218\uc815\ubcf8 \ubc88\ud638\ub97c \uc9c0\uc815\ud558\uc5ec)\uc744 \uc54c\ub824\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>JavaScript ES 6 \uad6c\ubb38\uc73c\ub85c \uc791\uc131\ub41c NodeJS \uc571\uc744 \uc2e4\ud589\ud558\ub824\uba74 \ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/babeljs.io\/\" data-cke-saved-href=\"https:\/\/babeljs.io\/\">\ubc14\ubca8<\/a>. \uc124\uce58\ud55c \ud6c4 <strong>sync.js<\/strong>\u00a0file:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"5\">\n<pre data-cke-widget-data=\"%7B%22lang%22%3A%22bash%22%2C%22code%22%3A%22%5Cn%20%20%20%20%24%20npm%20install%20babel%20-g%5Cn%20%20%20%20%24%20babel-node%20sync.js%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"language-bash hljs\">\r\n    $ npm install babel -g\r\n    $ babel-node sync.js\r\n\r\n<\/code><\/pre>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10373\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/sync_docs.gif\" alt=\"\" width=\"960\" height=\"528\" \/><\/p>\n<p>\uc774\uc81c \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\uc758 \uc778\uba54\ubaa8\ub9ac \ubc84\ud0b7\uc5d0 \uc774\ubbf8\uc9c0\ub97c \ud3ec\ud568\ud55c \ubb38\uc11c\uac00 \uc800\uc7a5\ub418\uc5c8\uc73c\ubbc0\ub85c \ubcf5\uc81c \ubcc0\uacbd \uc54c\ub9bc\uc73c\ub85c \uad00\ub9ac\ub418\ub294 \uc9c4\ud589\ub960 \ud45c\uc2dc\uc904\uc744 \ud3ec\ud568\ud558\ub3c4\ub85d iOS \uc571 \ucf54\ub529\uc744 \uc2dc\uc791\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h2>iOS \uc560\ud50c\ub9ac\ucf00\uc774\uc158<\/h2>\n<p>Xcode\uc5d0\uc11c \uc0c8 <strong>\ub2e8\uc77c \ubcf4\uae30 \uc560\ud50c\ub9ac\ucf00\uc774\uc158<\/strong>\u00a0\ud638\ucd9c <strong>\uc2dc\ud2f0 \uc775\uc2a4\ud50c\ub85c\ub7ec<\/strong>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-10374\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/new_project-1024x641.png\" alt=\"\" width=\"900\" height=\"563\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/new_project-1024x641.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/new_project-300x188.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/new_project-768x481.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/new_project-1536x962.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/new_project-20x13.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/new_project-1320x827.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/new_project.png 1600w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>\ud504\ub85c\uc81d\ud2b8\ub97c \ub2eb\uace0 Cocoapods\ub97c \ud1b5\ud574 Couchbase Lite iOS SDK\ub97c \uc124\uce58\ud569\ub2c8\ub2e4:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"4\">\n<pre data-cke-widget-data=\"%7B%22lang%22%3A%22bash%22%2C%22code%22%3A%22%5Cn%20%20%20%20%24%20pod%20init%5Cn%20%20%20%20%24%20pod%20search%20couchbase%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"language-bash hljs\">\r\n    $ pod init\r\n    $ pod search couchbase\r\n\r\n<\/code><\/pre>\n<\/div>\n<p>\uc5d0 \uc885\uc18d\uc131\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. <strong>\ud3ec\ub4dc\ud30c\uc77c<\/strong>\u00a0\ub97c \ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8\uc5d0 \uc124\uce58\ud55c \ub2e4\uc74c \uc124\uce58\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"3\">\n<pre data-cke-widget-data=\"%7B%22lang%22%3A%22bash%22%2C%22code%22%3A%22%5Cn%20%20%20%20%24%20pod%20install%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"language-bash hljs\">\r\n    $ \ud3ec\ub4dc \uc124\uce58\r\n\r\n<\/code><\/pre>\n<\/div>\n<p>\uc5f4\uae30 <strong>CityExplorer.workspace<\/strong>\u00a0\ub97c \ud074\ub9ad\ud558\uace0 \ube0c\ub9ac\uc9d5 \ud5e4\ub354\ub97c \ub9cc\ub4ed\ub2c8\ub2e4:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10375\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/bridging_header.gif\" alt=\"\" width=\"616\" height=\"540\" \/><\/p>\n<p>\ube4c\ub4dc \uc124\uc815\uc73c\ub85c \uc774\ub3d9\ud558\uc5ec \ube0c\ub9ac\uc9d5 \ud5e4\ub354\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10376\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/build_settings.gif\" alt=\"\" width=\"616\" height=\"540\" \/><\/p>\n<p>\uc5f4\uae30 <code>ViewController.swift<\/code> \ub97c \ud074\ub9ad\ud558\uace0 \uc18d\uc131\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. <code>pull<\/code> \uc720\ud615 <code>CBLReplication?<\/code>. \uc5d0\uc11c <code>viewDidLoad<\/code> \uba54\uc11c\ub4dc\uc5d0 \ub2e4\uc74c\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"2\">\n<pre data-cke-widget-data=\"%7B%22code%22%3A%22%5Cn%20%20%20%20%2F%2F%201%5Cn%20%20%20%20let%20manager%20%3D%20CBLManager.sharedInstance()%5Cn%20%20%20%20%2F%2F%202%5Cn%20%20%20%20let%20databaseExists%20%3D%20manager.databaseExistsNamed(%5C%22cityexplorer%5C%22)%5Cn%20%20%20%20var%20database%20%3D%20manager.databaseNamed(%5C%22cityexplorer%5C%22%2C%20error%3A%20nil)%5Cn%20%20%20%20if%20databaseExists%20%7B%5Cn%20%20%20%20%20%20%20%20database%3F.deleteDatabase(nil)%5Cn%20%20%20%20%20%20%20%20database%20%3D%20manager.databaseNamed(%5C%22cityexplorer%5C%22%2C%20error%3A%20nil)%5Cn%20%20%20%20%7D%5Cn%20%20%20%20%5Cn%20%20%20%20let%20gateway%20%3D%20NSURL(string%3A%20%5C%22http%3A%2F%2Flocalhost%3A4984%2Fdb%5C%22)!%5Cn%20%20%20%20%5Cn%20%20%20%20%2F%2F%203%5Cn%20%20%20%20pull%20%3D%20database%3F.createPullReplication(gateway)%5Cn%20%20%20%20%5Cn%20%20%20%20let%20nctr%20%3D%20NSNotificationCenter.defaultCenter()%5Cn%20%20%20%20nctr.addObserver(self%2C%20selector%3A%20%5C%22replicationProgress%3A%5C%22%2C%20name%3A%20kCBLReplicationChangeNotification%2C%20object%3A%20pull)%5Cn%20%20%20%20%5Cn%20%20%20%20%2F%2F%204%5Cn%20%20%20%20pull%3F.start()%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"hljs\">\r\n    \/\/ 1\r\n    let manager = CBLManager.sharedInstance()\r\n    \/\/ 2\r\n    let databaseExists = manager.databaseExistsNamed(\"cityexplorer\")\r\n    var database = manager.databaseNamed(\"cityexplorer\", error: nil)\r\n    if databaseExists {\r\n        database?.deleteDatabase(nil)\r\n        database = manager.databaseNamed(\"cityexplorer\", error: nil)\r\n    }\r\n    \r\n    let gateway = NSURL(string: \"https:\/\/localhost:4984\/db\")!\r\n    \r\n    \/\/ 3\r\n    pull = database?.createPullReplication(gateway)\r\n    \r\n    let nctr = NSNotificationCenter.defaultCenter()\r\n    nctr.addObserver(self, selector: \"replicationProgress:\", name: kCBLReplicationChangeNotification, object: pull)\r\n    \r\n    \/\/ 4\r\n    pull?.start()\r\n\r\n<\/code><\/pre>\n<\/div>\n<p>\uc704\uc5d0\uc11c \uba87 \uac00\uc9c0 \uc77c\uc774 \uc77c\uc5b4\ub098\uace0 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\uad00\ub9ac\uc790\uc758 \uacf5\uc720 \uc778\uc2a4\ud134\uc2a4\ub97c \uc5bb\uac8c \ub429\ub2c8\ub2e4.<\/li>\n<li>\uad00\ub9ac\uc790 \uc778\uc2a4\ud134\uc2a4\ub97c \uc0ac\uc6a9\ud558\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucf58\ud150\uce20\ub97c \uc0ad\uc81c\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \uc571\uc744 \uc2e4\ud589\ud560 \ub54c\ub9c8\ub2e4 \ubcf5\uc81c\uac00 \ucc98\uc74c\ubd80\ud130 \uc2dc\uc791\ub429\ub2c8\ub2e4.<\/li>\n<li>\ud480 \ubcf5\uc81c\ub97c \uc778\uc2a4\ud134\uc2a4\ud654\ud558\uace0 \ub2e4\uc74c\uacfc \uac19\uc740 \uc54c\ub9bc\uc5d0 \uc635\uc800\ubc84\ub85c \ub4f1\ub85d\ud569\ub2c8\ub2e4. <code>kCBL\ubcf5\uc81c\ubcc0\uacbd\uc54c\ub9bc<\/code>.<\/li>\n<li>\ubcf5\uc81c\ub97c \uc2dc\uc791\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>\uadf8\ub9ac\uace0 <code>\ubcf5\uc81c \uc9c4\ud589<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubcc0\uacbd \ud69f\uc218 \ubc0f \uc644\ub8cc \ud69f\uc218 \uc18d\uc131\uc744 \uac04\ub2e8\ud788 \uae30\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<div class=\"cke_widget_wrapper cke_widget_block cke_widget_selected\" tabindex=\"-1\" contenteditable=\"false\" data-cke-widget-wrapper=\"1\" data-cke-filter=\"off\" data-cke-display-name=\"code snippet\" data-cke-widget-id=\"1\">\n<pre data-cke-widget-data=\"%7B%22code%22%3A%22%5Cn%20%20%20%20func%20replicationProgress(notification%3A%20NSNotification)%20%7B%5Cn%20%20%20%20%20%20%20%20println(%5C%22Changes%20count%20%5C%5C(pull%3F.changesCount)%5C%22)%5Cn%20%20%20%20%20%20%20%20println(%5C%22Completed%20%5C%5C(pull%3F.completedChangesCount)%5C%22)%5Cn%20%20%20%20%7D%5Cn%5Cn%22%2C%22classes%22%3Anull%7D\" data-cke-widget-upcasted=\"1\" data-cke-widget-keep-attr=\"0\" data-widget=\"codeSnippet\" class=\"cke_widget_element\"><code class=\"hljs\">\r\n    func replicationProgress(notification: NSNotification) {\r\n        println(\"Changes count \\(pull?.changesCount)\")\r\n        println(\"Completed \\(pull?.completedChangesCount)\")\r\n    }\r\n\r\n<\/code><\/pre>\n<\/div>\n<p>\ub2e4\uc74c \uc139\uc158\uc5d0\uc11c\ub294 \uc2a4\ud1a0\ub9ac\ubcf4\ub4dc\uc5d0 \uc9c4\ud589\ub960 \ubcf4\uae30\ub97c \ucd94\uac00\ud55c \ub2e4\uc74c \ubdf0 \ucee8\ud2b8\ub864\ub7ec\uc5d0 \uc5f0\uacb0\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uc9c4\ud589\ub960 \ud45c\uc2dc\uc904<\/h2>\n<p>\uc2a4\ud1a0\ub9ac\ubcf4\ub4dc\uc5d0\uc11c \ubdf0 \uc911\uc559\uc5d0 \uc9c4\ud589\ub960 \ubdf0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-10377\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/storyboard-1024x893.png\" alt=\"\" width=\"900\" height=\"785\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard-1024x893.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard-300x262.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard-768x669.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard-20x17.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard.png 1200w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>UI \ud578\ub4e4\uc744 \ucee8\ud2b8\ub864\ub7ec \ud504\ub85c\ud37c\ud2f0\uc5d0 \uc5f0\uacb0\ud569\ub2c8\ub2e4:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-10378\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/storyboard_connect-1024x640.png\" alt=\"\" width=\"900\" height=\"563\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard_connect-1024x640.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard_connect-300x188.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard_connect-768x480.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard_connect-1536x960.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard_connect-20x13.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard_connect-1320x825.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2015\/12\/storyboard_connect.png 1600w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>\uc5d0\uc11c <code>\ubcf5\uc81c \uc9c4\ud589<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc9c4\ud589\ub960 \ubdf0\uc758 <code>\uc9c4\ud589 \uc0c1\ud669<\/code> \uc18d\uc131\uc744 \uc801\uc808\ud788 \uc0ac\uc6a9\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"whitespace-before:01 whitespace-after:1 lang:default decode:true\">let active = pull?.status == .Active\r\nlet completed = pull?.status == .Stopped\r\n\r\nprintln(\"Status : \\(pull?.status.rawValue)\")\r\nprintln(\"Changes Count: \\(pull?.changesCount)\")\r\nprintln(\"Completed Count: \\(pull?.completedChangesCount)\")\r\nprintln(\"======\")\r\n\r\nif pull!.changesCount &gt; 0 {\r\n    let number = Float(pull!.completedChangesCount) \/ Float(pull!.changesCount)\r\n    self.progressView.progress = number\r\n}<\/pre>\n<p>\uc571\uc744 \uc2e4\ud589\ud558\uba74 \ubb38\uc11c\uac00 \ubcf5\uc81c\ub418\uba74\uc11c \uc9c4\ud589\ub960 \ud45c\uc2dc\uc904\uc774 \uc5c5\ub370\uc774\ud2b8\ub418\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10379\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/final_demo.gif\" alt=\"\" width=\"876\" height=\"540\" \/><\/p>\n<p>\uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>sync.js<\/strong>\u00a0\uc2a4\ud06c\ub9bd\ud2b8\ub97c \uba87 \ubc88 \ubc18\ubcf5\ud558\uc5ec \ub354 \ub9ce\uc740 \ubb38\uc11c\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. Places API\ub294 \ud558\ub098\uc758 \uc751\ub2f5\uc73c\ub85c \ucd5c\ub300 20\uac1c\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uacb0\ub860<\/h2>\n<p>\uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c\ub294 \ub3d9\uae30\ud654 \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubb38\uc11c \ubc0f \ucca8\ubd80 \ud30c\uc77c\ub85c \uac00\uc838\uc624\uae30 \uc704\ud574 Google Places API\uc640 NodeJS \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud504\ub85c\uc81d\ud2b8\ub97c \uc124\uc815\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4. \ub610\ud55c <code>NS\uc54c\ub9bc<\/code> API\uc5d0 \ub4f1\ub85d\ud558\ub824\uba74 iOS\uc5d0\uc11c <code>kCBL\ubcf5\uc81c\ubcc0\uacbd\uc54c\ub9bc<\/code> \uc54c\ub9bc\uc744 \ud074\ub9ad\ud558\uace0 iOS \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc9c4\ud589\ub960 \ubcf4\uae30\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4.<\/p>","protected":false},"excerpt":{"rendered":"<p>NSProgress\u00a0is an object in Foundation that represents the completion of some work. That work could be downloading a file, installing an app or something your own application is doing. The NSProgress exists to let you easily report progress in your [&hellip;]<\/p>","protected":false},"author":51,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810],"tags":[],"ppma_author":[9028],"class_list":["post-2075","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Displaying a Sync Progress Indicator in an iOS app - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/display-sync-progress-indicator-ios\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Displaying a Sync Progress Indicator in an iOS app\" \/>\n<meta property=\"og:description\" content=\"NSProgress\u00a0is an object in Foundation that represents the completion of some work. That work could be downloading a file, installing an app or something your own application is doing. The NSProgress exists to let you easily report progress in your [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/display-sync-progress-indicator-ios\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-16T01:04:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T08:44:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/create_app.gif\" \/>\n<meta name=\"author\" content=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/\"},\"author\":{\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6\"},\"headline\":\"Displaying a Sync Progress Indicator in an iOS app\",\"datePublished\":\"2015-12-16T01:04:39+00:00\",\"dateModified\":\"2024-09-12T08:44:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/\"},\"wordCount\":1151,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Mobile\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/\",\"name\":\"Displaying a Sync Progress Indicator in an iOS app - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-12-16T01:04:39+00:00\",\"dateModified\":\"2024-09-12T08:44:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Displaying a Sync Progress Indicator in an iOS app\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6\",\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"caption\":\"James Nocentini, Technical Writer, Mobile, Couchbase\"},\"description\":\"James Nocentini is the Technical Writer in charge of the documentation for Couchbase Mobile. Previously, he worked as a Developer Advocate and before that as a front-end developer for HouseTrip. He also enjoys writing Android tutorials for raywenderlich.com in his spare time.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/james-nocentini\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Displaying a Sync Progress Indicator in an iOS app - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/display-sync-progress-indicator-ios\/","og_locale":"ko_KR","og_type":"article","og_title":"Displaying a Sync Progress Indicator in an iOS app","og_description":"NSProgress\u00a0is an object in Foundation that represents the completion of some work. That work could be downloading a file, installing an app or something your own application is doing. The NSProgress exists to let you easily report progress in your [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/display-sync-progress-indicator-ios\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-12-16T01:04:39+00:00","article_modified_time":"2024-09-12T08:44:14+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2015\/12\/create_app.gif","type":"","width":"","height":""}],"author":"James Nocentini, Technical Writer, Mobile, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"James Nocentini, Technical Writer, Mobile, Couchbase","Est. reading time":"7\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/"},"author":{"name":"James Nocentini, Technical Writer, Mobile, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6"},"headline":"Displaying a Sync Progress Indicator in an iOS app","datePublished":"2015-12-16T01:04:39+00:00","dateModified":"2024-09-12T08:44:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/"},"wordCount":1151,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Mobile"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/","url":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/","name":"Displaying a Sync Progress Indicator in an iOS app - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-12-16T01:04:39+00:00","dateModified":"2024-09-12T08:44:14+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/display-sync-progress-indicator-ios\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Displaying a Sync Progress Indicator in an iOS app"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6","name":"\uc81c\uc784\uc2a4 \ub178\uc13c\ud2f0\ub2c8, \ubaa8\ubc14\uc77c \ud14c\ud06c\ub2c8\uceec \ub77c\uc774\ud130, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816","url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","caption":"James Nocentini, Technical Writer, Mobile, Couchbase"},"description":"\uc81c\uc784\uc2a4 \ub178\uc13c\ud2f0\ub2c8\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ubaa8\ubc14\uc77c\uc758 \ubb38\uc11c\ub97c \ub2f4\ub2f9\ud558\ub294 \ud14c\ud06c\ub2c8\uceec \ub77c\uc774\ud130\uc785\ub2c8\ub2e4. \uc774\uc804\uc5d0\ub294 \uac1c\ubc1c\uc790 \uc9c0\uc6d0 \ub2f4\ub2f9\uc790\ub85c \uc77c\ud588\uc73c\uba70 \uadf8 \uc804\uc5d0\ub294 HouseTrip\uc758 \ud504\ub860\ud2b8\uc5d4\ub4dc \uac1c\ubc1c\uc790\ub85c \uc77c\ud588\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uc5ec\uac00 \uc2dc\uac04\uc5d0\ub294 raywenderlich.com\uc5d0 \uc548\ub4dc\ub85c\uc774\ub4dc \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc791\uc131\ud558\ub294 \uac83\uc744 \uc990\uae41\ub2c8\ub2e4.","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/james-nocentini\/"}]}},"authors":[{"term_id":9028,"user_id":51,"is_guest":0,"slug":"james-nocentini","display_name":"James Nocentini, Technical Writer, Mobile, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","first_name":"James","last_name":"Nocentini","user_url":"","author_category":"","description":"\uc81c\uc784\uc2a4 \ub178\uc13c\ud2f0\ub2c8\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ubaa8\ubc14\uc77c\uc758 \ubb38\uc11c\ub97c \ub2f4\ub2f9\ud558\ub294 \ud14c\ud06c\ub2c8\uceec \ub77c\uc774\ud130\uc785\ub2c8\ub2e4. \uc774\uc804\uc5d0\ub294 \uac1c\ubc1c\uc790 \uc9c0\uc6d0 \ub2f4\ub2f9\uc790\ub85c \uc77c\ud588\uc73c\uba70 \uadf8 \uc804\uc5d0\ub294 HouseTrip\uc758 \ud504\ub860\ud2b8\uc5d4\ub4dc \uac1c\ubc1c\uc790\ub85c \uc77c\ud588\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uc5ec\uac00 \uc2dc\uac04\uc5d0\ub294 raywenderlich.com\uc5d0 \uc548\ub4dc\ub85c\uc774\ub4dc \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc791\uc131\ud558\ub294 \uac83\uc744 \uc990\uae41\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=2075"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2075\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=2075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=2075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=2075"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=2075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}