{"id":2240,"date":"2016-04-30T19:49:25","date_gmt":"2016-04-30T19:49:24","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2240"},"modified":"2025-06-13T23:17:02","modified_gmt":"2025-06-14T06:17:02","slug":"crud-rest-api-couchbase-rxjava-ratpack","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/crud-rest-api-couchbase-rxjava-ratpack\/","title":{"rendered":"Couchbase, RxJava \ubc0f Ratpack\uc774 \ud3ec\ud568\ub41c CRUD REST API"},"content":{"rendered":"<p><img decoding=\"async\" align=\"right\" src=\"\/wp-content\/original-assets\/2016\/april\/crud-rest-api-couchbase-rxjava-ratpack\/ratpacklogo.png\" \/>\ub0b4 \ub450 <a href=\"\/blog\/ko\/getting-started-ratpack-couchbase\/\">\uc774\uc804<\/a> <a href=\"\/blog\/ko\/ratpack-couchbase-rxjava\/\">\ube14\ub85c\uadf8<\/a> \uac8c\uc2dc\ubb3c\uc5d0\uc11c Ratpack\uacfc \uacbd\ub7c9 ODM \ub808\uc774\uc5b4\ub97c \uc18c\uac1c\ud55c \uc801\uc774 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/sdks\/java-2.2\/java-intro.html?utm_source=blogs&#038;utm_medium=link&#038;utm_campaign=blogs\">Java SDK<\/a>. \uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \uc774\ub97c \uae30\ubc18\uc73c\ub85c Couchbase \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ud1b5\ud574 \uc0ac\uc6a9\uc790\ub97c \uad00\ub9ac\ud560 \uc218 \uc788\ub294 REST API\ub97c \uc18c\uac1c\ud569\ub2c8\ub2e4.<\/p>\n<p>API\uac00 \ub124 \uac00\uc9c0 \uae30\ubcf8 HTTP \ub3d9\uc0ac\ub97c \uc9c0\uc6d0\ud558\uace0 \ucf58\ud150\uce20 \uc720\ud615\uc744 \uc9c0\uc6d0\ud558\uae30\ub97c \uc6d0\ud569\ub2c8\ub2e4. Ratpack\uc5d0\uc11c\ub294 \uc774\ub97c \uc704\ud574 \ubaa8\ub4e0 \uac83\uc774 \uace0\ub824\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 <a href=\"https:\/\/ratpack.io\/manual\/current\/api\/ratpack\/handling\/Chain.html\">\uccb4\uc778<\/a> \uac1d\uccb4\ub294 \ud578\ub4e4\ub7ec\ub97c \uc791\uc131\ud558\ub294 \ube4c\ub354\uc640 \uac19\uc2b5\ub2c8\ub2e4. \uadf8\ub798\uc11c \uc800\ub294 \uc0c8\ub85c\uc6b4 <a href=\"https:\/\/ratpack.io\/manual\/current\/api\/ratpack\/func\/Action.html\">\uc561\uc158<\/a> \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uccb4\uc778\uc744 &apos;user&apos; URL \uc811\ub450\uc0ac\uc5d0 \ubc14\uc778\ub529\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \uc81c \uae30\ubcf8 \uba54\uc11c\ub4dc\uac00 \ud6e8\uc52c \ub2e8\uc21c\ud574\uc9d1\ub2c8\ub2e4:<\/p>\n<pre>\n<code>    public static void main(String... args) throws Exception {\n        RxRatpack.initialize();\n        RatpackServer.start(server -> server.registry(Guice.registry(b -> b.module(Config.class)))\n                .handlers(chain -> chain.prefix(\"user\", UserHandler.class)));\n    }\n<\/code><\/pre>\n<p>\uc0ac\uc6a9\uc790 \ud578\ub4e4\ub7ec \uc778\uc2a4\ud134\uc2a4\ub97c \ucc3e\uc744 \uc218 \uc788\ub3c4\ub85d \ud558\ub824\uba74 \uad6c\uc131 \uac00\uc774\ub4dc \ubaa8\ub4c8\uc5d0\ub3c4 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4:<\/p>\n<pre>\n<code>    public class Config extends AbstractModule {\n\n        protected void configure() {\n            CouchbaseCluster cc = CouchbaseCluster.create();\n            Bucket bucket = cc.openBucket();\n            bind(AsyncBucket.class).toInstance(bucket.async());\n            bind(AsyncRepository.class).toInstance(bucket.repository().async());\n            bind(UserHandler.class);\n            bind(UserRenderer.class);\n        }\n    }\n<\/code><\/pre>\n<p>\ub610\ud55c \ub2e4\uc591\ud55c \ucf58\ud150\uce20 \uc720\ud615\uc744 \ucc98\ub9ac\ud558\ub294 \ub370 \uc0ac\uc6a9\ub418\ub294 UserRenderer \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<h2>\ucee4\uc2a4\ud140 \ub80c\ub354\ub7ec<\/h2>\n<p>Ratpack\uc5d0\uc11c\ub294 \uc0c8\ub85c\uc6b4 <a href=\"https:\/\/ratpack.io\/manual\/current\/api\/ratpack\/render\/RendererSupport.html\">\ub80c\ub354\ub7ec \uc9c0\uc6d0<\/a> \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4. \uc774\ub4e4\uc758 \ubaa9\ud45c\ub294 T \uac1d\uccb4\ub97c \ub80c\ub354\ub9c1\ud558\ub294 \ubc29\ubc95\uc744 \uc9c0\uc815\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. <a href=\"https:\/\/ratpack.io\/manual\/current\/context.html#context\">\ucee8\ud14d\uc2a4\ud2b8<\/a>. \uc81c \uacbd\uc6b0\uc5d0\ub294 \ucee8\ud14d\uc2a4\ud2b8 \ucf58\ud150\uce20 \uc720\ud615\uc5d0 \ub530\ub77c \uc0ac\uc6a9\uc790 \uac1d\uccb4\ub97c \ub80c\ub354\ub9c1\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \ucee8\ud14d\uc2a4\ud2b8 \uac1d\uccb4\ub294 <a href=\"https:\/\/ratpack.io\/manual\/current\/api\/ratpack\/handling\/ByContentSpec.html\">\ucf58\ud150\uce20\ubcc4<\/a> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc694\uccad\uc5d0 \uc124\uc815\ub41c \ucf58\ud150\uce20 \uc720\ud615\uc5d0 \ub530\ub77c \ub80c\ub354\ub9c1\uc744 \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc778 \uc720\ud615\uc740 \uc774\ubbf8 \ubbf8\ub9ac \uc815\uc758\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc81c \uacbd\uc6b0\uc5d0\ub294 json\uacfc \ud14d\uc2a4\ud2b8\ub9cc \uc9c0\uc6d0\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4:<\/p>\n<pre>\n<code>    public class UserRenderer extends RendererSupport<User> {\n\n        @Override\n        public void render(Context context, User user) throws Exception {\n            context.byContent(byContentSpec -> byContentSpec\n                    .json(() -> context.render(Jackson.json(user)))\n                    .plainText(() -> context.render(user.toString()))\n            );\n        }\n\n    }\n<\/code><\/pre>\n<p>\ud14d\uc2a4\ud2b8 \ub80c\ub354\ub9c1\uc740 \uac04\ub2e8\ud55c toString()\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. JSON \ubc84\uc804\uc740 Ratpack\uc5d0\uc11c \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ub418\ub294 Jackson \uac1d\uccb4\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 JSON\/\uac1d\uccb4 \ubcc0\ud658\uc744 \uc704\ud55c \ub2e8\ucd95\ud0a4\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. User \uac1d\uccb4\ub97c \uc778\uc218\ub85c \uc81c\uacf5\ud558\ub294 json \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\uba74 \ub429\ub2c8\ub2e4. \uc7ad\uc2a8\uc740 \ub0b4\ubd80\uc801\uc73c\ub85c Java SDK\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ud2b8\ub9ad\uc774 \uc788\uc2b5\ub2c8\ub2e4. Couchabse ODM\uc5d0 \uc0ac\uc6a9\ud55c @Field \uc5b4\ub178\ud14c\uc774\uc158\uc740 Ratpack\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uae30\ubcf8 Jackson \ub9e4\ud37c\uac00 \uc778\uc2dd\ud558\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc774\ub97c \ubcf4\uc644\ud558\uae30 \uc704\ud574 Jackson @JsonProperty \uc5b4\ub178\ud14c\uc774\uc158\uc744 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4. \uc560\ucd08\uc5d0 @Field \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4\uba74 \uc544\ubb34\uac83\ub3c4 \ucd94\uac00\ud560 \ud544\uc694\uac00 \uc5c6\uc5c8\uc744 \uac83\uc785\ub2c8\ub2e4. \ub354 \ub098\uc740 \ubc29\ubc95\uc744 \ucc3e\ub3c4\ub85d \ub178\ub825\ud558\uaca0\uc9c0\ub9cc \ub2f9\ubd84\uac04\uc740 \uc798 \uc791\ub3d9\ud569\ub2c8\ub2e4.<\/p>\n<pre>\n<code>    @Field(\"fName\")\n    @JsonProperty(\"fName\")\n    private String firstName;\n\n    @Field(\"lName\")\n    @JsonProperty(\"lName\")\n    private String lastName;\n<\/code><\/pre>\n<h2>\ud578\ub4e4\ub7ec\ub85c API \uad6c\uc131\ud558\uae30<\/h2>\n<p>\uc774\uc81c API \uc791\uc5c5\uc744 \uc2dc\uc791\ud560 \uc218 \uc788\ub294 \uc88b\uc740 \uc704\uce58\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. GET, PUT, DELETE\uac00 \uc791\ub3d9\ud558\ub824\uba74 \uc0ac\uc6a9\uc790 \uc544\uc774\ub514\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uadf8\ub798\uc11c \uc81c\uac00 \uac00\uc7a5 \uba3c\uc800 \ud558\ub294 \uc77c\uc740 \/user\/ URL \ub4a4\uc5d0 \ubb34\uc5b8\uac00\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \ud578\ub4e4\ub7ec\ub294 \ubaa8\ub450 \uccb4\uc778\uc73c\ub85c \uc5f0\uacb0\ub418\uc5b4 \uc788\uc73c\uba70 \uc120\uc5b8\ud55c \uc21c\uc11c\ub300\ub85c \uc2e4\ud589\ub429\ub2c8\ub2e4. \uc77c\ub2e8 \ud578\ub4e4\ub7ec\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uccb4\uc778\uc774 \uba48\ucda5\ub2c8\ub2e4. \ub530\ub77c\uc11c \/user\/ \uc55e\uc5d0 \/user\/:userId\ub97c \uc120\uc5b8\ud574\uc57c \ud569\ub2c8\ub2e4. \uacbd\ub85c \ubc14\uc778\ub529\uc740 \uc815\uaddc\uc2dd\uc744 \uc0ac\uc6a9\ud558\uba70, \uadf8 \uc608\ub294 <a href=\"https:\/\/ratpack.io\/manual\/current\/api\/ratpack\/handling\/Chain.html\">\uccb4\uc778<\/a> \ubb38\uc11c.<\/p>\n<p>\uc804\ud654\ub85c <code>\uacbd\ub85c<\/code> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74 \uacbd\ub85c \uc815\uaddc\uc2dd\uacfc \ud578\ub4e4\ub7ec\ub97c \uc778\uc218\ub85c \uc804\ub2ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud578\ub4e4\ub7ec\uc5d0\uc11c \uba3c\uc800 \uacbd\ub85c \ud1a0\ud070\uc5d0\uc11c Couchbase \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc640 userId\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c <a href=\"https:\/\/ratpack.io\/manual\/current\/api\/ratpack\/handling\/ByMethodSpec.html\">byMethod<\/a> \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc9c0\uc6d0\ud574\uc57c \ud558\ub294 \uac01 HTTP \ub3d9\uc0ac\uc5d0 \ub300\ud55c \ud568\uc218\ub97c \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 GET\uc758 \uacbd\uc6b0 \uc0ac\uc6a9\uc790\ub97c \ubc18\ud658\ud558\uace0, PUT\uc758 \uacbd\uc6b0 \uc0ac\uc6a9\uc790\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uac70\ub098 \uc0dd\uc131\ud558\uace0, REMOVE\uc758 \uacbd\uc6b0 \uc0ac\uc6a9\uc790\ub97c \uc81c\uac70\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc5ec\uae30\uc11c \uac00\uc7a5 \ud765\ubbf8\ub85c\uc6b4 \ub3d9\uc0ac\ub294 \uc694\uccad\uc5d0 \ucf58\ud150\uce20\uac00 \ud544\uc694\ud558\uae30 \ub54c\ubb38\uc5d0 PUT\uc785\ub2c8\ub2e4. \ucee8\ud14d\uc2a4\ud2b8 <code>parse<\/code> \uba54\uc11c\ub4dc\ub294 <a href=\"https:\/\/ratpack.io\/manual\/current\/api\/ratpack\/parse\/Parse.html\">Parse<\/a> \uac1d\uccb4\ub97c \uc778\uc218\ub85c \uc804\ub2ec\ud558\uace0 Promise\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \uc694\uccad\uc5d0\uc11c JSON\uc744 \ud30c\uc2f1\ud558\uc5ec User \uac1d\uccb4\uc5d0 \ub9e4\ud551\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c Promise\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc800\ub294 RxJava \uc0ac\uc6a9\uc790\uc774\ubbc0\ub85c \ud574\ub2f9 Promise\ub97c Observable\uc5d0 \ub9e4\ud551\ud55c \ub2e4\uc74c User \uac1d\uccb4\ub97c EntityDocument\uc5d0 \ub9e4\ud551\ud558\uc5ec \ucd5c\uc885\uc801\uc73c\ub85c Couchbase \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c \ud574\ub2f9 \uad00\ucc30 \uac00\ub2a5 \ud56d\ubaa9\uc744 \ub2e4\uc2dc ratpack \ud504\ub85c\ubbf8\uc2a4\ub85c \ubcc0\ud658\ud558\uace0 \uac04\ub2e8\ud55c \ud655\uc778 \ubb38\uc790\uc5f4\uc744 \ub2e4\uc2dc \uc804\uc1a1\ud569\ub2c8\ub2e4. \uc2e4\uc81c \uc0ac\ub840\uc5d0\uc11c\ub294 \uc880 \ub354 \uc2a4\ub9c8\ud2b8\ud55c \uc791\uc5c5\uc744 \ud558\uace0 \uc2f6\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.)<\/p>\n<pre>\n<code>            chain.path(\":userId\", ctx -> {\n                AsyncRepository repo = ctx.get(AsyncRepository.class);\n                String userId = ctx.getPathTokens().get(\"userId\");\n                ctx.byMethod(methodSpec -> {\n                    methodSpec.get(() -> {\n                        Observable<EntityDocument<User>> user = repo.get(userId, User.class);\n                        RxRatpack.promise(user).then(u -> ctx.render(u.get(0).content()));\n                    }).put(() -> {\n                        Promise<User> promise = ctx.parse(Jackson.fromJson(User.class));\n                        Observable<EntityDocument<User>> observable = RxRatpack.observe(promise)\n                                .map(user -> EntityDocument.create(user)).flatMap(doc -> repo.upsert(doc));\n                        RxRatpack.promise(observable).then(doc -> ctx.render(\"OK\"));\n                    }).delete(() -> {\n                        Observable<EntityDocument<User>> user = repo.remove(userId, User.class);\n                        RxRatpack.promise(user).then(u -> ctx.render(\"OK\"));\n                    });\n                });\n            });\n<\/code><\/pre>\n<p>\uc0ac\uc6a9\uc790 \uc544\uc774\ub514\uac00 \ud544\uc694\ud55c HTTP \ub3d9\uc0ac\uac00 \uad6c\ud604\ub418\uba74 \ub2e4\ub978 \ubaa8\ub4e0 \ub3d9\uc0ac\ub294 \ub05d\ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \ub2e4\uc74c \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74 \uc27d\uac8c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>\ubaa8\ub450<\/code>. \uc5ec\uae30\uc11c \ub808\uc9c0\uc2a4\ud2b8\ub9ac\uc5d0\uc11c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc640 \ubc84\ud0b7\uc744 \uac00\uc838\uc635\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c GET \uba54\uc11c\ub4dc\uc758 \uacbd\uc6b0 \uc0ac\uc6a9\uc790 ID\uac00 \uc5c6\uc73c\ubbc0\ub85c \uc804\uccb4 \uc0ac\uc6a9\uc790 \ubaa9\ub85d\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 \uae30\ubcf8 N1QL \ucffc\ub9ac\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c POST\ub294 PUT \uba54\uc11c\ub4dc\uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.<\/p>\n<pre>\n<code>            chain.all(ctx -> {\n                AsyncBucket bucket = ctx.get(AsyncBucket.class);\n                AsyncRepository repo = ctx.get(AsyncRepository.class);\n                ctx.byMethod(methodSpec -> {\n                    methodSpec.get(() -> {\n                        N1qlQuery query = N1qlQuery.simple(\"SELECT Meta().id as username,age,fName,lName FROM default WHERE type = &apos;user&apos;\");\n                        Observable<User> observable = bucket.query(query)\n                                .flatMap(qRes -> qRes.rows()).map(row -> {\n                                    JsonObject jo = row.value();\n                                    String username = jo.getString(\"username\");\n                                    Integer age = jo.getInt(\"age\");\n                                    String fName = jo.getString(\"fName\");\n                                    String lName = jo.getString(\"lName\");\n                                    return new User(username, age, fName, lName);\n                                });\n                        RxRatpack.promise(observable).then(users -> ctx.render(Jackson.json(users)));\n                    }).post(() -> {\n                        Promise<User> promise = ctx.parse(Jackson.fromJson(User.class));\n                        Observable<EntityDocument<User>> observable = RxRatpack.observe(promise)\n                                .map(user -> EntityDocument.create(user)).flatMap(doc -> repo.upsert(doc));\n                        RxRatpack.promise(observable).then(doc -> ctx.render(\"OK\"));\n                    });\n                });\n            });\n<\/code><\/pre>\n<p>\uc644\uc804\ud788 \ub9cc\uc871\uc2a4\ub7ec\uc6b4 API\ub294 \uc544\ub2c8\uc9c0\ub9cc Ratpack, Couchbase \ubc0f RxJava\ub85c \uc5bc\ub9c8\ub098 \uc27d\uac8c \ub9cc\ub4e4 \uc218 \uc788\ub294\uc9c0\uc5d0 \ub300\ud55c \uc88b\uc740 \uc544\uc774\ub514\uc5b4\ub97c \uc5bb\uc744 \uc218 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4. \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ubaa8\ub4c8\uacfc \uac19\uc774 Ratpack\uacfc \uad00\ub828\ub41c \ub354 \ub9ce\uc740 \ub0b4\uc6a9\uc744 \ubcf4\uace0 \uc2f6\uc73c\uc2dc\uba74 \uc54c\ub824\uc8fc\uc138\uc694.<\/p>","protected":false},"excerpt":{"rendered":"<p>In my two previous blog posts I have introduced Ratpack and the lightweight ODM layer available in our Java SDK. This post will build up on them and showcase a REST API to manage users through the Couchbase repository. I [&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":[1818],"tags":[1635,1950],"ppma_author":[9023],"class_list":["post-2240","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-ratpack","tag-rest-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A CRUD REST API with Couchbase, RxJava and Ratpack - 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\/crud-rest-api-couchbase-rxjava-ratpack\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A CRUD REST API with Couchbase, RxJava and Ratpack\" \/>\n<meta property=\"og:description\" content=\"In my two previous blog posts I have introduced Ratpack and the lightweight ODM layer available in our Java SDK. This post will build up on them and showcase a REST API to manage users through the Couchbase repository. I [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/crud-rest-api-couchbase-rxjava-ratpack\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-30T19:49:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:17:02+00:00\" \/>\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=\"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\/crud-rest-api-couchbase-rxjava-ratpack\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"A CRUD REST API with Couchbase, RxJava and Ratpack\",\"datePublished\":\"2016-04-30T19:49:24+00:00\",\"dateModified\":\"2025-06-14T06:17:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/\"},\"wordCount\":742,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"ratpack\",\"REST API\"],\"articleSection\":[\"Java\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/\",\"name\":\"A CRUD REST API with Couchbase, RxJava and Ratpack - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-04-30T19:49:24+00:00\",\"dateModified\":\"2025-06-14T06:17:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#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\/crud-rest-api-couchbase-rxjava-ratpack\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A CRUD REST API with Couchbase, RxJava and Ratpack\"}]},{\"@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":"A CRUD REST API with Couchbase, RxJava and Ratpack - 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\/crud-rest-api-couchbase-rxjava-ratpack\/","og_locale":"ko_KR","og_type":"article","og_title":"A CRUD REST API with Couchbase, RxJava and Ratpack","og_description":"In my two previous blog posts I have introduced Ratpack and the lightweight ODM layer available in our Java SDK. This post will build up on them and showcase a REST API to manage users through the Couchbase repository. I [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/crud-rest-api-couchbase-rxjava-ratpack\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-04-30T19:49:24+00:00","article_modified_time":"2025-06-14T06:17:02+00:00","author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"5\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"A CRUD REST API with Couchbase, RxJava and Ratpack","datePublished":"2016-04-30T19:49:24+00:00","dateModified":"2025-06-14T06:17:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/"},"wordCount":742,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["ratpack","REST API"],"articleSection":["Java"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/","url":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/","name":"A CRUD REST API with Couchbase, RxJava and Ratpack - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-04-30T19:49:24+00:00","dateModified":"2025-06-14T06:17:02+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/crud-rest-api-couchbase-rxjava-ratpack\/#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\/crud-rest-api-couchbase-rxjava-ratpack\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A CRUD REST API with Couchbase, RxJava and Ratpack"}]},{"@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","first_name":"Laurent","last_name":"Doguin","user_url":"","author_category":"","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\/2240","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=2240"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2240\/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=2240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=2240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=2240"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=2240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}