{"id":715,"date":"2016-07-05T11:24:12","date_gmt":"2016-07-05T11:24:12","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/"},"modified":"2016-07-05T11:24:12","modified_gmt":"2016-07-05T11:24:12","slug":"give-some-ratpack-love-to-your-spring-boot-application","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/give-some-ratpack-love-to-your-spring-boot-application\/","title":{"rendered":"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub7ab\ud329 \uc0ac\ub791\uc744 \ubd88\uc5b4\ub123\uc73c\uc138\uc694"},"content":{"rendered":"<p class=\"wp-block-paragraph\">\uc800\ub294 \ucd5c\uadfc\uc5d0 Ratpack\uc744 \uc0ac\uc6a9\ud558\uae30 \uc2dc\uc791\ud588\ub294\ub370 \uaf64 \ub9c8\uc74c\uc5d0 \ub4ed\ub2c8\ub2e4. \uc8fc\ub85c \ucc98\uc74c\ubd80\ud130 \uc2dc\uc791\ud558\ub294 \uac04\ub2e8\ud55c \ud504\ub85c\uc81d\ud2b8\ub4e4\uc744 \uc9c4\ud589\ud588\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uae30\uc874 \uc2a4\ud504\ub9c1 \ubd80\ud2b8(Spring Boot) \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc804\ud1b5\uc801\uc778 MVC \ubd80\ubd84\uc744 \ub300\uccb4\ud558\uae30 \uc704\ud574 \uadf8\uac83\uc744 \uc0ac\uc6a9\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \uc774\uac83\uc740 \ubaa8\ub4e0 \uac83\uc774 \uc774\ubbf8 \uc798 \ub9c8\ub828\ub418\uc5b4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc2e4\uc81c\ub85c \uc27d\uac8c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/ratpack.io\/manual\/current\/spring.html\">\uc2a4\ud504\ub9c1 \ubaa8\ub4c8<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ube14\ub85c\uadf8\ub97c \uad6c\ub3c5\ud558\uc2e0\ub2e4\uba74 \uc5d0 \uad00\ud55c \uc608\uc804 \uac8c\uc2dc\ubb3c\uc744 \uae30\uc5b5\ud558\uc2e4\uc9c0\ub3c4 \ubaa8\ub985\ub2c8\ub2e4 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/storing-indexing-searching-files-couchbase-spring-boot\/\">\uc800\uc7a5, \uc0c9\uc778 \ubc0f \uac80\uc0c9<\/a> ~\uac00 \uc788\ub294 \ud30c\uc77c <a href=\"https:\/\/developer.couchbase.com\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a> \uadf8\ub9ac\uace0 \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/ldoguin\/store-search-files\">\uad00\ub828 \ucf54\ub4dc<\/a> \uc608\ub97c \ub4e4\uc5b4, \ud575\uc2ec \uc544\uc774\ub514\uc5b4\ub294 Spring MVC\ub97c Ratpack\uc73c\ub85c \uad50\uccb4\ud558\uace0 \uae30\uc874\uc758 \ub808\uac70\uc2dc, \ub3d9\uae30\uc2dd, \ube14\ub85c\ud0b9 \uc11c\ube44\uc2a4\ub97c \ube44\ub3d9\uae30 \ubc0f \ub10c\ube14\ub85c\ud0b9(non-blocking) \ubc29\uc2dd\uc73c\ub85c \uc804\ud658\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uacb0\uacfc \ucf54\ub4dc\ub294 \ub2e4\uc74c\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/ldoguin\/store-search-files\">\uae43\ud5c8\ube0c<\/a> \ub610\ud55c.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uc62c\ubc14\ub978 \uc758\uc874\uc131 \ucd94\uac00\ud558\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub098\ub294 Gradle\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4. Ratpack\uc740 \uc774\uac83\uacfc \ub9e4\uc6b0 \uc798 \ud1b5\ud569\ub418\uc5b4 \uc788\ub2e4. \ubaa8\ub4c8\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \ud574\uc57c \ud560 \uc77c\uc740 \uc62c\ubc14\ub978 \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\uc5ec \ucd94\uac00\ud558\ub294 \uac83\ubfd0\uc774\ub2e4. <code>ratpack.dependency(\"myFavoriteModule\")<\/code>. \ub530\ub77c\uc11c \uc800\ud76c\uc758 \uacbd\uc6b0, Spring Boot\uc5d0 \ub300\ud55c \uc9c0\uc6d0\uc744 \ucd94\uac00\ud558\ub824\uba74 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4 <code>ratpack.dependency(\"spring-boot\")<\/code>. \uc548\ud0c0\uae5d\uac8c\ub3c4 Ratpack\uc774 \uc790\ub3d9\uc73c\ub85c \uad00\ub9ac\ud558\ub294 \ubc84\uc804\uc740 \uc790\ub3d9 Couchbase \uad6c\uc131\uc744 \uc9c0\uc6d0\ud558\ub294 \ubc84\uc804\uc778 1.4.0.M3\ubcf4\ub2e4 \ub0ae\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc774\ubc88\uc5d0\ub294 \uc758\uc874\uc131\uc744 \uc218\ub3d9\uc73c\ub85c \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    dependencies {\n      compile ratpack.dependency(\"guice\"),\n              ratpack.dependency(\"rx\"),\n              ratpack.dependency(\"handlebars\"),\n              \"com.couchbase.client:java-client:2.3.1\",\n              \"org.springframework.boot:spring-boot-autoconfigure:1.4.0.M3\",\n              \"io.ratpack:ratpack-spring-boot:1.3.3\",\n              \"org.slf4j:slf4j-simple:1.7.12\",\n              \"org.codehaus.plexus:plexus-utils:3.0.21\",\n              \"commons-codec:commons-codec:1.10\" \n    }\r\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \ubcfc \uc218 \uc788\ub294 \uac83\uc740 <code>ratpack.dependency(\"spring-boot\")<\/code> \ucd94\uac00\ud558\ub294 \ubc14\ub85c \uac00\uae30\uc785\ub2c8\ub2e4 <code>org.springframework.boot:spring-boot-autoconfigure:1.4.0.M3<\/code> \uadf8\ub9ac\uace0 <code>io.ratpack:ratpack-spring-boot:1.3.3<\/code>. \uc774 \ubaa8\ub4c8\uc744 \uc0ac\uc6a9\ud558\uba74 Ratpack \uc11c\ubc84\ub97c Spring \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ud1b5\ud569\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ratpack \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c Spring @Bean\uc744 \uac00\uc838\uc624\uace0, \ud578\ub4e4\ub7ec\ub97c Spring \uad6c\uc131\uc73c\ub85c \uc120\uc5b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ratpack \uad6c\uc131 \uc120\uc5b8<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Spring Boot\uc5d0\uc11c \uc815\ub9d0 \uc88b\uc544\ud574\uc57c \ud560 \ud55c \uac00\uc9c0\ub294 \uc790\ub3d9 \uc124\uc815\uc785\ub2c8\ub2e4. Couchbase SDK\uac00 \ud074\ub798\uc2a4\ud328\uc2a4\uc5d0 \uc788\uace0 \uc18d\uc131\uc774 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. <code>spring.couchbase.bootstrap-hosts<\/code> \uac00 \uc120\uc5b8\ub429\ub2c8\ub2e4. \uadf8 \uc21c\uac04 Spring \ube48\uc774 \uae30\ubcf8 \ubc84\ud0b7\uc744 \uc704\ud574 \uc778\uc2a4\ud134\uc2a4\ud654\ub429\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc774 \ubc84\ud0b7 \uc778\uc2a4\ud134\uc2a4\ub294 \ube48\uc73c\ub85c \ub610\ub294 Ratpack\uc758 \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c Ratpack \ub808\uc774\uc5b4\uc5d0 Couchbase\uc6a9 \ubc14\uc778\ub529\uc744 \uc120\uc5b8\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ratpack\uc73c\ub85c \uc804\ud1b5\uc801\uc73c\ub85c \uac00\uc7a5 \uba3c\uc800 \ud558\ub294 \uc77c\uc740 \uc11c\ubc84\ub97c \uc2dc\uc791\ud558\uace0 \uc124\uc815\uacfc \ud578\ub4e4\ub7ec\ub97c \uc815\uc758\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \uc774\ubbf8 \uc2e4\ud589 \uc911\uc778 Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4. @Configuration\uc774 \uc8fc\uc11d\uc73c\ub85c \uc9c0\uc815\ub41c \ubaa8\ub4e0 \ud074\ub798\uc2a4\ub294 \uc790\ub3d9\uc73c\ub85c \uac10\uc9c0\ub418\uc5b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc124\uc815\uc5d0 \ucd94\uac00\ub429\ub2c8\ub2e4. \ud574\ub2f9 \uc124\uc815\uc744 \uc120\uc5b8\ud558\ub294 \uccab \ubc88\uc9f8 \ub2e8\uacc4\ub294 \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4dc\ub294 \uac83\uc785\ub2c8\ub2e4 <em>RatpackServerCustomizer<\/em> \uadf8\ub9ac\uace0 @Configuration\uc73c\ub85c \uc5b4\ub178\ud14c\uc774\ud2b8\ud558\uc138\uc694. \uc774\ub97c \ud1b5\ud574 \ud578\ub4e4\ub7ec, \ubc14\uc778\ub529, \uadf8\ub9ac\uace0 \uc11c\ubc84 \uc124\uc815 \ubaa9\ub85d\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \uc608\uc81c\uc5d0\uc11c\ub294 \uba87 \uac00\uc9c0 \uc11c\ubc84 \uc18d\uc131\uc744 \ub4f1\ub85d\ud558\uace0 \uc5ec\ub7ec \ud074\ub798\uc2a4\ub97c Ratpack\uc758 \ucee8\ud14d\uc2a4\ud2b8\uc5d0 \ubc14\uc778\ub529\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \u2018server.maxContentLength\u2019 \uc18d\uc131\uc740 \uc5c5\ub85c\ub4dc\ud560 \uc218 \uc788\ub294 \ud30c\uc77c\uc758 \ucd5c\ub300 \ud06c\uae30\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    package org.couchbase.devex;\r\n\r\n    import java.util.ArrayList;\r\n    import java.util.Collections;\r\n    import java.util.List;\r\n    import java.util.Map;\r\n\r\n    import org.couchbase.devex.domain.StoredFileRenderer;\r\n    import org.couchbase.devex.service.SearchService;\r\n    import org.springframework.context.annotation.Configuration;\r\n\r\n    import com.google.common.collect.ImmutableMap;\r\n\r\n    import ratpack.form.Form;\r\n    import ratpack.func.Action;\r\n    import ratpack.guice.BindingsSpec;\r\n    import ratpack.handlebars.HandlebarsModule;\r\n    import ratpack.handlebars.Template;\r\n    import ratpack.handling.Chain;\r\n    import ratpack.rx.RxRatpack;\r\n    import ratpack.server.BaseDir;\r\n    import ratpack.server.ServerConfigBuilder;\r\n    import ratpack.spring.config.RatpackServerCustomizer;\r\n    import rx.Observable;\r\n\r\n    @Configuration\r\n    public class RatpackConfiguration implements RatpackServerCustomizer {\r\n\r\n        @Override\r\n        public List getHandlers() {\r\n            List handlers = new ArrayList();\r\n            handlers.add(fileApi());\r\n            return handlers;\r\n        }\r\n\r\n        @Override\r\n        public Action getServerConfig() {\r\n            return config -&gt; config.baseDir(BaseDir.find())\r\n                    .props(ImmutableMap.of(&quot;server.maxContentLength&quot;, &quot;100000000&quot;, &quot;app.name&quot;, &quot;Search Store File&quot;));\r\n\r\n        }\r\n\r\n        @Override\r\n        public Action getBindings() {\r\n            return bindingConfig -&gt; bindingConfig.module(HandlebarsModule.class).bind(FileHandler.class)\r\n                    .bind(StoredFileRenderer.class).bind(ErrorHandlerImpl.class).bind(ClientHandlerImpl.class);\r\n        }\r\n\r\n        private Action fileApi() {\r\n            return chain -&gt; chain.prefix(&quot;file&quot;, FileHandler.class).post(&quot;fulltext&quot;, ctx -&gt; {\r\n                ctx.parse(Form.class).then(form -&gt; {\r\n                    String queryString = form.get(&quot;queryString&quot;);\r\n                    SearchService searchService = ctx.get(SearchService.class);\n                    Observable&lt;map&gt; files = searchService.searchFulltextFiles(queryString);\r\n                    RxRatpack.promise(files).then(response -&gt; ctx\r\n                            .render(Template.handlebarsTemplate(&quot;uploadForm&quot;, &quot;text\/html&quot;, m -&gt; m.put(&quot;files&quot;, response))));\r\n                });\n            }).post(&quot;n1ql&quot;, ctx -&gt; {\n                ctx.parse(Form.class).then(form -&gt; {\n                    String queryString = form.get(&quot;queryString&quot;);\r\n                    SearchService searchService = ctx.get(SearchService.class);\n                    Observable&lt;map&gt; files = searchService.searchN1QLFiles(queryString);\n                    RxRatpack.promise(files).then(response -&gt; ctx\r\n                            .render(Template.handlebarsTemplate(&quot;uploadForm&quot;, &quot;text\/html&quot;, m -&gt; m.put(&quot;files&quot;, response))));\n                });\n            });\n        }\n    }\r\n&lt;\/map&lt;\/map<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud15c\ud50c\ub9bf \uc2dc\uc2a4\ud15c\uc740 Handlebars\ub97c \uae30\ubc18\uc73c\ub85c \ud558\ubbc0\ub85c HandlebarsModule\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. FileHandler\ub294 \u2018\/file\u2019 API\uc5d0 \ub300\ud55c \ubaa8\ub4e0 \ud638\ucd9c\uc744 \ucc98\ub9ac\ud558\uba70, StoredFileRenderer\ub294 StoredFile\uc774 \uc62c\ubc14\ub974\uac8c \ub80c\ub354\ub9c1\ub418\ub3c4\ub85d \ubcf4\uc7a5\ud569\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9 \ub450 \ubc14\uc778\ub529\uc740 \uc624\ub958 \ucc98\ub9ac\ub97c \uc704\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \uc77c\uc740 <code>\ud30c\uc77cAPI<\/code> \ub0b4 \ud578\ub4e4\ub7ec\ub97c \uc120\uc5b8\ud558\ub294 \uba54\uc11c\ub4dc\uc785\ub2c8\ub2e4. \ud578\ub4e4\ub7ec\ub294 \uc0ac\uc6a9\uc790\uac00 \ud2b9\uc815 URL\uc744 \ud638\ucd9c\ud588\uc744 \ub54c \uc5b4\ub5a4 \ub3d9\uc791\uc774 \uc218\ud589\ub420\uc9c0\ub97c \uc815\uc758\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \u2018\/file\/*\u2019\uc5d0 \ub300\ud55c \ubaa8\ub4e0 \ud638\ucd9c\uc744 FileHandler \ud074\ub798\uc2a4\uc640 \uc5f0\uacb0\ud569\ub2c8\ub2e4. \ub610\ud55c \u2018\/fulltext\u2019 \ubc0f \u2018\/n1ql\u2019\uc5d0 \ub300\ud55c POST \uc694\uccad\uc758 \ub3d9\uc791\ub3c4 \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ratpack\uc740 Promise\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c POST \uc694\uccad\uc5d0\uc11c Form\uc744 \ud30c\uc2f1\ud560 \ub54c Promise\ub97c \uc5bb\uac8c \ub429\ub2c8\ub2e4. \uac01 POST\uc5d0\uc11c \ubcfc \uc218 \uc788\ub4ef\uc774 SearchService\ub294 Ratpack\uc758 \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c \uac00\uc838\uc635\ub2c8\ub2e4. \uc124\uc815\uc5d0\uc11c \ubc14\uc778\ub529\ub41c \uc801\uc774 \uc5c6\ub354\ub77c\ub3c4 \ub9d0\uc785\ub2c8\ub2e4. \uc774\ub294 \ud1b5\ud569\uc758 \uc77c\ud658\uc73c\ub85c Spring \ube48\uc744 \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c \ub2e8\uacc4\ub294 Observable\uc744 \ubc18\ud658\ud558\ub294 \ud574\ub2f9 \uac80\uc0c9 \uc11c\ube44\uc2a4\ub97c \ud638\ucd9c\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. Observable\uc6a9 \ub798\ud37c\ub97c \uc81c\uacf5\ud558\ub294 Ratpack\uc758 rx-java \ubaa8\ub4c8\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\uba74 \uc774\uac83\uc774 promise\ub85c \ub798\ud551\ub429\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c \uc751\ub2f5\uc744 \uac04\ub2e8\ud788 \ub80c\ub354\ub9c1\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc2dc\uc810\uc5d0\uc11c \uc6b0\ub9ac\ub294 \ubaa8\ub4e0 Spring MVC\ub97c \uc81c\uac70\ud588\uc2b5\ub2c8\ub2e4 <a href=\"https:\/\/github.com\/ldoguin\/store-search-files\/blob\/master\/src\/main\/java\/org\/couchbase\/devex\/controller\/IndexController.java\">\ucee8\ud2b8\ub864\ub7ec<\/a>. \ubcf4\uc2dc\ub2e4\uc2dc\ud53c \uc81c \uc11c\ube44\uc2a4\ub294 Observable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\uc804 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uadf8\ub807\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ub7ab\ud329\uc6a9 \uc11c\ube44\uc2a4 \ub9c8\uc774\uadf8\ub808\uc774\uc158<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ubd80\ubd84\uc758 \uc11c\ube44\uc2a4\uac00 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4(Couchbase)\uc5d0 \uc758\uc874\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. SDK\uac00 RxJava \uae30\ubc18\uc774\uc5b4\uc11c \ub300\ubd80\ubd84 \ube44\ub3d9\uae30 \ubc0f \ub10c\ube14\ub85c\ud0b9 \ubc29\uc2dd\uc73c\ub85c \uc27d\uac8c \uc804\ud658\ud558\uace0 Observable\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">RxJava \uc0ac\uc6a9\ud558\uae30<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uac83\uc740 \uc544\uc8fc \uac04\ub2e8\ud55c \uc608\uc81c\uc785\ub2c8\ub2e4. \uacb0\uacfc\ub97c Map\uc758 List\ub85c \ub9e4\ud551\ud558\ub294 N1QL \ucffc\ub9ac\uc785\ub2c8\ub2e4. \ucc98\uc74c \ub450 \uc904\uc740 \uc8fc\ub85c \ucffc\ub9ac\ub97c \uc815\uc758\ud558\ub294 \uac83\uc774\ubbc0\ub85c \uc804\ud600 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub450 \ubc88\uc9f8 \ubc84\uc804\uc5d0\uc11c\ub294 \ub3d9\uae30\uc2dd \ubc84\ud0b7\uc744 \uc0ac\uc6a9\ud560 \ub54c \ub9e4\ud551\uc774 \ub354 \uc790\uc5f0\uc2a4\ub7fd\uac8c \ub290\uaef4\uc9c0\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    public List&lt;map&lt;string, object=&quot;&quot;&gt;&gt; searchN1QLFiles(String whereClause) {\r\n        N1qlQuery query = N1qlQuery.simple(\r\n                &quot;SELECT binaryStoreLocation, binaryStoreDigest FROM `default` WHERE type= &#039;file&#039; &quot; + whereClause);\r\n        query.params().consistency(ScanConsistency.STATEMENT_PLUS);\r\n        N1qlQueryResult res = bucket.query(query);\r\n        List&lt;map&lt;string, object=&quot;&quot;&gt;&gt; filenames = res.allRows().stream().map(row -&gt; row.value().toMap())\r\n                .collect(Collectors.toList());\r\n        return filenames;\r\n    }\r\n&lt;\/map&lt;string,&gt;&lt;\/map&lt;string,&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub41c\ub2e4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    public Observable&lt;map&lt;string, object=&quot;&quot;&gt;&gt; searchN1QLFiles(String whereClause) {\r\n        N1qlQuery query = N1qlQuery.simple(\r\n                &quot;SELECT binaryStoreLocation, binaryStoreDigest FROM `default` WHERE type= &#039;file&#039; &quot; + whereClause);\r\n        query.params().consistency(ScanConsistency.STATEMENT_PLUS);\r\n        return bucket.async().query(query).flatMap(AsyncN1qlQueryResult::rows).map(r -&gt; r.value().toMap());\r\n    }\r\n&lt;\/map&lt;string,&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ub808\uac70\uc2dc \ucf54\ub4dc\uc758 \ucc28\ub2e8\uc744 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub0b4 \uc11c\ube44\uc2a4 \uc911 \uc77c\ubd80\ub294 \uc624\ub798\ub41c \ube14\ub85c\ud0b9 \ucf54\ub4dc\uc5d0 \uc758\uc874\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ub10c\ube14\ub85c\ud0b9\uc73c\ub85c \ub9cc\ub4dc\ub294 \ub9c8\ubc95 \uac19\uc740 \ubc29\ubc95\uc740 \uc5c6\uc9c0\ub9cc, \uac04\ub2e8\ud788 Promise\ub85c \uac10\uc2f8\ub294 \uac83\uc740 \uac00\ub2a5\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ud578\ub4e4\ub7ec\uc5d0\uc11c \uc27d\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ube14\ub85c\ud0b9 \ud638\ucd9c\uc744 \uac10\uc2f8\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc26c\uc6b0\uba70, \ud568\uc218\ub97c \u2018Blocking.get()\u2019\uc73c\ub85c \uac10\uc2f8\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. \uc5ec\uae30 \uc544\uc8fc \uac04\ub2e8\ud55c \uc608\uc2dc\uac00 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    public String getSha1Digest(InputStream is) {\r\n        return DigestUtils.sha1Hex(is);\r\n    }\r\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub41c\ub2e4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    public Promise getSha1Digest(InputStream is) {\r\n        return Blocking.get(() -&gt; DigestUtils.sha1Hex(is));\r\n    }\r\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\uacb0\ub860<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 Ratpack\uc744 \uc801\uc6a9\ud558\ub294 \ub370 \ud544\uc694\ud55c \uac70\uc758 \ubaa8\ub4e0 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ube60\uc9c4 \ubd80\ubd84\uc774 \uc788\ub2e4\uace0 \ub290\uaef4\uc9c0\uc2dc\uba74 \uc800\uc5d0\uac8c \uc5f0\ub77d\ud574 \uc8fc\uc138\uc694 <a href=\"https:\/\/twitter.com\/ldoguin\">\ud2b8\uc704\ud130<\/a> \ub610\ub294 \uc544\ub798 \ub313\uae00\uc5d0 \ub0a8\uaca8\uc8fc\uc138\uc694.<\/p>","protected":false},"excerpt":{"rendered":"<p>I recently started working with Ratpack and I quite like it. I mostly did quick projects from scratch. But I would like to use it in an existing Spring Boot application to replace the traditional MVC part. This is actually easy to do as everything has been thought out already thanks to their Spring module. [&hellip;]<\/p>\n","protected":false},"author":49,"featured_media":18,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_acf":"","footnotes":""},"categories":[136,144],"tags":[],"ppma_author":[110],"class_list":["post-715","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Get start working with Ratpack - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"The idea used here in the post is to replace Spring MVC by Ratpack, and making my legacy, synchronous, blocking services async and non blocking.\" \/>\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\/give-some-ratpack-love-to-your-spring-boot-application\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Give some Ratpack Love to your Spring Boot Application\" \/>\n<meta property=\"og:description\" content=\"The idea used here in the post is to replace Spring MVC by Ratpack, and making my legacy, synchronous, blocking services async and non blocking.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/give-some-ratpack-love-to-your-spring-boot-application\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-05T11:24:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laurent Doguin\" \/>\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\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Give some Ratpack Love to your Spring Boot Application\",\"datePublished\":\"2016-07-05T11:24:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/\"},\"wordCount\":853,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Best Practices and Tutorials\",\"Java\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/\",\"name\":\"Get start working with Ratpack - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-07-05T11:24:12+00:00\",\"description\":\"The idea used here in the post is to replace Spring MVC by Ratpack, and making my legacy, synchronous, blocking services async and non blocking.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/give-some-ratpack-love-to-your-spring-boot-application\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Give some Ratpack Love to your Spring Boot Application\"}]},{\"@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\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ko\\\/author\\\/laurent-doguin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Get start working with Ratpack - The Couchbase Blog","description":"The idea used here in the post is to replace Spring MVC by Ratpack, and making my legacy, synchronous, blocking services async and non blocking.","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\/give-some-ratpack-love-to-your-spring-boot-application\/","og_locale":"ko_KR","og_type":"article","og_title":"Give some Ratpack Love to your Spring Boot Application","og_description":"The idea used here in the post is to replace Spring MVC by Ratpack, and making my legacy, synchronous, blocking services async and non blocking.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/give-some-ratpack-love-to-your-spring-boot-application\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-07-05T11:24:12+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"Laurent Doguin","Est. reading time":"7\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Give some Ratpack Love to your Spring Boot Application","datePublished":"2016-07-05T11:24:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/"},"wordCount":853,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","articleSection":["Best Practices and Tutorials","Java"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/","url":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/","name":"Get start working with Ratpack - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","datePublished":"2016-07-05T11:24:12+00:00","description":"The idea used here in the post is to replace Spring MVC by Ratpack, and making my legacy, synchronous, blocking services async and non blocking.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/give-some-ratpack-love-to-your-spring-boot-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Give some Ratpack Love to your Spring Boot Application"}]},{"@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":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4, NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4","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\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"\ub85c\ub791 \ub3c4\uac31","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"\ub85c\ub791\uc740 \ud30c\ub9ac\uc5d0 \uc0ac\ub294 \ucc0c\uc9c8\ud55c \ub9e4\ub2c8\uc544 \uae30\uc9c8\uc774 \uc788\ub294 \ud5e4\ube44\uba54\ud0c8 \ub9c8\ub2c8\uc544\uc785\ub2c8\ub2e4. \uadf8\ub294 \uc8fc\ub85c \uc790\ubc14(Java)\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0 AsciiDoc\uc73c\ub85c \uad6c\uc870\ud654\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uba70, \ub370\uc774\ud130, \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc0f \uae30\ud0c0 \uc720\ud589\uc5b4 \uac19\uc740 \uc8fc\uc81c\uc5d0 \ub300\ud574 \uc790\uc8fc \uc774\uc57c\uae30\ud569\ub2c8\ub2e4. \uadf8\ub294 \ub610\ud55c Clever Cloud\uc640 Nuxeo\uc758 \uc804\uc9c1 \uac1c\ubc1c\uc790 \uc560\ub4dc\ubcf4\ucf00\uc774\ud2b8\ub85c \ud65c\ub3d9\ud558\uba70 \ud574\ub2f9 \ucee4\ubba4\ub2c8\ud2f0\uac00 \ub354 \ud06c\uace0 \uac15\ud558\uac8c \uc131\uc7a5\ud558\ub3c4\ub85d \uc2dc\uac04\uacfc \uc804\ubb38 \uc9c0\uc2dd\uc744 \uc3df\uc544\ubd80\uc5c8\uc2b5\ub2c8\ub2e4. \ud604\uc7ac\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4(Couchbase)\uc5d0\uc11c \uac1c\ubc1c\uc790 \uad00\uacc4(Developer Relations)\ub97c \ucd1d\uad04\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/laurent-doguin\/"}]}},"acf":[],"authors":[{"term_id":110,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","first_name":"Laurent","last_name":"Doguin","user_url":"","job_title":"","description":"\ub85c\ub791\uc740 \ud30c\ub9ac\uc5d0 \uc0ac\ub294 \ucc0c\uc9c8\ud55c \ub9e4\ub2c8\uc544 \uae30\uc9c8\uc774 \uc788\ub294 \ud5e4\ube44\uba54\ud0c8 \ub9c8\ub2c8\uc544\uc785\ub2c8\ub2e4. \uadf8\ub294 \uc8fc\ub85c \uc790\ubc14(Java)\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0 AsciiDoc\uc73c\ub85c \uad6c\uc870\ud654\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uba70, \ub370\uc774\ud130, \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc0f \uae30\ud0c0 \uc720\ud589\uc5b4 \uac19\uc740 \uc8fc\uc81c\uc5d0 \ub300\ud574 \uc790\uc8fc \uc774\uc57c\uae30\ud569\ub2c8\ub2e4. \uadf8\ub294 \ub610\ud55c Clever Cloud\uc640 Nuxeo\uc758 \uc804\uc9c1 \uac1c\ubc1c\uc790 \uc560\ub4dc\ubcf4\ucf00\uc774\ud2b8\ub85c \ud65c\ub3d9\ud558\uba70 \ud574\ub2f9 \ucee4\ubba4\ub2c8\ud2f0\uac00 \ub354 \ud06c\uace0 \uac15\ud558\uac8c \uc131\uc7a5\ud558\ub3c4\ub85d \uc2dc\uac04\uacfc \uc804\ubb38 \uc9c0\uc2dd\uc744 \uc3df\uc544\ubd80\uc5c8\uc2b5\ub2c8\ub2e4. \ud604\uc7ac\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4(Couchbase)\uc5d0\uc11c \uac1c\ubc1c\uc790 \uad00\uacc4(Developer Relations)\ub97c \ucd1d\uad04\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/715","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\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=715"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/715\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/18"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=715"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=715"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=715"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=715"}],"curies":[{"name":"\uc798\ud588\uc5b4","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}