{"id":2046,"date":"2015-12-16T19:35:31","date_gmt":"2015-12-16T19:35:30","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2046"},"modified":"2024-09-12T01:41:38","modified_gmt":"2024-09-12T08:41:38","slug":"couchbase-java-sdk-writing-vertx-verticle","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-java-sdk-writing-vertx-verticle\/","title":{"rendered":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc790\ubc14 SDK\ub97c \uc0ac\uc6a9\ud558\uc5ec Vert.x \ubc84\ud2f0\ud074 \uc791\uc131\ud558\uae30"},"content":{"rendered":"<p><!-- Using Couchbase Java SDK to write a Vert.x Verticle --><\/p>\n<p>\uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \ub05d\uae4c\uc9c0 \ubc18\uc751\ud560 \uac83\uc785\ub2c8\ub2e4!<\/p>\n<p>\uc77c\ubd80 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uace0\uac1d\uc740 <code>Vert.x<\/code>\uc644\uc804\ud788 \ube44\ub3d9\uae30\uc2dd \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc791\uc131\ud558\uae30 \uc704\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc778 <code>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc790\ubc14 SDK<\/code> \ub294 \ucc98\uc74c\ubd80\ud130 \ube44\ub3d9\uae30\uc2dd\uc774\uba70, \uc774 \uadf8\ub9bc\uc5d0 \uc798 \ub9de\uace0 <code>RxJava<\/code>-\uae30\ubc18 \ube44\ub3d9\uae30 API\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c Couchbase\ub85c \ube60\ub974\uac8c \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <code>\uc218\uc9c1<\/code> \uc5d0 \ub300\ud55c \uc5f0\uacb0\uc744 \uc2a4\ud540\uc5c5\ud569\ub2c8\ub2e4. <code>\ud074\ub7ec\uc2a4\ud130<\/code> \uadf8\ub9ac\uace0 <code>\ubc84\ud0b7<\/code> \uadf8\ub7f0 \ub2e4\uc74c Java 8\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c JSON \ubb38\uc11c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790\uac00 <a href=\"https:\/\/vertx.io\/docs\/vertx-core\/java\/\">Vert.x\uc758 \uae30\ubcf8 \uc0ac\ud56d<\/a>. \ub2e4\uc74c\uc740 \uac04\ub2e8\ud55c \ubaa9\ucc28\uc785\ub2c8\ub2e4:<\/p>\n<p><!-- TOC depth:6 withLinks:1 updateOnSave:1 orderedList:0 --><\/p>\n<ul>\n<li><a href=\"#starting-a-new-vertx-project\">\uc0c8 Vert.x \ud504\ub85c\uc81d\ud2b8 \uc2dc\uc791<\/a>\n<ul>\n<li><a href=\"#skeleton-of-the-verticle\">\ubc84\ud2f0\ud074\uc758 \uc2a4\ucf08\ub808\ud1a4<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#asynchronously-obtaining-a-bucket\">\ube44\ub3d9\uae30\uc801\uc73c\ub85c \ubc84\ud0b7 \uac00\uc838\uc624\uae30<\/a><\/li>\n<li><a href=\"#gracefully-tearing-down-the-sdk\">SDK\ub97c \uc6b0\uc544\ud558\uac8c \ud574\uccb4\ud558\uae30<\/a><\/li>\n<li><a href=\"#seeing-it-in-action\">\uc2e4\uc81c\ub85c \ubcf4\uae30<\/a><\/li>\n<li><a href=\"#going-further\">\ub354 \ub098\uc544\uac00\uae30<\/a>\n<ul>\n<li><a href=\"#creating-sample-data-in-couchbase-on-startup\">\uc2dc\uc791 \uc2dc Couchbase\uc5d0\uc11c \uc0d8\ud50c \ub370\uc774\ud130 \ub9cc\ub4e4\uae30<\/a><\/li>\n<li><a href=\"#serving-json-data-from-couchbase\">Couchbase\uc5d0\uc11c JSON \ub370\uc774\ud130 \uc11c\ube44\uc2a4\ud558\uae30<\/a><\/li>\n<li><a href=\"#stopping-the-verticle-via-a-http-endpoint\">HTTP \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ud1b5\ud574 \ubc84\ud2f0\ud074 \uc911\uc9c0\ud558\uae30<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#conclusion\">\uacb0\ub860<\/a><br \/>\n<!-- \/TOC --><\/li>\n<\/ul>\n<h2 id=\"starting-a-new-vert.x-project\">\uc0c8 Vert.x \ud504\ub85c\uc81d\ud2b8 \uc2dc\uc791<\/h2>\n<p>\uba3c\uc800 \ud504\ub85c\uc81d\ud2b8\uc758 \ub8e8\ud2b8 \ud3f4\ub354\ub97c \ub9cc\ub4e4\uace0 Maven \ub514\ub809\ud1a0\ub9ac \uad6c\uc870\ub97c \ucd08\uae30\ud654(\ub610\ub294 \uc120\ud638\ud558\ub294 Maven \uc544\ud0a4\ud0c0\uc785 \uc0ac\uc6a9)\ud558\uc5ec \uc0c8 Maven \uae30\ubc18 \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c \uba85\ub839\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4: \"<code>mkdir -p cbvertx\/src\/main\/java\/com\/couchbase\/demo\/vertx\/<\/code>&#8220;.<\/p>\n<p>\uc774\uc81c <code>pom.xml<\/code> \ub97c \ud504\ub85c\uc81d\ud2b8\uc758 \ub8e8\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"xml\"><code class=\"language-xml\"><!--?xml version=\"1.0\" encoding=\"UTF-8\"?-->\r\n\r\n  4.0.0\r\n\r\n  com.couchbase.demo\r\n  cbvertx\r\n  1.0-SNAPSHOT\r\n\r\n  \r\n    \r\n      io.vertx\r\n      vertx-core\r\n      3.1.0\r\n    \r\n    \r\n      io.vertx\r\n      vertx-rx-java\r\n      3.1.0\r\n    \r\n    \r\n      com.couchbase.client\r\n      java-client\r\n      2.2.2\r\n    \r\n    \r\n      <!-- this is actually already a transitive dependency of the Java SDK-->\r\n      io.reactivex\r\n      rxjava\r\n      1.0.15\r\n    \r\n    \r\n      log4j\r\n      log4j\r\n      1.2.17\r\n    \r\n  \r\n\r\n  \r\n    \r\n      \r\n        maven-compiler-plugin\r\n        3.3\r\n        \r\n          1.8\r\n          1.8\r\n        \r\n      \r\n    \r\n  \r\n\r\n\r\n<\/code><\/pre>\n<p>\ubcf4\uc2dc\ub2e4\uc2dc\ud53c <code>Vert.x<\/code> \ubc84\uc804 <code>3.1.0<\/code> \ubc0f RxJava\uc758 \ubc14\uc778\ub529\uc744 \uc704\ud55c \ud655\uc7a5 \uae30\ub2a5\uc785\ub2c8\ub2e4, <code>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc790\ubc14 SDK<\/code> \ubc84\uc804 <code>2.2.2<\/code> \uadf8\ub9ac\uace0 <code>RxJava<\/code> \ubc84\uc804 <code>1.0.15<\/code>&#8230;<\/p>\n<h2 id=\"skeleton-of-the-verticle\">\ubc84\ud2f0\ud074\uc758 \uc2a4\ucf08\ub808\ud1a4<\/h2>\n<p>\uc800\ud76c\ub294 <code>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ubc84\ud2f0\ud074<\/code> \uc5d0\uc11c <code>AbstractVerticle<\/code> in <code>io.vertx.rxjava.core<\/code> (vertx-rx-java \ud655\uc7a5\uc790\uc5d0\uc11c). \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc2a4\ucf08\ub808\ud1a4\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"java\"><code class=\"language-java\">\ud328\ud0a4\uc9c0 com.couchbase.demo.vertx;\r\n\r\njava.util.ArrayList\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\njava.util.List\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\n\r\nimport com.couchbase.client.java.CouchbaseAsyncCluster;\r\nimport io.vertx.core.Context;\r\nimport io.vertx.core.Vertx;\r\nimport io.vertx.core.json.JsonArray;\r\nimport io.vertx.core.json.JsonObject;\r\nimport io.vertx.core.logging.Logger;\r\nimport io.vertx.core.logging.LoggerFactory;\r\nimport io.vertx.rxjava.core.AbstractVerticle;\r\n\r\npublic class CouchbaseVerticle extends AbstractVerticle {\r\n\r\n    private static final Logger LOGGER = LoggerFactory.getLogger(CouchbaseVerticle.class);\r\n\r\n    private CouchbaseAsyncCluster cluster;\r\n\r\n}<\/code><\/pre>\n<p>\uc774 \uc9c1\ud6c4\uc5d0 \uc791\uc131\ud560 \ucd08\uae30\ud654 \ub2e8\uacc4\uc5d0\uc11c\ub294 Vert.x \uad6c\uc131\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub7f0\ud0c0\uc784\uc5d0 Couchbase \ud074\ub7ec\uc2a4\ud130\uc5d0\uc11c \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\ud560 \ub178\ub4dc\ub97c \uacb0\uc815\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc904 \uac83\uc785\ub2c8\ub2e4. \uc778\uc2a4\ud134\uc2a4\ud654 <code>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ud074\ub7ec\uc2a4\ud130<\/code> \ub294 \uc5ec\uc804\ud788 \ucd08\uae30\ud654 \uc911\uc5d0 \uc774\ub807\uac8c \ud560 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \uac00\ubccd\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c init \uba54\uc11c\ub4dc\ub97c <code>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ubc84\ud2f0\ud074<\/code>:<\/p>\n<pre class=\"java\"><code>@Override\r\npublic void init(Vertx vertx, Context context) {\r\n    super.init(vertx, context);\r\n    \/\/getting the configuration JSON\r\n    JsonObject config = context.config();\r\n\r\n    \/\/getting the bootstrap node, as a JSON array (default to localhost)\r\n    JsonArray seedNodeArray = config.getJsonArray(\"couchbase.seedNodes\", new JsonArray().add(\"localhost\"));\r\n    \/\/convert to a List\r\n    List seedNodes = new ArrayList&lt;&gt;(seedNodeArray.size());\r\n    for (Object seedNode : seedNodeArray) {\r\n        seedNodes.add((String) seedNode);\r\n    }\r\n    \/\/use that to bootstrap the Cluster\r\n    this.cluster = CouchbaseAsyncCluster.create(seedNodes);\r\n}<\/code><\/pre>\n<h2 id=\"asynchronously-obtaining-a-bucket\">\ube44\ub3d9\uae30\uc801\uc73c\ub85c \ubc84\ud0b7 \uac00\uc838\uc624\uae30<\/h2>\n<p>Couchbase API\uc758 \uc8fc\uc694 \uc9c4\uc785\uc810\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <code>\ubc84\ud0b7<\/code> \uc778\ud130\ud398\uc774\uc2a4 \ub610\ub294 <code>\ube44\ub3d9\uae30 \ubc84\ud0b7<\/code> \ub97c \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. \ubc84\ud0b7\uc5d0 \ub300\ud55c \uc5f0\uacb0\uc744 \uc124\uc815('\uc5f4\uae30')\ud558\ub294 \uc791\uc5c5\uc740 \ud6e8\uc52c \ub354 \ubb34\uac81\uae30 \ub54c\ubb38\uc5d0 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc218\ud589\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 \ubc84\ud2f0\ud074\uc758 \uc218\uba85 \uae30\uac04 \ub3d9\uc548 \uc0ac\uc6a9\ud560 \ubc84\ud0b7\uc744 \uc5f4\uc5b4 \ubc84\ud2f0\ud074\uc744 \uc2dc\uc791\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \ubc84\ud0b7\uc5d0 \ub300\ud55c \ucc38\uc870\ub97c \uc720\uc9c0\ud558\uba74\uc11c <code>\uc2dc\uc791(\ubbf8\ub798 \uc2dc\uc791\ubbf8\ub798)<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec Vert.x\uc5d0 \ubc84\ud2f0\ud074\uc774 \uc900\ube44\ub418\uc5c8\uc74c\uc744 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc54c\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"java\"><code>    private volatile AsyncBucket bucket;\r\n\r\n    @Override\r\n    public void start(Future startFuture) throws Exception {\r\n        cluster.openBucket(config().getString(\"couchbase.bucketName\", \"default\"), config().getString(\"couchbase.bucketPassword\", \"\"))\r\n                .doOnNext(openedBucket -&gt; LOGGER.info(\"Bucket opened \" + openedBucket.name()))\r\n                .subscribe(\r\n                        openedBucket -&gt; bucket = openedBucket,\r\n                        startFuture::fail,\r\n                        startFuture::complete);\r\n    }<\/code><\/pre>\n<p>\uba3c\uc800 Vert.x \uc124\uc815\uc5d0\uc11c \ubc84\ud0b7\uc758 \uc774\ub984(\ubc0f \uad00\ub828 \ube44\ubc00\ubc88\ud638)\uc744 \ub3d9\uc801\uc73c\ub85c \uac00\uc838\uc635\ub2c8\ub2e4. \ubc84\ud0b7\uc744 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc5f4\uc5b4 SDK \ub0b4\ubd80\uc5d0 \uc5f0\uacb0\uacfc \ub9ac\uc18c\uc2a4\ub97c \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub9ac\uace0 <code>doOnNext<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubc84\ud0b7\uc758 \uc5f4\ub9bc\uc744 \uae30\ub85d\ud569\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7f0 \ub2e4\uc74c <code>\uad00\ucc30 \uac00\ub2a5<\/code> \uc2a4\ud2b8\ub9ac\ubc0d\ud558\uace0 \ucd5c\uc885 \ub370\uc774\ud130\ub97c '\uc18c\ube44'\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ubc84\ud0b7 \ucc38\uc870\ub97c \ubc1b\uc73c\uba74 \ub098\uc911\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud544\ub4dc\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n<li>\ub3c4\uc911\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uba74 \ubc84\ud2f0\ud074\uc758 \uc2dc\uc791\uc5d0 \uc2e4\ud328\ud569\ub2c8\ub2e4. <code>Future#fail<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 Vert.x\uc5d0 \ubc84\ud2f0\ud074\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc2dc\uc791\ub418\uc5c8\uc74c\uc744 \uc54c\ub9bd\ub2c8\ub2e4. <code>\ubbf8\ub798#\uc644\ub8cc<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uaf64 \uc88b\uc740 \uc2dc\uc791\uc785\ub2c8\ub2e4!<\/p>\n<h2 id=\"gracefully-tearing-down-the-sdk\">SDK\ub97c \uc6b0\uc544\ud558\uac8c \ud574\uccb4\ud558\uae30<\/h2>\n<p>\ubc84\ud2f0\ud074\uc774 \uc911\uc9c0\ub418\uba74 SDK\uc5d0\uc11c \uc0dd\uc131\ud55c \ub9ac\uc18c\uc2a4\ub97c \uc801\uc808\ud788 \ud3d0\uae30\ud574\uc57c \ud569\ub2c8\ub2e4. \ubc84\ud2f0\ud074\uc758 <code>\ud074\ub7ec\uc2a4\ud130<\/code> \uac1d\uccb4\uc5d0\ub294 <code>\uc5f0\uacb0 \ub04a\uae30<\/code> \uba54\uc11c\ub4dc\ub97c \uc7ac\uadc0\uc801\uc73c\ub85c \ud638\ucd9c\ud558\uc5ec \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 <code>\ub2eb\uae30<\/code> \ubaa8\ub4e0 <code>\ubc84\ud0b7<\/code> \uc5f4\ub838\uc2b5\ub2c8\ub2e4(\ub2eb\uc73c\uba74 \ud558\ub098\uc758 \ubc84\ud0b7\uc744 \ud3d0\uae30\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4).<\/p>\n<p>\ub610\ud55c <code>1.0.15<\/code> RxJava\uc5d0\ub294 \ub0b4\ubd80 \uc2a4\ub808\ub4dc\ub97c \uc885\ub8cc\ud558\ub294 \uba54\uc11c\ub4dc\uac00 \uc788\uc2b5\ub2c8\ub2e4: <code>Schedulers.shutdown<\/code>. \ud558\uc9c0\ub9cc \uc774 \ud568\uc218\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc774\ud6c4 RxJava\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc744 \uacbd\uc6b0\uc5d0\ub9cc \ud638\ucd9c\ud574\uc57c \ud558\ubbc0\ub85c Vert.x \uc885\ub8cc \uc2dc \ud638\ucd9c\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4...<\/p>\n<p>\ub2e4\uc2dc \ud55c \ubc88 \uc218\uc9c1\uc120\uc744 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc911\uc9c0\ud558\uae30 \uc704\ud574 <code>\ubbf8\ub798<\/code> \ub97c \uc0ac\uc6a9\ud558\uc5ec \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \uc644\ub8cc \uc911\uc9c0\ub97c \uc54c\ub9bd\ub2c8\ub2e4:<\/p>\n<pre class=\"java\"><code>    @Override\r\n    public void stop(Future stopFuture) throws Exception {\r\n        cluster.disconnect()\r\n                .doOnNext(isDisconnectedCleanly -&gt; LOGGER.info(\"Disconnected Cluster (cleaned threads: \" + isDisconnectedCleanly + \")\"))\r\n                .subscribe(\r\n                        isDisconnectedCleanly -&gt; stopFuture.complete(),\r\n                        stopFuture::fail,\r\n                        Schedulers::shutdown);\r\n    }<\/code><\/pre>\n<p>(SDK \uc5f0\uacb0 \ud574\uc81c \uc644\ub8cc \uc2dc RxJava\ub97c \uc885\ub8cc\ud558\ub3c4\ub85d \uc120\ud0dd\ud588\uc2b5\ub2c8\ub2e4.)<\/p>\n<blockquote><p><strong>\ucc38\uace0<\/strong> SDK\ub97c \uc870\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ud658\uacbd<\/code> \uc0dd\uc131 \uc2dc <code>\ud074\ub7ec\uc2a4\ud130<\/code>. \uc774 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc804\ud654\ud558\ub294 \uac83\ub3c4 \uc0ac\uc6a9\uc790\uc758 \ucc45\uc784\uc785\ub2c8\ub2e4. <code>\uc885\ub8cc<\/code> \ub97c \uc0ac\uc6a9\ud558\uc5ec \uc804\uccb4 SDK\ub97c \uc885\ub8cc\ud560 \ub54c(\uc989, \ud658\uacbd\uc744 \uc0ac\uc6a9\ud558\ub358 \ubaa8\ub4e0 \ud074\ub7ec\uc2a4\ud130(\uc77c\ubc18\uc801\uc73c\ub85c\ub294 \ud55c \ud074\ub7ec\uc2a4\ud130\ub9cc)\ub97c \uc885\ub8cc\ud560 \ub54c) \ud658\uacbd\uc744 \uc885\ub8cc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud2b9\uc815 \ud658\uacbd\uc744 \uc0dd\uc131\ud558\uc9c0 \uc54a\uc740 \uacbd\uc6b0 SDK\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c \ud658\uacbd\uc744 \uc0dd\uc131\ud558\uace0 \uc81c\ub300\ub85c \uc885\ub8cc\ud558\uba70, \uadf8 \uacb0\uacfc\ub294 \uc704\uc5d0 \uc788\ub294 <code>isDisconnectedCleanly<\/code> \ubcc0\uc218\uc785\ub2c8\ub2e4.<\/p><\/blockquote>\n<h2 id=\"seeing-it-in-action\">\uc2e4\uc81c\ub85c \ubcf4\uae30<\/h2>\n<p>\ube60\ub978 <code>\uba54\uc778<\/code> \ub97c \ud638\ucd9c\ud558\uc5ec \ubc84\ud2f0\ud074\uc744 \ubc30\ud3ec\ud55c \ub2e4\uc74c \uc911\uc9c0\ud569\ub2c8\ub2e4. \uc774\uac83\uc740 \uce74\uc6b4\ud2b8\ub2e4\uc6b4\ub798\uce58\ub97c \uc0ac\uc6a9\ud558\ub294 \ub9e4\uc6b0 \uc21c\uc9c4\ud55c \uad6c\ud604\uc774\uba70, \uc77c\ubc18\uc801\uc73c\ub85c \uba85\ub839\uc904\uc774\ub098 <code>\ub7f0\ucc98<\/code> \ub97c \uba54\uc778 \ud074\ub798\uc2a4\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"java\"><code>    public static void main(String[] args) throws InterruptedException {\r\n        Vertx vertx = Vertx.vertx();\r\n\r\n        final CountDownLatch startLatch = new CountDownLatch(1);\r\n        vertx.deployVerticle(new CouchbaseVerticle(), event -&gt; {\r\n            if (event.succeeded())\r\n                LOGGER.info(\"Verticle Deployed - \" + event.result());\r\n            else\r\n                LOGGER.error(\"Verticle deployment error\", event.cause());\r\n            startLatch.countDown();\r\n        });\r\n        startLatch.await();\r\n\r\n        final CountDownLatch stopLatch = new CountDownLatch(1);\r\n        vertx.close(event -&gt; {\r\n            if (event.succeeded())\r\n                LOGGER.info(\"Vert.x Stopped - \" + event.result());\r\n            else\r\n                LOGGER.error(\"Vert.x stopping error\", event.cause());\r\n            stopLatch.countDown();\r\n        });\r\n        stopLatch.await();\r\n    }<\/code><\/pre>\n<p>\uc774 \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ub0b4\uc6a9\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4(\ud0c0\uc784\uc2a4\ud0ec\ud504 \ud615\uc2dd\uc774 \ub2ec\ub77c\uc9c4 \uac83\uc774 \ubcf4\uc774\uc2dc\ub098\uc694?). <code>2015-12-11<\/code> \ub294 SDK\uc5d0\uc11c \uac00\uc838\uc628 \uac83\uc774\uace0 <code>Dec 11, 2015<\/code> \ub294 Vert.x\uc5d0\uc11c \uac00\uc838\uc628 \uac83\uc785\ub2c8\ub2e4):<\/p>\n<pre class=\"txt\"><code>2015-12-11 16:21:20 INFO Node:135 - \ub85c\uceec \ud638\uc2a4\ud2b8 \ub178\ub4dc\uc5d0 \uc5f0\uacb0\ub428\r\n2015-12-11 16:21:20 INFO \uad6c\uc131 \uacf5\uae09\uc790:263 - \uae30\ubcf8 \ubc84\ud0b7\uc744 \uc5f4\uc5c8\uc2b5\ub2c8\ub2e4.\r\nDec 11, 2015 4:21:20 PM com.couchbase.demo.vertx.CouchbaseVerticle\r\nINFO: \ubc84\ud0b7\uc774 \uae30\ubcf8\uac12\uc73c\ub85c \uc5f4\ub838\uc2b5\ub2c8\ub2e4.\r\nDec 11, 2015 4:21:20 PM com.couchbase.demo.vertx.CouchbaseVerticle\r\nINFO: \ubc84\ud2f0\ud074 \ubc30\ud3ec\ub428 - caf06dd3-c8d1-4b89-8de0-58f09467b805\r\n2015-12-11 16:21:20 INFO \uad6c\uc131 \uacf5\uae09\uc790:284 - \ub2eb\ud78c \ubc84\ud0b7 \uae30\ubcf8\uac12\r\n2015-12-11 16:21:20 \uc815\ubcf4 \ub178\ub4dc:145 - \ub85c\uceec \ud638\uc2a4\ud2b8 \ub178\ub4dc\uc5d0\uc11c \uc5f0\uacb0 \ub04a\uae40\r\nDec 11, 2015 4:21:22 PM com.couchbase.demo.vertx.CouchbaseVerticle\r\nINFO: \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c4 \ud074\ub7ec\uc2a4\ud130(\uc815\ub9ac\ub41c \uc2a4\ub808\ub4dc: true)\r\nDec 11, 2015 4:21:22 PM com.couchbase.demo.vertx.CouchbaseVerticle\r\nINFO: Vert.x \uc911\uc9c0\ub428 - null<\/code><\/pre>\n<p>\uc624\ub958 \ub3d9\uc791\uc744 \uc5b4\ub5bb\uac8c \ud655\uc778\ud558\ub098\uc694? \ub85c\uadf8\ub97c \ud655\uc778\ud558\uae30 \uc704\ud574 \ube44\ubc00\ubc88\ud638\ub97c \uc798\ubabb\ub41c \ube44\ubc00\ubc88\ud638\ub85c \ubcc0\uacbd\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4:<\/p>\n<pre><code>2015-12-11 16:25:45 WARN  Endpoint:283 - [null][KeyValueEndpoint]: Authentication Failure.\r\n2015-12-11 16:25:45 WARN  ResponseStatusConverter:129 - Unknown ResponseStatus with Protocol HTTP: 401\r\n2015-12-11 16:25:45 WARN  ResponseStatusConverter:129 - Unknown ResponseStatus with Protocol HTTP: 401\r\nDec 11, 2015 4:25:45 PM com.couchbase.demo.vertx.CouchbaseVerticle\r\nSEVERE: Verticle deployment error\r\ncom.couchbase.client.java.error.InvalidPasswordException: Passwords for bucket \"default\" do not match.\r\n    at com.couchbase.client.java.CouchbaseAsyncCluster$1.call(CouchbaseAsyncCluster.java:210)\r\n    at com.couchbase.client.java.CouchbaseAsyncCluster$1.call(CouchbaseAsyncCluster.java:200)\r\n    at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$1.onError(OperatorOnErrorResumeNextViaFunction.java:99)\r\n    at rx.internal.operators.OperatorMap$1.onError(OperatorMap.java:48)\r\n    at rx.observers.Subscribers$5.onError(Subscribers.java:229)\r\n    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:197)\r\n    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:170)\r\n    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)\r\n    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\r\n    at java.util.concurrent.FutureTask.run(FutureTask.java:266)\r\n    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)\r\n    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)\r\n    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\r\n    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\r\n    at java.lang.Thread.run(Thread.java:745)\r\n\r\nDec 11, 2015 4:25:45 PM com.couchbase.demo.vertx.CouchbaseVerticle\r\nINFO: Vert.x Stopped - null<\/code><\/pre>\n<p>\uadf8\ub798\uc11c \uc800\ud76c\ub294 \uccab \ubc88\uc9f8 Couchbase Verticle\uc744 \uc131\uacf5\uc801\uc73c\ub85c \ubc30\ud3ec(\uadf8\ub9ac\uace0 \uc911\ub2e8)\ud588\uc2b5\ub2c8\ub2e4!<br \/>\n<strong>\ud558\uc774\ud30c\uc774\ube0c!<\/strong><\/p>\n<blockquote><p>\/! <em>\ube44\ubc00\ubc88\ud638\ub97c \uc62c\ubc14\ub978 \ube44\ubc00\ubc88\ud638\ub85c \ub2e4\uc2dc \ubcc0\uacbd\ud558\ub294 \uac83\uc744 \uc78a\uc9c0 \ub9c8\uc138\uc694.<\/em><\/p><\/blockquote>\n<h2 id=\"going-further\">\ub354 \ub098\uc544\uac00\uae30<\/h2>\n<p>\uc774 Verticle\ub85c \uc870\uae08 \ub354 \ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. Couchbase\uc5d0\uc11c \uc0d8\ud50c \ub370\uc774\ud130\ub97c \uc900\ube44\ud558\uc5ec Vert.x\uc5d0\uc11c \uad00\ub9ac\ud558\ub294 REST \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0\uc11c \uc81c\uacf5\ud574 \ubcf4\ub3c4\ub85d \ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 id=\"creating-sample-data-in-couchbase-on-startup\">\uc2dc\uc791 \uc2dc Couchbase\uc5d0\uc11c \uc0d8\ud50c \ub370\uc774\ud130 \ub9cc\ub4e4\uae30<\/h2>\n<p>Verticle\uc744 \uc2dc\uc791\ud558\ub294 \ub3d9\uc548 Couchbase\uc5d0\uc11c \ub450 \uac1c\uc758 \uc0d8\ud50c \ubb38\uc11c, \uc0ac\uc6a9\uc790 Alice\uc640 Bob\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub450 \uac00\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc5ec Couchbase\uc5d0 JSON\uc744 \uc800\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>\ubb38\uc11c<\/code> \uad6c\ud604:<\/p>\n<ul>\n<li><code>JsonDocument<\/code> \uac00 \uae30\ubcf8\uac12\uc785\ub2c8\ub2e4. \uc774\ub294 SDK\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uac04\ub2e8\ud55c JSON \ud45c\ud604\uc778 <code>JsonObject<\/code>.<\/li>\n<li><code>RawJsonDocument<\/code> \ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \uc774\ubbf8 JSON \ub9c8\uc0ec\ub9c1\/\uc5b8\ub9c8\uc0ec\ub9c1\uc774 \uc788\uc744 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4(\ub610\ub294 Vert.x \uc790\uccb4\uc758 <code>JsonObject<\/code>). \uc774 \uad6c\ud604\uc5d0\uc11c \uc804\ub2ec\ub418\ub294 \uac83\uc740 \uc6d0\uc2dc JSON \ubb38\uc790\uc5f4 \ud45c\ud604\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\ub2e4\uc74c\uc740 \ub450 \uac00\uc9c0 \ub300\uc548\uc744 \ubaa8\ub450 \uc0ac\uc6a9\ud558\uc5ec \ub9cc\ub4e0 \uc568\ub9ac\uc2a4\uc640 \ubc25\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"java\"><code>JsonDocument.create(\"user1\", com.couchbase.client.java.document.json.JsonObject.create()\r\n                            .put(\"name\", \"Alice\").put(\"age\", 26))<\/code><\/pre>\n<p>\uadf8\ub9ac\uace0<\/p>\n<pre class=\"java\"><code>RawJsonDocument.create(\"user2\", new JsonObject().put(\"name\", \"Bob\").put(\"age\", 31).encode())<\/code><\/pre>\n<p>\uc774\uc81c \uc2dc\uc791 \ubc29\ubc95\uc5d0 \uc57d\uac04\uc758 \uc870\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uad6c\ub3c5\uc5d0 \ubc84\ud0b7\uc5d0 \ub300\ud55c \ucc38\uc870\ub97c \uc800\uc7a5\ud558\ub294 \ub300\uc2e0 \uad6c\ub3c5\uc758 <code>doOnNext<\/code>. \uadf8\ub7f0 \ub2e4\uc74c, \ubb38\uc11c\ub97c \uc0dd\uc131\ud558\uace0 <code>Observable.just<\/code>. \ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc0bd\uc785\uc744 \uc704\ud574 SDK\ub85c \uc804\ub2ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>\ud50c\ub7ab\ub9f5<\/code>:<\/p>\n<pre class=\"java\"><code>@Override\r\n    public void start(Future startFuture) throws Exception {\r\n        cluster.openBucket(config().getString(\"couchbase.bucketName\", \"default\"), config().getString(\"couchbase.bucketPassword\", \"\"))\r\n                .doOnNext(openedBucket -&gt; LOGGER.info(\"Bucket opened \" + openedBucket.name()))\r\n                .doOnNext(openedBucket -&gt; bucket = openedBucket)\r\n                .flatMap(nowIgnoreBucket -&gt; Observable.just(\r\n                            JsonDocument.create(\"user1\", com.couchbase.client.java.document.json.JsonObject.create()\r\n                                    .put(\"name\", \"Alice\").put(\"age\", 26)),\r\n                            RawJsonDocument.create(\"user2\", new JsonObject().put(\"name\", \"Bob\").put(\"age\", 31).encode())\r\n                    ))\r\n                .flatMap(doc -&gt; bucket.upsert(doc))\r\n                .subscribe(Actions.empty(),\r\n                        startFuture::fail,\r\n                        startFuture::complete);\r\n    }<\/code><\/pre>\n<p>\uc0ac\uc6a9 <code>\uc5c5\uc11c\ud2b8<\/code> \ub97c \uc0ac\uc6a9\ud558\uba74 \ud0a4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc774\ubbf8 \uc788\ub294\uc9c0 \uc5ec\ubd80\uc5d0 \uad00\uacc4\uc5c6\uc774 \ubb38\uc11c\uac00 \uc0dd\uc131\ub429\ub2c8\ub2e4.<\/p>\n<h2 id=\"serving-json-data-from-couchbase\">Couchbase\uc5d0\uc11c JSON \ub370\uc774\ud130 \uc11c\ube44\uc2a4\ud558\uae30<\/h2>\n<p>\ubc14\ub85c \uba48\ucd94\uc9c0 \uc54a\uace0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c json \ubb38\uc11c\ub97c \uac80\uc0c9\ud558\uc5ec \ud074\ub77c\uc774\uc5b8\ud2b8\ub85c \uc804\uc1a1\ud558\ub294 HTTP \uc11c\ubc84\ub97c \ub3cc\ub9ac\ub294 \ub300\uc2e0 \uacbd\ub85c\uac00 \ub2e4\uc74c\uacfc \uac19\ub3c4\ub85d \uc218\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <code>user\/{id}<\/code> \uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4:<\/p>\n<p>\ub2e4\uc74c\uc740 Vert.x\ub97c \ube60\ub974\uace0 \uac04\ub2e8\ud558\uac8c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. <code>\ub7f0\ucc98<\/code> \ub97c \ud074\ub9ad\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4(Vert.x \ucf54\uc5b4\uac00 \ubc14\ub85c \uc911\uc9c0\ub418\uc9c0\ub294 \uc54a\uc74c). \uc6b0\ub9ac\uc758 <code>\uba54\uc778<\/code> \uba54\uc11c\ub4dc\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"java\"><code>String[] vertxArgs = new String[] { \"run\", \"com.couchbase.demo.vertx.CouchbaseVerticle\" };\r\nLauncher.main(vertxArgs);<\/code><\/pre>\n<blockquote><p><strong>\ucc38\uace0<\/strong>: \uc2e4\uc81c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c, <code>\ub7f0\ucc98<\/code> \uac00 \ubcf4\ud1b5 jar\uc758 \uba54\uc778 \ud074\ub798\uc2a4\uac00 \ub418\uace0 \uba85\ub839\uc904 \uc778\uc218\ub97c \uc9c1\uc811 \uc804\ub2ec\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p><\/blockquote>\n<p>\uc774\uc81c Verticle\uc5d0\uc11c HTTP \uc11c\ubc84\ub97c \uc2dc\uc791\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uccb4\uc778\uc5d0 \ub2e4\uc74c \ucf54\ub4dc\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. <code>\uc2dc\uc791<\/code> \uba54\uc11c\ub4dc \ubc14\ub85c \ub4a4\uc5d0 <code>flatMap(doc -&gt; bucket.upsert(doc))<\/code> \ud638\ucd9c\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"java\"><code>.last()\r\n.flatMap(ignore -&gt; vertx.createHttpServer()\r\n                        .requestHandler(this::handle)\r\n                        .listenObservable(8080))<\/code><\/pre>\n<p>\uc6b0\ub9ac\ub294 <code>\ud578\ub4e4<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud574\ub2f9 \uacbd\ub85c\ub97c \uc124\uc815\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"java\"><code>\r\n    private void handle(HttpServerRequest r) {\r\n        String[] path = r.path().split(\"\/\");\r\n        if (path.length == 3 &amp;&amp; \"users\".equals(path[1])) {\r\n            bucket.get(path[2], RawJsonDocument.class)\r\n                    .switchIfEmpty(Observable.error(new DocumentDoesNotExistException(path[2])))\r\n                    .subscribe(doc -&gt; r.response()\r\n                                    .putHeader(\"content-type\", \"application\/json\")\r\n                                    .end(doc.content()),\r\n                        error -&gt; {\r\n                            r.response()\r\n                            .putHeader(\"content-type\", \"application\/json\")\r\n                                    .setStatusCode(500).setStatusMessage(error.toString())\r\n                                    .end(\"{\"error\": \"\" + error.toString() + \"\"}\");\r\n                        });\r\n        }\r\n    }<\/code><\/pre>\n<p>\ud14c\uc2a4\ud2b8\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2e4\ud589\ud558\uace0 \uc774 URL\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4: <a class=\"uri\" href=\"https:\/\/localhost:8080\/users\/user1\">https:\/\/localhost:8080\/users\/user1<\/a>. Couchbase\uc5d0\uc11c \uc9c1\uc811 \uc81c\uacf5\ub418\ub294 Alice\uc758 JSON\uc744 \ubcf4\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4!<\/p>\n<pre class=\"json\"><code>{\r\n    \"name\": \"Alice\",\r\n    \"age\": 26\r\n}<\/code><\/pre>\n<p>For <a href=\"https:\/\/localhost:8080\/users\/user3\">\ub610 \ub2e4\ub978 \ud0a4<\/a>\ub97c \ud074\ub9ad\ud558\uba74 JSON \ud615\uc2dd\uc73c\ub85c \uc608\uc678\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4:<\/p>\n<pre class=\"json\"><code>{\r\n    \"error\": \"com.couchbase.client.java.error.DocumentDoesNotExistException: user3\"\r\n}<\/code><\/pre>\n<h2 id=\"stopping-the-verticle-via-a-http-endpoint\">HTTP \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ud1b5\ud574 \ubc84\ud2f0\ud074 \uc911\uc9c0\ud558\uae30<\/h2>\n<p>\uc7ac\ubbf8\uc640 \uc774\uc775\uc744 \uc704\ud574 Vert.x\ub97c \uc911\uc9c0\ud558\ub294 \uacbd\ub85c\ub97c \ube60\ub974\uac8c \ucd94\uac00\ud574 \ubd05\uc2dc\ub2e4 :)<\/p>\n<pre class=\"java\"><code>\/\/...replacing from the last line in `handle`\r\n} else if (r.path().equals(\"\/stop\")) {\r\n    r.response()\r\n     .end(\"<\/code><\/pre>\n<h2>Couchbase \ubc0f Vertx \uc885\ub8cc<\/h2>\n<p><i>vertx \uc2a4\ud0c0\ud130\uc5d0\uc11c \uc2e4\ud589\ud558\uba74 \uba54\uc778 \uc2a4\ub808\ub4dc\uac00 \uc8fd\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/i><\/p>\n<p>\"); vertx.close(); }<\/p>\n<p>\uc5f4\uae30 <a class=\"uri\" href=\"https:\/\/localhost:8080\/stop\">https:\/\/localhost:8080\/stop<\/a> \ub97c \ud638\ucd9c\ud558\uba74 \uc804\uccb4 Vert.x \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc911\uc9c0\ub418\uace0 \ubc30\ud3ec\ub41c Verticles\uac00 \uc81c\uac70\ub429\ub2c8\ub2e4.<\/p>\n<blockquote><p><strong>\ucc38\uace0<\/strong>: \uba54\uc2dc\uc9c0\uc5d0\uc11c \uc124\uba85\ud55c \uac83\ucc98\ub7fc IDE\uc5d0\uc11c \uc2e4\ud589\ud574\ub3c4 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p><\/blockquote>\n<h2 id=\"conclusion\">\uacb0\ub860<\/h2>\n<p>\uc774 \ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc744 \uc54c\uc544\ubd24\uc2b5\ub2c8\ub2e4. <code>Vert.x<\/code> \ubc0f <code>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc790\ubc14 SDK<\/code> \ub294 \uc644\uc804\ud55c \ube44\ub3d9\uae30 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\uae30 \uc704\ud574 \ud568\uaed8 \uc791\uc5c5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud589\ubcf5\ud55c \ube44\ub3d9\uae30 \ucf54\ub529!<\/p>","protected":false},"excerpt":{"rendered":"<p>In this post we&#8217;ll go reactive all the way! Some Couchbase customers use Vert.x, a framework for writing fully asynchronous applications, knowing that the Couchbase Java SDK fits well into this picture, being asynchronous from the ground up and exposing [&hellip;]<\/p>","protected":false},"author":48,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1818],"tags":[1439,1516],"ppma_author":[9022],"class_list":["post-2046","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-asynchronous","tag-reactive"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v26.3) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using Couchbase Java SDK to write a Vert.x Verticle - 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\/couchbase-java-sdk-writing-vertx-verticle\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Couchbase Java SDK to write a Vert.x Verticle\" \/>\n<meta property=\"og:description\" content=\"In this post we&#8217;ll go reactive all the way! Some Couchbase customers use Vert.x, a framework for writing fully asynchronous applications, knowing that the Couchbase Java SDK fits well into this picture, being asynchronous from the ground up and exposing [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-java-sdk-writing-vertx-verticle\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-16T19:35:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T08:41:38+00:00\" \/>\n<meta name=\"author\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\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-java-sdk-writing-vertx-verticle\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/\"},\"author\":{\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\"},\"headline\":\"Using Couchbase Java SDK to write a Vert.x Verticle\",\"datePublished\":\"2015-12-16T19:35:30+00:00\",\"dateModified\":\"2024-09-12T08:41:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/\"},\"wordCount\":1294,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"asynchronous\",\"Reactive\"],\"articleSection\":[\"Java\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/\",\"name\":\"Using Couchbase Java SDK to write a Vert.x Verticle - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-12-16T19:35:30+00:00\",\"dateModified\":\"2024-09-12T08:41:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#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\/couchbase-java-sdk-writing-vertx-verticle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Couchbase Java SDK to write a Vert.x Verticle\"}]},{\"@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\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"caption\":\"Simon Basle, Software Engineer, Pivotal\"},\"description\":\"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using Couchbase Java SDK to write a Vert.x Verticle - 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\/couchbase-java-sdk-writing-vertx-verticle\/","og_locale":"ko_KR","og_type":"article","og_title":"Using Couchbase Java SDK to write a Vert.x Verticle","og_description":"In this post we&#8217;ll go reactive all the way! Some Couchbase customers use Vert.x, a framework for writing fully asynchronous applications, knowing that the Couchbase Java SDK fits well into this picture, being asynchronous from the ground up and exposing [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-java-sdk-writing-vertx-verticle\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-12-16T19:35:30+00:00","article_modified_time":"2024-09-12T08:41:38+00:00","author":"Simon Basle, Software Engineer, Pivotal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon Basle, Software Engineer, Pivotal","Est. reading time":"5\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/"},"author":{"name":"Simon Basle, Software Engineer, Pivotal","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1"},"headline":"Using Couchbase Java SDK to write a Vert.x Verticle","datePublished":"2015-12-16T19:35:30+00:00","dateModified":"2024-09-12T08:41:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/"},"wordCount":1294,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["asynchronous","Reactive"],"articleSection":["Java"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/","name":"Using Couchbase Java SDK to write a Vert.x Verticle - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-12-16T19:35:30+00:00","dateModified":"2024-09-12T08:41:38+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-java-sdk-writing-vertx-verticle\/#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\/couchbase-java-sdk-writing-vertx-verticle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Couchbase Java SDK to write a Vert.x Verticle"}]},{"@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\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4, \ud53c\ubcf4\ud0c8","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854","url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","caption":"Simon Basle, Software Engineer, Pivotal"},"description":"Simon Basl_\uc740 \ud30c\ub9ac\uc5d0 \uac70\uc8fc\ud558\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4\ub85c \ud53c\ubcf4\ud0c8\uc758 Spring \ud300\uc5d0\uc11c \uadfc\ubb34\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc804\uc5d0\ub294 Couchbase Java SDK \ud300\uc5d0\uc11c \uadfc\ubb34\ud588\uc2b5\ub2c8\ub2e4. \uadf8\uc758 \uad00\uc2ec \ubd84\uc57c\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4 \uce21\uba74(OOP, \ub514\uc790\uc778 \ud328\ud134, \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc544\ud0a4\ud14d\ucc98), \ub9ac\uce58 \ud074\ub77c\uc774\uc5b8\ud2b8, \ucf54\ub4dc \ub108\uba38\uc758 \uac83(\uc9c0\uc18d\uc801 \ud1b5\ud569, (D)VCS, \ubaa8\ubc94 \uc0ac\ub840), \ubc18\uc751\ud615 \ud504\ub85c\uadf8\ub798\ubc0d \ub4f1 \ub2e4\uc591\ud569\ub2c8\ub2e4. \ub610\ud55c \ud504\ub791\uc2a4\uc5b4 \ubc84\uc804\uc758 InfoQ.com\uc758 \ud3b8\uc9d1\uc790\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4.","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/simon-basle\/"}]}},"authors":[{"term_id":9022,"user_id":48,"is_guest":0,"slug":"simon-basle","display_name":"Simon Basle, Software Engineer, Pivotal","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","author_category":"","last_name":"Basle","first_name":"Simon","job_title":"","user_url":"","description":"Simon Basl_\uc740 \ud30c\ub9ac\uc5d0 \uac70\uc8fc\ud558\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4\ub85c \ud53c\ubcf4\ud0c8\uc758 Spring \ud300\uc5d0\uc11c \uadfc\ubb34\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc804\uc5d0\ub294 Couchbase Java SDK \ud300\uc5d0\uc11c \uadfc\ubb34\ud588\uc2b5\ub2c8\ub2e4. \uadf8\uc758 \uad00\uc2ec \ubd84\uc57c\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4 \uce21\uba74(OOP, \ub514\uc790\uc778 \ud328\ud134, \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc544\ud0a4\ud14d\ucc98), \ub9ac\uce58 \ud074\ub77c\uc774\uc5b8\ud2b8, \ucf54\ub4dc \ub108\uba38\uc758 \uac83(\uc9c0\uc18d\uc801 \ud1b5\ud569, (D)VCS, \ubaa8\ubc94 \uc0ac\ub840), \ubc18\uc751\ud615 \ud504\ub85c\uadf8\ub798\ubc0d \ub4f1 \ub2e4\uc591\ud569\ub2c8\ub2e4. \ub610\ud55c \ud504\ub791\uc2a4\uc5b4 \ubc84\uc804\uc758 InfoQ.com\uc758 \ud3b8\uc9d1\uc790\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2046","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\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=2046"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2046\/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=2046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=2046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=2046"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=2046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}