{"id":5374,"date":"2018-06-21T06:40:58","date_gmt":"2018-06-21T13:40:58","guid":{"rendered":"http:\/\/www.couchbase.com\/blog\/?p=5374"},"modified":"2025-06-13T22:39:41","modified_gmt":"2025-06-14T05:39:41","slug":"couchbase-data-platform-action-eventing-functions","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-data-platform-action-eventing-functions\/","title":{"rendered":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ub370\uc774\ud130 \ud50c\ub7ab\ud3fc\uc774 \uc791\ub3d9 \uc911\uc785\ub2c8\ub2e4: \uc774\ubca4\ud2b8\/\uae30\ub2a5"},"content":{"rendered":"<div id=\"content\">\n<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>This post will dive into the use of the <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\">Couchbase Eventing Service<\/a> in the Couchbase Silicon Valley 2017 <a title=\"https:\/\/youtu.be\/-U_UjqnhMBI\" href=\"https:\/\/youtu.be\/-U_UjqnhMBI\">technical keynote demonstration<\/a> application.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>If you aren\u2019t already familiar with the demo or <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\">Couchbase Eventing Service<\/a>, take a look at the resources at the end of this post. The source code for the entire application set is <a title=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\" href=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\">available on GitHub<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_introduction\">Introduction<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>In the demo, we use a mobile phone with NFC to read temperatures from a battery-less patch. The readings get stored as a <a title=\"https:\/\/www.hl7.org\/fhir\/observation.html\" href=\"https:\/\/www.hl7.org\/fhir\/observation.html\">FHIR Observation Resource<\/a> in JSON using <a title=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/index.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/index.html\">Couchbase Lite<\/a>. These documents then get synced to a <a title=\"https:\/\/www.couchbase.com\/nosql-databases\/couchbase-server\" href=\"https:\/\/www.couchbase.com\/nosql-databases\/couchbase-server\/\">Couchbase Server<\/a> cluster via <a title=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/index.html\">Sync Gateway<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The web client has a dashboard designed to track patient information in near real time. This presents a couple of pretty common challenges. How do we:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Update the dashboard based on records written by another part of the system<\/li>\n<li>Efficiently transfer the necessary information<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Let\u2019s take a look at how the Eventing Service helps with both of these.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_pushing_updates_to_the_client\">Pushing Updates to the Client<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Even without an <a title=\"https:\/\/en.wikipedia.org\/wiki\/Active_database\" href=\"https:\/\/en.wikipedia.org\/wiki\/Active_database\">active database<\/a>, you can do this at least a couple of different ways. For example, we could work out a way to post the readings to a message queue, or poll the database. Both approaches have drawbacks.<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Adding a message queue introduces more infrastructure complexity and opportunities for failure.<\/li>\n<li>Polling is, well, polling.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Instead, we handled this using <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\">Couchbase Functions<\/a>, a feature of the Eventing Service. Functions listen for changes in the database. (Technically, Functions process a <a title=\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/\" href=\"https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/\">Couchbase Database Change Protocol<\/a> feed.) You then write two callbacks in JavaScript, <code>OnUpdate<\/code> and <code>OnDelete<\/code>, that get invoked for every document creation\/update and deletion event, respectively. This lets you implement reactive code that runs directly in your cluster.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>(On a side note, we could have solved this using <a title=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/server-integration\/index.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/sync-gateway\/server-integration\/index.html\">Sync Gateway web hooks<\/a>. This approach has some aspects in common with the technique we did use. It has several trade-offs, but that\u2019s a topic for a different post.)<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_data_efficiency\">Data Efficiency<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>The mobile app creates documents based on temperature readings that need to record a slew of related information.<sup class=\"footnote\">[<a id=\"_footnoteref_1\" class=\"footnote\" title=\"View footnote.\" href=\"#_footnotedef_1\">1<\/a>] <\/sup>For the dashboard, we only need a small subset of that data. We could retrieve the whole document with a key\/value lookup. That would be fast, but means transferring data we don\u2019t care about. It\u2019s easy enough to use a <a title=\"https:\/\/www.couchbase.com\/n1ql\" href=\"https:\/\/www.couchbase.com\/n1ql\/\">N1QL<\/a> query to pare down the data. While N1QL is incredibly efficient, this still means processing through your query nodes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>With Functions, you get a copy of the document with each update. Naturally you can extract the data you want from there quite easily. Since Eventing is an <a title=\"https:\/\/www.couchbase.com\/multi-dimensional-scalability-overview\" href=\"https:\/\/www.couchbase.com\/multi-dimensional-scalability-overview\/\">independent service<\/a>, you can scale the resources you dedicate to your Functions separately from the rest of your cluster.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_the_code\">The Code<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>The actual code involved here is pretty straightforward.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_couchbase_functions\">Couchbase Functions<\/h3>\n<div class=\"paragraph\">\n<p>Here\u2019s the Functions part. You set add this either through the Eventing panel of the Couchbase Server console, or via a REST call.<sup class=\"footnote\">[<a id=\"_footnoteref_2\" class=\"footnote\" title=\"View footnote.\" href=\"#_footnotedef_2\">2<\/a>]<\/sup><\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>function OnUpdate(doc, meta) {\r\n  if (doc.resourceType != 'Observation') return;\r\n\r\n  let reference = doc.subject.reference;\r\n  let url = \"https:\/\/localhost:8080\/events\/\" + reference.substr(9);\r\n  let data = JSON.stringify({\r\n    \"reference\": doc.subject.reference,\r\n    \"code\": doc.code.coding[0].code,\r\n    \"recordedAt\": doc.issued,\r\n    \"value\": doc.valueQuantity.value\r\n  });\r\n\r\n  let curl = SELECT CURL($url, {\r\n    \"request\": \"POST\",\r\n    \"header\": [ \"Content-Type: application\/json\", \"accept: application\/json\" ],\r\n    \"data\": $data\r\n  });\r\n\r\n  curl.execQuery();\r\n}\r\n\r\nfunction OnDelete(meta) {}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>In the FHIR specification, documents all have a <code>resourceType<\/code>. We only look at &#8220;Observation&#8221; resources, so the first check filters on that.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Next, we extract the UUID of the patient from the subject reference field. That gets used in routing on the web app server side. (See the next section for more on this.)<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Then we create a JSON string with only the subject reference, a code indicating the type of observation made, the date this particular one was taken, and the measurement value. That\u2019s the only data we need to pass.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Finally, we make use of the <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/curl.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/curl.html\">cURL<\/a> capability in N1QL to POST that data to the app server REST endpoint. <a href=\"https:\/\/www.couchbase.com\/blog\/using-curl-eventing-service-update\/\">(Instead of using a SELECT query to execute the CURL function, consider using eventing&#8217;s own CURL function)<\/a>.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_web_server_rest_endpoint\">Web Server REST Endpoint<\/h3>\n<div class=\"paragraph\">\n<p>The app server is written in <a title=\"https:\/\/nodejs.org\/\" href=\"https:\/\/nodejs.org\">Node<\/a> using <a title=\"https:\/\/expressjs.com\/\" href=\"https:\/\/expressjs.com\">Express<\/a>. We defined a <a title=\"https:\/\/expressjs.com\/en\/guide\/routing.html\" href=\"https:\/\/expressjs.com\/en\/guide\/routing.html\">route<\/a> in Express to create the endpoint used in the cURL call in the Functions code.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Here\u2019s the code.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>router.post('\/:id', function(req, res, next) {\r\n  res.send('');\r\n\r\n  if (sse[req.params.id] === undefined) return; \/\/ Not listening yet\r\n\r\n  sse[req.params.id](`event: update\\ndata: { \"values\": [${JSON.stringify(req.body)}]}\\n\\n`);\r\n});\r\n\r\nmodule.exports = router;<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Express let\u2019s you define a portion of a route, and then hang it off of a longer path when wiring things together. Hence all you see here is the end part of the route specification. The <code>:id<\/code> element tells Express to take the last segment of the URL and feed it to our callback as a parameter. Recall here we add the patient UUID as the last part of the URL path. So that\u2019s what the <code>id<\/code> parameter gets set to.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Having triggered this route with our cURL call, we need to get the information pushed out to the web client. We could have used web sockets. Instead, we chose to use <a title=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Server-sent_events\/Using_server-sent_events\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Server-sent_events\/Using_server-sent_events\">server-sent events<\/a>. SSEs are lighter weight than web sockets, and work well for this purpose. We\u2019ll go into SSEs further in another post. For now, just think of it as a message channel that uses a very simple format.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>That gives us what we need to know to understand the callback code. The first line specifies the route. The second line sends an empty response, to close out the cURL session. Next we check whether the server-sent events channel has been set up yet. This happens via a call from the client. If the SSE channel is ready, we tag our data as an &#8220;update&#8221; event, and send out the same JSON we received.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_conclusion\">Conclusion<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Functions are probably my favorite new feature in Couchbase Server 5.5. We looked at one example here, and you can see it doesn\u2019t take much to get started. There are a lot of other uses cases to look at, too. Deploying business logic right along side data, with easy scaling, all without adding infrastructure, that\u2019s pretty cool stuff.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_resources\">Resources<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>For background on the application, view the video of the keynote <a title=\"https:\/\/youtu.be\/-U_UjqnhMBI\" href=\"https:\/\/youtu.be\/-U_UjqnhMBI\">here<\/a>, along with these other <a title=\"https:\/\/www.couchbase.com\/blog\/tag\/Connect-SV-2017-Demo\/\" href=\"https:\/\/www.couchbase.com\/blog\/tag\/Connect-SV-2017-Demo\/\">posts<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>You can read an excellent introduction to <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\">Couchbase Eventing Service<\/a> in <a title=\"https:\/\/www.couchbase.com\/blog\/eventing\/\" href=\"https:\/\/www.couchbase.com\/blog\/eventing\/\">this post<\/a>. I also highly recommend checking out this video from Couchbase Connect NYC 2018: <a title=\"https:\/\/youtu.be\/SXa6PJEuaHY\" href=\"https:\/\/youtu.be\/SXa6PJEuaHY\">Do More With Change \u2013 Introducing Couchbase Eventing<\/a><\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_postscript\">Postscript<\/h3>\n<div class=\"paragraph\">\n<p>Couchbase is open source and <a title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/downloads\/\">free to try out<\/a>.<br \/>\n<strong>Get started<\/strong> with <a title=\"https:\/\/www.couchbase.com\/get-started\" href=\"https:\/\/developer.couchbase.com\/tutorials\">sample code, example queries, tutorials, and more<\/a>.<br \/>\nFind more resources on our <a title=\"https:\/\/www.couchbase.com\/developers\/community\/\" href=\"https:\/\/www.couchbase.com\/developers\/community\/\">developer portal<\/a>.<br \/>\nFollow us on Twitter <a title=\"https:\/\/twitter.com\/CouchbaseDev\" href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<br \/>\nYou can post questions on our <a title=\"https:\/\/www.couchbase.com\/forums\/\" href=\"https:\/\/www.couchbase.com\/forums\/\">forums<\/a>.<br \/>\nWe actively participate on <a title=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\" href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stack Overflow<\/a>.<br \/>\nHit me up on Twitter with any questions, comments, topics you\u2019d like to see, etc. <a title=\"https:\/\/twitter.com\/HodGreeley\" href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"footnotes\">\n<hr \/>\n<div id=\"_footnotedef_1\" class=\"footnote\"><a title=\"\" href=\"#_footnoteref_1\">1<\/a>. See <a title=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\/blob\/master\/mobile\/android\/CBCHealth\/app\/src\/main\/java\/com\/couchbase\/mobile\/app\/temperature\/TemperatureActivity.java\" href=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\/blob\/master\/mobile\/android\/CBCHealth\/app\/src\/main\/java\/com\/couchbase\/mobile\/app\/temperature\/TemperatureActivity.java\">TemperatureActivity.java<\/a><\/div>\n<div id=\"_footnotedef_2\" class=\"footnote\"><a title=\"\" href=\"#_footnoteref_2\">2<\/a>. Find complete setup details <a title=\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\" href=\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\">here<\/a><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post will dive into the use of the Couchbase Eventing Service in the Couchbase Silicon Valley 2017 technical keynote demonstration application. If you aren\u2019t already familiar with the demo or Couchbase Eventing Service, take a look at the resources [&hellip;]<\/p>\n","protected":false},"author":73,"featured_media":5425,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1816,2273,1822],"tags":[1998,2255,1996,2177,2226,1771,2239,2240,1725],"ppma_author":[9042],"class_list":["post-5374","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-eventing","category-node-js","tag-application","tag-connect-sv-2017-demo","tag-couchbase-connect","tag-couchbase-data-platform","tag-couchbase-functions","tag-curl","tag-demo","tag-demonstration","tag-nosql-database"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>The Couchbase Data Platform in Action: Eventing\/Fu<\/title>\n<meta name=\"description\" content=\"The blog dives into the use of the Couchbase Eventing Service in the Couchbase Silicon Valley 2017 technical keynote demonstration application.\" \/>\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\/couchbase-data-platform-action-eventing-functions\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Couchbase Data Platform in Action: Eventing\/Functions\" \/>\n<meta property=\"og:description\" content=\"The blog dives into the use of the Couchbase Eventing Service in the Couchbase Silicon Valley 2017 technical keynote demonstration application.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-data-platform-action-eventing-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-21T13:40:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:39:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/F_of_CB-785x400-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"785\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"The Couchbase Data Platform in Action: Eventing\\\/Functions\",\"datePublished\":\"2018-06-21T13:40:58+00:00\",\"dateModified\":\"2025-06-14T05:39:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/\"},\"wordCount\":1075,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2018\\\/06\\\/F_of_CB-785x400-1.png\",\"keywords\":[\"application\",\"Connect SV 2017 Demo\",\"Couchbase Connect\",\"Couchbase Data Platform\",\"Couchbase Functions\",\"curl\",\"Demo\",\"Demonstration\",\"NoSQL Database\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"Eventing\",\"Node.js\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/\",\"name\":\"The Couchbase Data Platform in Action: Eventing\\\/Fu\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2018\\\/06\\\/F_of_CB-785x400-1.png\",\"datePublished\":\"2018-06-21T13:40:58+00:00\",\"dateModified\":\"2025-06-14T05:39:41+00:00\",\"description\":\"The blog dives into the use of the Couchbase Eventing Service in the Couchbase Silicon Valley 2017 technical keynote demonstration application.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2018\\\/06\\\/F_of_CB-785x400-1.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2018\\\/06\\\/F_of_CB-785x400-1.png\",\"width\":785,\"height\":400},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-data-platform-action-eventing-functions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Couchbase Data Platform in Action: Eventing\\\/Functions\"}]},{\"@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\\\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\\\/\\\/hod.greeley.org\\\/blog\",\"https:\\\/\\\/x.com\\\/HodGreeley\"],\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ko\\\/author\\\/hod-greeley\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The Couchbase Data Platform in Action: Eventing\/Fu","description":"\uc774 \ube14\ub85c\uadf8\uc5d0\uc11c\ub294 2017 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc2e4\ub9ac\ucf58\ubc38\ub9ac \uae30\uc220 \uae30\uc870\uc5f0\uc124 \ub370\ubaa8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4 \uc0ac\uc6a9\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc124\uba85\ud569\ub2c8\ub2e4.","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\/couchbase-data-platform-action-eventing-functions\/","og_locale":"ko_KR","og_type":"article","og_title":"The Couchbase Data Platform in Action: Eventing\/Functions","og_description":"The blog dives into the use of the Couchbase Eventing Service in the Couchbase Silicon Valley 2017 technical keynote demonstration application.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-data-platform-action-eventing-functions\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-06-21T13:40:58+00:00","article_modified_time":"2025-06-14T05:39:41+00:00","og_image":[{"width":785,"height":400,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/F_of_CB-785x400-1.png","type":"image\/png"}],"author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"5\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"The Couchbase Data Platform in Action: Eventing\/Functions","datePublished":"2018-06-21T13:40:58+00:00","dateModified":"2025-06-14T05:39:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/"},"wordCount":1075,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/F_of_CB-785x400-1.png","keywords":["application","Connect SV 2017 Demo","Couchbase Connect","Couchbase Data Platform","Couchbase Functions","curl","Demo","Demonstration","NoSQL Database"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","Eventing","Node.js"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/","name":"The Couchbase Data Platform in Action: Eventing\/Fu","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/F_of_CB-785x400-1.png","datePublished":"2018-06-21T13:40:58+00:00","dateModified":"2025-06-14T05:39:41+00:00","description":"\uc774 \ube14\ub85c\uadf8\uc5d0\uc11c\ub294 2017 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc2e4\ub9ac\ucf58\ubc38\ub9ac \uae30\uc220 \uae30\uc870\uc5f0\uc124 \ub370\ubaa8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4 \uc0ac\uc6a9\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc124\uba85\ud569\ub2c8\ub2e4.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/F_of_CB-785x400-1.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/06\/F_of_CB-785x400-1.png","width":785,"height":400},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"The Couchbase Data Platform in Action: Eventing\/Functions"}]},{"@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"\ud638\ub4dc \uadf8\ub9b4\ub9ac, \uac1c\ubc1c\uc790 \uc639\ud638\uc790, \uce74\uc6b0\uce58\ubca0\uc774\uc2a4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"\ud638\ub4dc \uadf8\ub808\uc774\ub9ac\ub294 \uc2e4\ub9ac\ucf58\ubc38\ub9ac\uc5d0 \uac70\uc8fc\ud558\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \uac1c\ubc1c\uc790 \uc639\ud638\uc790\uc785\ub2c8\ub2e4. \uadf8\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4 \ubc0f \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \uad00\ub9ac\uc790\ub85c\uc11c 20\ub144 \uc774\uc0c1\uc758 \uacbd\ub825\uc744 \ubcf4\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub294 \uc804\uc0b0 \ubb3c\ub9ac\ud559 \ubc0f \ud654\ud559, \ucef4\ud4e8\ud130 \ubc0f \ub124\ud2b8\uc6cc\ud06c \ubcf4\uc548, \uae08\uc735, \ubaa8\ubc14\uc77c \ub4f1 \ub2e4\uc591\ud55c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ubd84\uc57c\uc5d0\uc11c \uc77c\ud574 \uc654\uc2b5\ub2c8\ub2e4. 2016\ub144 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc5d0 \ud569\ub958\ud558\uae30 \uc804\uc5d0\ub294 \uc0bc\uc131\uc5d0\uc11c \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc790 \uad00\uacc4\ub97c \uc774\ub04c\uc5c8\uc2b5\ub2c8\ub2e4. \uceec\ub7fc\ube44\uc544 \ub300\ud559\uad50\uc5d0\uc11c \ud654\ud559 \ubb3c\ub9ac\ud559 \ubc15\uc0ac \ud559\uc704\ub97c \ubc1b\uc558\uc2b5\ub2c8\ub2e4.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/hod-greeley\/"}]}},"acf":[],"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5374","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\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=5374"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5374\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/5425"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=5374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=5374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=5374"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=5374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}