{"id":2320,"date":"2016-07-05T11:24:12","date_gmt":"2016-07-05T11:24:12","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2320"},"modified":"2019-05-07T02:40:56","modified_gmt":"2019-05-07T09:40:56","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 \uc950\ud329 \uc0ac\ub791 \uc8fc\uae30"},"content":{"rendered":"<p>\ucd5c\uadfc\uc5d0 Ratpack\uc73c\ub85c \uc791\uc5c5\uc744 \uc2dc\uc791\ud588\ub294\ub370 \uaf64 \ub9c8\uc74c\uc5d0 \ub4e4\uc5b4\uc694. \uc800\ub294 \uc8fc\ub85c \ucc98\uc74c\ubd80\ud130 \ube60\ub978 \ud504\ub85c\uc81d\ud2b8\ub97c \uc218\ud589\ud588\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uae30\uc874 Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uae30\uc874 MVC \ubd80\ubd84\uc744 \ub300\uccb4\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 \uac83\uc774 \uc774\ubbf8 \uace0\ub824\ub418\uc5b4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774\uac83\uc740 \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<p>\uc774 \ube14\ub85c\uadf8\ub97c \ud314\ub85c\uc6b0\ud558\uc2e0\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc804 \ud3ec\uc2a4\ud305\uc744 \uae30\uc5b5\ud558\uc2e4 \uac83\uc785\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/storing-indexing-searching-files-couchbase-spring-boot\/\">\uc800\uc7a5, \uc0c9\uc778\ud654 \ubc0f \uac80\uc0c9<\/a> \ud30c\uc77c\uc774 \uc788\ub294 <a href=\"https:\/\/developer.couchbase.com\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a> \ubc0f \uc2a4\ud504\ub9c1 \ubd80\ud2b8. \uc800\ub294 <a href=\"https:\/\/github.com\/ldoguin\/store-search-files\">\uad00\ub828 \ucf54\ub4dc<\/a> \ub97c \uc608\ub85c \ub4e4\uc5b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uc544\uc774\ub514\uc5b4\ub294 Spring MVC\ub97c Ratpack\uc73c\ub85c \ub300\uccb4\ud558\uace0 \uae30\uc874\uc758 \ub3d9\uae30\uc2dd \ube14\ub85c\ud0b9 \uc11c\ube44\uc2a4\ub97c \ube44\ub3d9\uae30\uc2dd \ubc0f \ube44\ube14\ub85c\ud0b9\uc73c\ub85c \ub9cc\ub4dc\ub294 \uac83\uc785\ub2c8\ub2e4. \uacb0\uacfc \ucf54\ub4dc\ub294 \ub2e4\uc74c\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/ldoguin\/store-search-files\">github<\/a> \ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4.<\/p>\n<h2>\uc62c\ubc14\ub978 \uc885\uc18d\uc131 \ucd94\uac00<\/h2>\n<p>\uc800\ub294 Gradle\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. Ratpack\uacfc \ub9e4\uc6b0 \uc798 \ud1b5\ud569\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub4c8\uc744 \ucd94\uac00\ud558\ub824\uba74 \ub2e4\uc74c\uc744 \ud638\ucd9c\ud558\uc5ec \uc62c\ubc14\ub978 \uc885\uc18d\uc131\uc744 \ucd94\uac00\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. <code>ratpack.dependency(\"myFavoriteModule\")<\/code>. \ub530\ub77c\uc11c \uc6b0\ub9ac\uc758 \uacbd\uc6b0 Spring Boot\uc5d0 \ub300\ud55c \uc9c0\uc6d0\uc744 \ucd94\uac00\ud558\ub824\uba74 \ub2e4\uc74c\uc744 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4. <code>ratpack.dependency(\"spring-boot\")<\/code>. \uc548\ud0c0\uae5d\uac8c\ub3c4 Ratpack\uc5d0\uc11c \uc790\ub3d9\uc73c\ub85c \uad00\ub9ac\ud558\ub294 \ubc84\uc804\uc740 1.4.0.M3 \ubbf8\ub9cc\uc774\uba70, \uc774 \ubc84\uc804\uc740 Couchbase \uc790\ub3d9 \uad6c\uc131\uc744 \uc81c\uacf5\ud558\ub294 \ubc84\uc804\uc785\ub2c8\ub2e4. \uadf8\ub798\uc11c \uc774\ubc88\uc5d0\ub294 \uc218\ub3d9\uc73c\ub85c \uc758\uc874\uc131\uc744 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre><code>    dependencies {\r\n      compile ratpack.dependency(\"guice\"),\r\n              ratpack.dependency(\"rx\"),\r\n              ratpack.dependency(\"handlebars\"),\r\n              \"com.couchbase.client:java-client:2.3.1\",\r\n              \"org.springframework.boot:spring-boot-autoconfigure:1.4.0.M3\",\r\n              \"io.ratpack:ratpack-spring-boot:1.3.3\",\r\n              \"org.slf4j:slf4j-simple:1.7.12\",\r\n              \"org.codehaus.plexus:plexus-utils:3.0.21\",\r\n              \"commons-codec:commons-codec:1.10\" \r\n    }\r\n<\/code><\/pre>\n<p>\uc5ec\uae30\uc11c \ubcfc \uc218 \uc788\ub294 \uac83\uc740 <code>ratpack.dependency(\"spring-boot\")<\/code> \ub97c \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\uc774 \uc81c\uacf5\ud558\ub294 \uac83\uc740 Ratpack \uc11c\ubc84\ub97c Spring \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ud1b5\ud569\ud558\ub294 \uae30\ub2a5\uc785\ub2c8\ub2e4. Ratpack \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c Spring @Beans\ub97c \uac80\uc0c9\ud558\uace0 \ud578\ub4e4\ub7ec\ub97c Spring \uad6c\uc131\uc73c\ub85c \uc120\uc5b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Ratpack \uad6c\uc131 \uc120\uc5b8<\/h2>\n<p>Spring Boot\uc758 \ud55c \uac00\uc9c0 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \uc810\uc740 \uc790\ub3d9 \uad6c\uc131\uc785\ub2c8\ub2e4. Couchbase SDK\uac00 \ud074\ub798\uc2a4 \uacbd\ub85c\uc5d0 \uc788\ub294\uc9c0, \uadf8\ub9ac\uace0 \uc18d\uc131 <code>spring.couchbase.bootstrap-hosts<\/code> \uac00 \uc120\uc5b8\ub429\ub2c8\ub2e4. \uadf8 \uc21c\uac04 \uae30\ubcf8 \ubc84\ud0b7\uc5d0 \ub300\ud574 Spring \ube48\uc774 \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\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c Ratpack \ub808\uc774\uc5b4\uc5d0\uc11c Couchbase\uc5d0 \ub300\ud55c \ubc14\uc778\ub529\uc744 \uc120\uc5b8\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc77c\ubc18\uc801\uc73c\ub85c Ratpack\uc5d0\uc11c \uac00\uc7a5 \uba3c\uc800 \ud558\ub294 \uc77c\uc740 \uc11c\ubc84\ub97c \uc2dc\uc791\ud558\uace0 \uad6c\uc131 \ubc0f \ud578\ub4e4\ub7ec\ub97c \uc815\uc758\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc5d0\ub294 \uc774\ubbf8 Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc2e4\ud589 \uc911\uc785\ub2c8\ub2e4. \uad6c\uc131\uc73c\ub85c \uc8fc\uc11d\uc774 \ub2ec\ub9b0 \ubaa8\ub4e0 \ud074\ub798\uc2a4\ub294 \uc790\ub3d9\uc73c\ub85c \uc120\ud0dd\ub418\uc5b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uad6c\uc131\uc5d0 \ucd94\uac00\ub429\ub2c8\ub2e4. \ud574\ub2f9 \uad6c\uc131\uc744 \uc120\uc5b8\ud558\ub294 \uccab \ubc88\uc9f8 \ub2e8\uacc4\ub294 \ub2e4\uc74c\uc744 \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. <em>\uc950\ud329 \uc11c\ubc84 \ucee4\uc2a4\ud130\ub9c8\uc774\uc800<\/em> \ub97c \uc0dd\uc131\ud558\uace0 @Confguration\uc73c\ub85c \uc8fc\uc11d\uc744 \ub2ec\uba74 \ub429\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ud578\ub4e4\ub7ec, \ubc14\uc778\ub529 \ubc0f \uc11c\ubc84 \uad6c\uc131 \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. 'server.maxContentLength' \uc18d\uc131\uc740 \uc5c5\ub85c\ub4dc\ud560 \uc218 \uc788\ub294 \ud30c\uc77c\uc758 \ucd5c\ub300 \ud06c\uae30\uc785\ub2c8\ub2e4.<\/p>\n<pre><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&lt;action&gt; getHandlers() {\r\n            List&lt;action&gt; handlers = new ArrayList&lt;action&gt;();\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(\"server.maxContentLength\", \"100000000\", \"app.name\", \"Search Store File\"));\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(\"file\", FileHandler.class).post(\"fulltext\", ctx -&gt; {\r\n                ctx.parse(Form.class).then(form -&gt; {\r\n                    String queryString = form.get(\"queryString\");\r\n                    SearchService searchService = ctx.get(SearchService.class);\r\n                    Observable&lt;map&lt;string, object=\"\"&gt;&gt; files = searchService.searchFulltextFiles(queryString);\r\n                    RxRatpack.promise(files).then(response -&gt; ctx\r\n                            .render(Template.handlebarsTemplate(\"uploadForm\", \"text\/html\", m -&gt; m.put(\"files\", response))));\r\n                });\r\n            }).post(\"n1ql\", ctx -&gt; {\r\n                ctx.parse(Form.class).then(form -&gt; {\r\n                    String queryString = form.get(\"queryString\");\r\n                    SearchService searchService = ctx.get(SearchService.class);\r\n                    Observable&lt;map&lt;string, object=\"\"&gt;&gt; files = searchService.searchN1QLFiles(queryString);\r\n                    RxRatpack.promise(files).then(response -&gt; ctx\r\n                            .render(Template.handlebarsTemplate(\"uploadForm\", \"text\/html\", m -&gt; m.put(\"files\", response))));\r\n                });\r\n            });\r\n        }\r\n    }\r\n&lt;\/map&lt;string,&gt;&lt;\/map&lt;string,&gt;&lt;\/action&lt;\/action&lt;\/action<\/code><\/pre>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud15c\ud50c\ub9bf \uc2dc\uc2a4\ud15c\uc740 \ud578\ub4e4\ubc14\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c \ud578\ub4e4\ubc14 \ubaa8\ub4c8\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. FileHandler\ub294 '\/file' API\uc5d0 \ub300\ud55c \ubaa8\ub4e0 \ud638\ucd9c\uc744 \ucc98\ub9ac\ud558\uace0, StoredFileRenderer\ub294 StoredFile\uc774 \uc62c\ubc14\ub974\uac8c \ub80c\ub354\ub9c1\ub418\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9 \ub450 \ubc14\uc778\ub529\uc740 \uc624\ub958 \uad00\ub9ac\ub97c \uc704\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc5ec\uae30\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \uac83\uc740 <code>fileAPI<\/code> \uba54\uc11c\ub4dc\uc5d0\uc11c \ud578\ub4e4\ub7ec\ub97c \uc120\uc5b8\ud569\ub2c8\ub2e4. \ud578\ub4e4\ub7ec\ub294 \uc0ac\uc6a9\uc790\uac00 \ud2b9\uc815 URL\uc744 \ud074\ub9ad\ud560 \ub54c \uc5b4\ub5a4 \uc77c\uc774 \uc77c\uc5b4\ub098\ub294\uc9c0 \uc815\uc758\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \ubaa8\ub4e0 '\/file\/*' \ud638\ucd9c\uc744 FileHandler \ud074\ub798\uc2a4\uc5d0 \uc5f0\uacb0\ud569\ub2c8\ub2e4. \ub610\ud55c '\/fulltext' \ubc0f '\/n1ql'\uc758 POST\uc5d0 \ub300\ud55c \ub3d9\uc791\ub3c4 \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n<p>Ratpack\uc740 \ud504\ub85c\ubbf8\uc2a4\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c POST \uc694\uccad\uc5d0\uc11c \uc624\ub294 Form\uc744 \uad6c\ubb38 \ubd84\uc11d\ud558\uba74 \ud504\ub85c\ubbf8\uc2a4\ub97c \uc5bb\uac8c \ub429\ub2c8\ub2e4. \uac01 POST\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \uac83\uc740 SearchService\uac00 Ratpack\uc758 \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c \uac00\uc838\uc628\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uad6c\uc131\uc5d0\uc11c \ubc14\uc778\ub529\ub418\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uc5d0\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4. \uc774\ub294 \ud1b5\ud569\uc758 \uc77c\ubd80\ub85c \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c Spring \ube48\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \ub2e8\uacc4\ub294 \uc635\uc800\ubc84\ube14\uc744 \ubc18\ud658\ud558\ub294 \uac80\uc0c9 \uc11c\ube44\uc2a4\ub97c \ud638\ucd9c\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uad00\ucc30 \uac00\ub2a5 \ud56d\ubaa9\uc5d0 \ub300\ud55c \ub798\ud37c\ub97c \uc81c\uacf5\ud558\ub294 Ratpack\uc758 rx-java \ubaa8\ub4c8\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubaa8\ub4c8\uc740 \uc774\uac83\uc744 \ud504\ub85c\ubbf8\uc2a4\ub85c \ub798\ud551\ud569\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c \uac04\ub2e8\ud788 \uc751\ub2f5\uc744 \ub80c\ub354\ub9c1\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\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 \uad00\ucc30 \uac00\ub2a5\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<h2>Ratpack\uc6a9 \uc11c\ube44\uc2a4 \ub9c8\uc774\uadf8\ub808\uc774\uc158<\/h2>\n<p>\uc81c \uc11c\ube44\uc2a4 \ub300\ubd80\ubd84\uc740 Couchbase\uc5d0 \uc758\uc874\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. SDK\ub294 RxJava\ub97c \uae30\ubc18\uc73c\ub85c \ud558\ubbc0\ub85c \ub300\ubd80\ubd84\uc758 \uc11c\ube44\uc2a4\ub97c \ube44\ub3d9\uae30\uc2dd \ub17c\ube14\ub85c\ud0b9 \ubc29\uc2dd\uc73c\ub85c \ubcc0\ud658\ud558\uace0 \uad00\ucc30 \uac00\ub2a5\uc73c\ub85c \ubc18\ud658\ud558\ub294 \uac83\uc774 \ub9e4\uc6b0 \uc27d\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>RxJava \uc0ac\uc6a9<\/h3>\n<p>\uc774\uac83\uc740 \ub9e4\uc6b0 \uac04\ub2e8\ud55c \uc608\uc785\ub2c8\ub2e4. \uacb0\uacfc\ub97c \uc9c0\ub3c4 \ubaa9\ub85d\uc5d0 \ub9e4\ud551\ud558\ub294 N1QL \ucffc\ub9ac\uc785\ub2c8\ub2e4. \uccab \ub450 \uc904\uc740 \ub300\ubd80\ubd84 \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<pre><code>    public List&lt;map&lt;string, object=\"\"&gt;&gt; searchN1QLFiles(String whereClause) {\r\n        N1qlQuery query = N1qlQuery.simple(\r\n                \"SELECT binaryStoreLocation, binaryStoreDigest FROM `default` WHERE type= 'file' \" + whereClause);\r\n        query.params().consistency(ScanConsistency.STATEMENT_PLUS);\r\n        N1qlQueryResult res = bucket.query(query);\r\n        List&lt;map&lt;string, object=\"\"&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<p>\ub41c\ub2e4<\/p>\n<pre><code>    public Observable&lt;map&lt;string, object=\"\"&gt;&gt; searchN1QLFiles(String whereClause) {\r\n        N1qlQuery query = N1qlQuery.simple(\r\n                \"SELECT binaryStoreLocation, binaryStoreDigest FROM `default` WHERE type= 'file' \" + 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<h3>\ub808\uac70\uc2dc \ucf54\ub4dc \ucc28\ub2e8\uc740 \uc5b4\ub5bb\uac8c \ud558\ub098\uc694?<\/h3>\n<p>\uc81c \uc11c\ube44\uc2a4 \uc911 \uc77c\ubd80\ub294 \uc624\ub798\ub41c \ucc28\ub2e8 \ucf54\ub4dc\uc5d0 \uc758\uc874\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ucf54\ub4dc\ub97c \ucc28\ub2e8\ud558\uc9c0 \uc54a\uac8c \ub9cc\ub4dc\ub294 \ub9c8\ubc95 \uac19\uc740 \ubc29\ubc95\uc740 \uc5c6\uc9c0\ub9cc, \ud504\ub85c\ubbf8\uc2a4\ub85c \uc27d\uac8c \uac10\uc300 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \ud578\ub4e4\ub7ec\uc5d0\uc11c \uc27d\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ube14\ub85c\ud0b9 \ud638\ucd9c\uc744 \ub798\ud551\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uac04\ub2e8\ud569\ub2c8\ub2e4. \ud568\uc218\ub97c 'Blocking.get()'\uc73c\ub85c \ub798\ud551\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \ub9e4\uc6b0 \uac04\ub2e8\ud55c \uc608\uc2dc\uc785\ub2c8\ub2e4:<\/p>\n<pre><code>    public String getSha1Digest(InputStream is) {\r\n        return DigestUtils.sha1Hex(is);\r\n    }\r\n<\/code><\/pre>\n<p>\uac00<\/p>\n<pre><code>    public Promise getSha1Digest(InputStream is) {\r\n        return Blocking.get(() -&gt; DigestUtils.sha1Hex(is));\r\n    }\r\n<\/code><\/pre>\n<h2>\uacb0\ub860<\/h2>\n<p>\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 \uac83\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ub418\uba74 \ub2e4\uc74c \uc8fc\uc18c\ub85c \uc5f0\ub77d\ud574 \uc8fc\uc138\uc694. <a href=\"https:\/\/twitter.com\/ldoguin\">\ud2b8\uc704\ud130<\/a> \ub610\ub294 \uc544\ub798 \ub313\uae00\ub85c \ubb38\uc758\ud558\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 [&hellip;]<\/p>","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1818],"tags":[],"ppma_author":[9023],"class_list":["post-2320","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-java"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\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=\"article:modified_time\" content=\"2019-05-07T09:40:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/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=\"unstructured.io\" \/>\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\",\"dateModified\":\"2019-05-07T09:40:56+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\/1\/2022\/11\/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\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-07-05T11:24:12+00:00\",\"dateModified\":\"2019-05-07T09:40:56+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\/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\/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\/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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"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":"\uc774 \uae00\uc5d0\uc11c \uc0ac\uc6a9\ud55c \uc544\uc774\ub514\uc5b4\ub294 Spring MVC\ub97c Ratpack\uc73c\ub85c \ub300\uccb4\ud558\uace0, \uae30\uc874 \ub3d9\uae30\uc2dd \ucc28\ub2e8 \uc11c\ube44\uc2a4\ub97c \ube44\ub3d9\uae30\uc2dd \ubc0f \ube44\ucc28\ub2e8\uc2dd\uc73c\ub85c \ub9cc\ub4dc\ub294 \uac83\uc785\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\/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","article_modified_time":"2019-05-07T09:40:56+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","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","dateModified":"2019-05-07T09:40:56+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\/1\/2022\/11\/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\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-07-05T11:24:12+00:00","dateModified":"2019-05-07T09:40:56+00:00","description":"\uc774 \uae00\uc5d0\uc11c \uc0ac\uc6a9\ud55c \uc544\uc774\ub514\uc5b4\ub294 Spring MVC\ub97c Ratpack\uc73c\ub85c \ub300\uccb4\ud558\uace0, \uae30\uc874 \ub3d9\uae30\uc2dd \ucc28\ub2e8 \uc11c\ube44\uc2a4\ub97c \ube44\ub3d9\uae30\uc2dd \ubc0f \ube44\ucc28\ub2e8\uc2dd\uc73c\ub85c \ub9cc\ub4dc\ub294 \uac83\uc785\ub2c8\ub2e4.","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\/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\/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":"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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"\ub85c\ub791 \ub3c4\uadc4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","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\ub294 \ud30c\ub9ac\uc5d0 \uc0ac\ub294 \uad34\uc9dc \uae08\uc18d\uacf5\ud559\ub3c4\uc785\ub2c8\ub2e4. \uc8fc\ub85c 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\uc5d0 \ub300\ud574 \uc790\uc8fc \uc774\uc57c\uae30\ud569\ub2c8\ub2e4. \ub610\ud55c Clever Cloud\uc640 Nuxeo\uc758 \uac1c\ubc1c\uc790 \uc639\ud638\uc790\ub85c \ud65c\ub3d9\ud558\uba70 \ud574\ub2f9 \ucee4\ubba4\ub2c8\ud2f0\uac00 \ub354 \ud06c\uace0 \uac15\ub825\ud558\uac8c \uc131\uc7a5\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uc2dc\uac04\uacfc \uc804\ubb38\uc131\uc744 \ubc14\ucce4\uc2b5\ub2c8\ub2e4. \ud604\uc7ac Couchbase\uc5d0\uc11c \uac1c\ubc1c\uc790 \uad00\uacc4\ub97c \uc6b4\uc601\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\/"}]}},"authors":[{"term_id":9023,"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":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent\ub294 \ud30c\ub9ac\uc5d0 \uc0ac\ub294 \uad34\uc9dc \uae08\uc18d\uacf5\ud559\ub3c4\uc785\ub2c8\ub2e4. \uc8fc\ub85c 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\uc5d0 \ub300\ud574 \uc790\uc8fc \uc774\uc57c\uae30\ud569\ub2c8\ub2e4. \ub610\ud55c Clever Cloud\uc640 Nuxeo\uc758 \uac1c\ubc1c\uc790 \uc639\ud638\uc790\ub85c \ud65c\ub3d9\ud558\uba70 \ud574\ub2f9 \ucee4\ubba4\ub2c8\ud2f0\uac00 \ub354 \ud06c\uace0 \uac15\ub825\ud558\uac8c \uc131\uc7a5\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uc2dc\uac04\uacfc \uc804\ubb38\uc131\uc744 \ubc14\ucce4\uc2b5\ub2c8\ub2e4. \ud604\uc7ac Couchbase\uc5d0\uc11c \uac1c\ubc1c\uc790 \uad00\uacc4\ub97c \uc6b4\uc601\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2320","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=2320"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2320\/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=2320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=2320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=2320"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=2320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}