{"id":2854,"date":"2017-02-28T08:41:20","date_gmt":"2017-02-28T16:41:20","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2854"},"modified":"2025-06-13T21:40:21","modified_gmt":"2025-06-14T04:40:21","slug":"graphql-server-node-couchbase-ottoman-spatial-view","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/graphql-server-node-couchbase-ottoman-spatial-view\/","title":{"rendered":"\ub178\ub4dc \ubc0f \uce74\uc6b0\uce58\ubca0\uc774\uc2a4, \uc624\uc2a4\ub9cc \ubc0f \uacf5\uac04 \ubdf0\uac00 \uc788\ub294 Graphql \uc11c\ubc84"},"content":{"rendered":"<p><em><a href=\"https:\/\/www.linkedin.com\/in\/jm8nav\"><span class=\"no-underline\">\ud638\uc138 \ub098\ubc14\ub85c<\/span><\/a> \ub294 \ubca8\uae30\uc5d0 \ube0c\ub93c\uc140\uc758 FAMOCO\uc5d0\uc11c \ud480 \uc2a4\ud0dd \uac1c\ubc1c\uc790\ub85c \uc77c\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub294 \uc9c0\ub09c 3\ub144 \ub3d9\uc548 \uc6f9 <a href=\"https:\/\/github.com\/jmn8718\">\uac1c\ubc1c\uc790<\/a> \uc6f9 \uac1c\ubc1c \ubc0f \ubaa8\ubc14\uc77c \uae30\uc220\uc5d0 \uae4a\uc740 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \uc788\uc73c\uba70 Node.js, Java, AngularJS, ReactJS\uc5d0 \ub2a5\ud1b5\ud569\ub2c8\ub2e4.<\/em><\/p>\n<p>\uc6b0\ub9ac\ub294 <u><a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Graphql<\/a><\/u>\u00a0\uc11c\ubc84\uc5d0\uc11c Express\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. Graphql\uc740 API\uc6a9 \ucffc\ub9ac \uc5b8\uc5b4\ub85c, \ud398\uc774\uc2a4\ubd81\uc5d0\uc11c \uac1c\ubc1c\ud588\uc73c\uba70 2015\ub144\uc5d0 \ucd9c\uc2dc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub370\uc774\ud130 \uc694\uad6c \uc0ac\ud56d\uacfc \uc0c1\ud638 \uc791\uc6a9\uc744 \uc124\uba85\ud558\uae30 \uc704\ud55c \uc9c1\uad00\uc801\uc774\uace0 \uc720\uc5f0\ud55c \uad6c\ubb38\uacfc \uc2dc\uc2a4\ud15c\uc744 \uc81c\uacf5\ud558\uc5ec \ud074\ub77c\uc774\uc5b8\ud2b8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub3c4\ub85d \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4. REST API\uc640\uc758 \uac00\uc7a5 \ud070 \ucc28\uc774\uc810 \uc911 \ud558\ub098\ub294 \ubaa8\ub4e0 \ub9ac\uc18c\uc2a4\uc5d0 \ub300\ud574 \ud558\ub098\uc758 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uac00 \uc544\ub2c8\ub77c \ubaa8\ub4e0 \ub9ac\uc18c\uc2a4\uc5d0 \ub300\ud574 \ud558\ub098\uc758 \uc785\ub825 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub9cc \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ub610\ud55c REST API \uc11c\ube44\uc2a4\uac00 \ubc18\ud658\ud558\ub294 \ubaa8\ub4e0 \uac83\uc744 \ubc1b\ub294 \ub300\uc2e0 \uac01 \uc694\uccad\uc5d0 \ub300\ud574 \uc6d0\ud558\ub294 \uc18d\uc131\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ud544\uc694\ud55c \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \ud655\ubcf4\ud558\uace0 \uc694\uccad \ud06c\uae30\ub97c \uc904\uc77c \uc218 \uc788\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4.<\/p>\n<p>\ud398\uc774\uc2a4\ubd81\uc740 \ubaa8\ubc14\uc77c \uc571, \uc608\ub97c \ub4e4\uc5b4 iOS \uc571\uc5d0\uc11c \uba87 \ub144 \ub3d9\uc548 \uc0ac\uc6a9\ud574 \uc654\uc73c\uba70 \uc774\uc804 \ubc84\uc804\uc758 \ubaa8\ubc14\uc77c \uc571\uc740 \ub3d9\uc77c\ud55c \uc2a4\ud0a4\ub9c8\ub97c \uac00\uc9c4 \ud558\ub098\uc758 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc774\uae30 \ub54c\ubb38\uc5d0 \uadf8\ub798\ud504QL\uc774 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc544 \uc5ec\uc804\ud788 \ubb38\uc81c\uc5c6\uc774 \uc791\ub3d9\ud558\uc9c0\ub9cc, \uc0c8\ub85c\uc6b4 \ubc84\uc804\uc758 API\ub97c \ucd9c\uc2dc\ud558\uba74 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uac00 \ubcc0\uacbd\ub418\ubbc0\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc0c8\ub85c\uc6b4 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc640 \ub370\uc774\ud130\uc5d0 \uc801\uc751\ud574\uc57c \ud558\ubbc0\ub85c REST API\uc5d0\uc11c\ub294 \ubd88\uac00\ub2a5\ud560 \uac83\uc785\ub2c8\ub2e4. \ub610\ud55c <u><a href=\"https:\/\/developer.github.com\/early-access\/graphql\/\" target=\"_blank\" rel=\"noopener noreferrer\">Github<\/a><\/u>\u00a0\uadf8\ub798\ud504 \ucffc\ub9ac \uc11c\ubc84\ub97c \uc5f4\uba74 \uc0ac\uc6a9\uc790\uac00 REST API \uc11c\ube44\uc2a4 \ub300\uc2e0 \uadf8\ub798\ud504 \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4\ub97c \ucffc\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\uc5ec \ucffc\ub9ac\ud558\uace0 \uc0dd\uc131\ud560 \uc11c\ubc84\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <strong>\uc7a5\uc18c<\/strong>. \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uae30 \uc704\ud574 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uace0 \uacf5\uac04 \ubdf0\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc9c0\ub9ac\uc801 \uc704\uce58\ubcc4\ub85c \uc7a5\uc18c\ub97c \ucffc\ub9ac\ud560 \uac83\uc785\ub2c8\ub2e4. \uc800\ub294 \uc774\uc804\uc5d0 <u><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/develop-a-rest-api-with-couchbase-ottoman-nodejs-hapijs\/\" target=\"_blank\" rel=\"noopener noreferrer\">post<\/a><\/u>\u00a0\uc5d0\uc11c \ub178\ub4dc\uc640 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc5d0 \ub300\ud574 \uc124\uba85\ud588\uc73c\ubbc0\ub85c \uc774\uc804 \ud3ec\uc2a4\ud2b8\uc5d0\uc11c \uc791\uc131\ud55c DB \uad6c\uc131\uc740 \uc0dd\ub7b5\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\uc694\uad6c \uc0ac\ud56d<\/h2>\n<p>\ucef4\ud4e8\ud130\uc5d0 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4:<\/p>\n<p>- nodejs<\/p>\n<p>- \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84<\/p>\n<p>\ucf54\ub4dc\ub97c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <u><a href=\"https:\/\/github.com\/jmn8718\/node-couchbase-graphql.git\" target=\"_blank\" rel=\"noopener noreferrer\">\uae43\ud5c8\ube0c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac<\/a><\/u>.<\/p>\n<h2>\uacf5\uac04 \ubcf4\uae30<\/h2>\n<p>\uba3c\uc800 \uacf5\uac04 \ubdf0\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc81c \uacbd\uc6b0\uc5d0\ub294 \uad00\ub9ac\uc790 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. <u><a href=\"https:\/\/localhost:8091\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/localhost:8091\/<\/a><\/u>\u00a0\uc744 \ud074\ub9ad\ud558\uace0 \ub0b4 \uc0ac\uc6a9\uc790 \uc544\uc774\ub514\uc640 \ube44\ubc00\ubc88\ud638\ub85c \ub85c\uadf8\uc778\ud569\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c <strong>\ub370\uc774\ud130 \ubc84\ud0b7<\/strong>\u00a0\ubc84\ud0b7\uc744 \ub9cc\ub4e4\uc5b4\uc11c <em>\uadf8\ub798\ud504 \ucffc\ub9ac<\/em>. \uadf8\ub7f0 \ub2e4\uc74c <strong>\ubcf4\uae30<\/strong>\uc744 \ud074\ub9ad\ud55c \ub2e4\uc74c <strong>\uac1c\ubc1c \uacf5\uac04 \ubdf0 \ub9cc\ub4e4\uae30<\/strong>\ub97c \ud074\ub9ad\ud558\uace0 \uac12\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/create_view.png\" alt=\"Create Spatial Development View\" width=\"404\" height=\"301\" \/><\/p>\n<p>\uc0ac\uc6a9 <em>\uc7a5\uc18c\ubcc4_\uc704\uce58<\/em>\u00a0\ub458 \ub2e4\uc5d0\uc11c <strong>\ub514\uc790\uc778 \ubb38\uc11c \uc774\ub984<\/strong>\u00a0\uadf8\ub9ac\uace0 <strong>\uc774\ub984 \ubcf4\uae30<\/strong>. \uc774\uc81c <strong>\ud3b8\uc9d1<\/strong>\ub97c \ud074\ub9ad\ud558\uace0 \ub2e4\uc74c \ucf54\ub4dc\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\n\ud568\uc218 (\ubb38\uc11c) {<\/code><\/p>\n<p>if (doc._type === '\uc7a5\uc18c' &amp;&amp; doc.location) {<\/p>\n<p>emit([{<\/p>\n<p>\"\uc720\ud615\": \"\ud3ec\uc778\ud2b8\",<\/p>\n<p>\"\uc88c\ud45c\": [doc.location.long, doc.location.lat].<\/p>\n<p>}], \ubb38\uc11c);<\/p>\n<p>}<\/p>\n<p>}<br \/>\n\ub97c \ud074\ub9ad\ud558\uace0 <strong>\uc800\uc7a5<\/strong>.<\/p>\n<p>\uc5ec\uae30\uc5d0\uc11c \ubc84\ud0b7\uc5d0 \uc788\ub294 \ubb38\uc11c\ub85c \ubcf4\uae30\ub97c \ud14c\uc2a4\ud2b8\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\uc7a5\uc18c \ubaa8\ub378<\/h2>\n<p>\uc7a5\uc18c\uc758 \uacbd\uc6b0 \uc7a5\uc18c \uc774\ub984\uacfc \uc124\uba85\uc744 \ubb38\uc790\uc5f4\ub85c \uc800\uc7a5\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc6b0\ub9ac\ub294 <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.6\/views\/sv-writing-views.html\">\uc2a4\ud398\uc774\uc15c\ubdf0<\/a> \uadf8 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/developers\/\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a> \uac00 \uc81c\uacf5\ud558\ub294 *location*\uc774\ub77c\ub294 \uac1d\uccb4\uc5d0 \uc704\ub3c4\uc640 \uacbd\ub3c4\ub97c \uc800\uc7a5\ud558\uc5ec \uc7a5\uc18c\uc758 \uc704\uce58\ub97c \uc800\uc7a5\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c \uc7a5\uc18c\ub97c \ucd94\uac00\ud560 \ub54c \uae30\ubcf8\uc801\uc73c\ub85c \uc0dd\uc131\ub41c \ub0a0\uc9dc\uac00 \uc124\uc815\ub429\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\nconst PlaceModel = ottoman.model('Place', {<\/code><\/p>\n<p>\uc774\ub984: '\ubb38\uc790\uc5f4',<\/p>\n<p>\uc124\uba85: '\ubb38\uc790\uc5f4',<\/p>\n<p>\uc704\uce58: {<\/p>\n<p>\uc704\ub3c4: '\uc22b\uc790',<\/p>\n<p>lon: '\uc22b\uc790'<\/p>\n<p>},<\/p>\n<p>\uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4: {<\/p>\n<p>\uc720\ud615: '\ub0a0\uc9dc',<\/p>\n<p>\uae30\ubcf8\uac12\uc785\ub2c8\ub2e4: Date.now<\/p>\n<p>}<\/p>\n<p>});<br \/>\n\uacf5\uac04 \ucffc\ub9ac\uc758 \uacbd\uc6b0 \uacf5\uac04 \ucffc\ub9ac\ub97c \uc218\ud589\ud558\ub294 \ud568\uc218\ub97c \uc815\uc758\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 couchbase \ud328\ud0a4\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc5ec \uacf5\uac04 \ucffc\ub9ac\ub97c \uc0dd\uc131\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\nconst queryByLocation = (bbox = [0, 0, 0, 0], next) =&gt; {}<\/code><\/p>\n<p>const query = couchbase.SpatialQuery.from('dev_place_by_location', 'place_by_location').bbox(bbox);<\/p>\n<p>\ubc84\ud0b7.\ucffc\ub9ac(\ucffc\ub9ac, \ub2e4\uc74c);<\/p>\n<p>}<br \/>\n\ubd80\ud130* \ud568\uc218\uc5d0\uc11c *\ub514\uc790\uc778 \ubb38\uc11c \uc774\ub984*\uacfc *\ubcf4\uae30 \uc774\ub984*\uc744 \uc81c\uacf5\ud574\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c bbox(\ubc14\uc6b4\ub529 \ubc15\uc2a4)\uc5d0 **[ \ucd5c\uc18c \uacbd\ub3c4 , \ucd5c\uc18c \uc704\ub3c4 , \ucd5c\ub300 \uacbd\ub3c4 , \ucd5c\ub300 \uc704\ub3c4 ]**\uc758 4\uac1c\uc758 \uc2e4\uc218 \ubc30\uc5f4\uc744 \uc81c\uacf5\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub294 \ubc84\ud0b7\uc5d0\uc11c \ucffc\ub9ac\ub97c \uc218\ud589\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h2>Graphql \uc11c\ubc84<\/h2>\n<p>\uc5ec\uae30\uc11c\ub294 express \uc11c\ubc84\uc640 express-graphql \ud328\ud0a4\uc9c0\ub97c \uc0ac\uc6a9\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub098\uc911\uc5d0 \uc815\uc758\ud560 graphql \uc11c\ubc84\uc758 \uc2a4\ud0a4\ub9c8\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\nconst express = require('express');<\/code><\/p>\n<p>const graphqlHTTP = require('express-graphql');<\/p>\n<p>const PORT = process.env.PORT || 5000;<\/p>\n<p>const schema = require('.\/schemas');<\/p>\n<p>const app = express();<\/p>\n<p>app.use('\/graphql', graphqlHTTP({<\/p>\n<p>\uc2a4\ud0a4\ub9c8: \uc2a4\ud0a4\ub9c8,<\/p>\n<p>graphiql: true,<\/p>\n<p>}));<\/p>\n<p>\/\/ \uc11c\ubc84 \uc2dc\uc791<\/p>\n<p>const server = app.listen(PORT, () =&gt; {<\/p>\n<p>console.log(`Server started at ${ server.address().port }`);<\/p>\n<p>});<br \/>\ngraphql \uc11c\ubc84\uc5d0\uc11c\ub294 *\/graphql* \uacbd\ub85c\ub97c \uc0ac\uc6a9\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub294 \uadf8\ub798\ud53d \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud558\ub294 graphiql\uacfc \uac19\uc740 \uc635\uc158\uc744 \uc124\uc815\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub294 \uc775\uc2a4\ud504\ub808\uc2a4 \uc11c\ubc84\ub97c \uc2dc\uc791\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h2>\uadf8\ub798\ud504 \ucffc\ub9ac \uc2a4\ud0a4\ub9c8<\/h2>\n<p>Graphql \ucffc\ub9ac \ubc0f \ubcc0\uc774\ub294 \uc6b0\ub9ac\uac00 \uc815\uc758\ud55c \uc2a4\ud0a4\ub9c8\uc5d0 \uc758\uc874\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c Place \uac1c\uccb4\uc5d0 \ub300\ud55c \uc2a4\ud0a4\ub9c8\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 \ub2e4\uc74c\uc5d0 \ub300\ud55c \uc2a4\ud0a4\ub9c8\ub97c \uc815\uc758\ud558\uaca0\uc2b5\ub2c8\ub2e4. <strong>\uc704\uce58<\/strong>.<\/p>\n<p><code><br \/>\nconst {<\/code><\/p>\n<p>\uadf8\ub798\ud504QLObjectType,<\/p>\n<p>\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8,<\/p>\n<p>GraphQLNonNull,<\/p>\n<p>} = require('graphql');<\/p>\n<p>const LocationSchema = new GraphQLObjectType({<\/p>\n<p>\uc774\ub984: '\uc704\uce58',<\/p>\n<p>\uc124\uba85: '\uc9c0\ub9ac\uc801 \uc704\uce58',<\/p>\n<p>\ud544\ub4dc: {<\/p>\n<p>\uc704\ub3c4: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uc704\ub3c4',<\/p>\n<p>},<\/p>\n<p>lon: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uacbd\ub3c4',<\/p>\n<p>},<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>module.exports = LocationSchema;<\/p>\n<p>\ub2e4\uc74c\uc5d0\uc11c \uc720\ud615\uc744 \uac00\uc838\uc640\uc57c \ud569\ub2c8\ub2e4. <em>\uadf8\ub798\ud504 \ucffc\ub9ac<\/em>\u00a0\ud328\ud0a4\uc9c0\uc785\ub2c8\ub2e4. \uc2a4\ud0a4\ub9c8\uc5d0\uc11c \uc774\ub984\uacfc \uc124\uba85\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc73c\uba70, \uc774 \ud544\ub4dc\ub294 \ucffc\ub9ac\ub97c \ubb38\uc11c\ud654\ud558\ub294 \ub370 \uc720\uc6a9\ud558\ubbc0\ub85c \uc0ac\uc6a9\uc790\uac00 \ud574\ub2f9 \ud544\ub4dc\uc758 \uc758\ubbf8\ub97c \uc774\ud574\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7f0 \ub2e4\uc74c \ub2e4\uc74c\uc744 \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4. <em>\ud544\ub4dc<\/em>\uc5d0\uc11c \uc2a4\ud0a4\ub9c8 \ub0b4\ubd80\uc758 \ud544\ub4dc\ub97c \uc9c0\uc815\ud560 \uac83\uc774\uba70, \uc774 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\uc758\ud588\uc2b5\ub2c8\ub2e4. <em>\uc704\ub3c4<\/em>\u00a0\uadf8\ub9ac\uace0 <em>lon<\/em>. \ubaa8\ub4e0 \ud544\ub4dc\uc5d0\uc11c \uc720\ud615\uc744 \uc9c0\uc815\ud574\uc57c \ud558\uba70, \uc774 \uacbd\uc6b0 \uc774\ub7ec\ud55c \ud544\ub4dc\ub294 \uc2e4\uc218 \uac12\uc774\uba70 \ud544\uc218\uc774\ubbc0\ub85c \ub2e4\uc74c\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. <em>\uadf8\ub798\ud504QLNonNull<\/em>\u00a0 \ubc0f \uc720\ud615 <em>\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8<\/em>. \uc774\uc81c \uadf8 \uc758\ubbf8\ub97c \uc54c \uc218 \uc788\ub3c4\ub85d \uc124\uba85\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \uc2a4\ud0a4\ub9c8\ub97c \uc815\uc758\ud558\uaca0\uc2b5\ub2c8\ub2e4. <strong>\uc7a5\uc18c<\/strong>.<\/p>\n<p>\uc5ec\uae30\uc11c\ub294 \ub2e4\uc74c\uc5d0\uc11c \uc720\ud615\uc744 \uac00\uc838\uc62c \uac83\uc785\ub2c8\ub2e4. <em>\uadf8\ub798\ud504 \ucffc\ub9ac<\/em>\u00a0\ubc0f \uc2a4\ud0a4\ub9c8 <em>\uc704\uce58<\/em>\u00a0\ub97c \uc815\uc758\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\nconst {<\/code><\/p>\n<p>\uadf8\ub798\ud504QLObjectType,<\/p>\n<p>\uadf8\ub798\ud504QLString,<\/p>\n<p>GraphQLNonNull,<\/p>\n<p>} = require('graphql');<\/p>\n<p>const LocationSchema = require('.\/location');<\/p>\n<p>const PlaceSchema = new GraphQLObjectType({<\/p>\n<p>\uc774\ub984: '\uc7a5\uc18c',<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \uc124\uba85',<\/p>\n<p>\ud544\ub4dc: {<\/p>\n<p>id: {<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QLString,<\/p>\n<p>resolve(place) {<\/p>\n<p>place._id\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4;<\/p>\n<p>}<\/p>\n<p>},<\/p>\n<p>\uc774\ub984: {<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QLString,<\/p>\n<p>},<\/p>\n<p>\uc124\uba85:{<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QLString,<\/p>\n<p>},<\/p>\n<p>\uc704\uce58: {<\/p>\n<p>\uc720\ud615: \uc704\uce58 \uc2a4\ud0a4\ub9c8,<\/p>\n<p>},<\/p>\n<p>\uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4: {<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QLString,<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>module.exports = PlaceSchema;<\/p>\n<p>\ubaa8\ub378\uc5d0\uc11c \ud544\ub4dc\ub97c \uc77c\uce58\uc2dc\ud0a4\uace0 \uc788\uc73c\ubbc0\ub85c \ud655\uc778 \ud568\uc218\ub97c \uc81c\uacf5\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ud544\ub4dc\uc5d0 \ub300\ud574\uc11c\ub9cc <em>id<\/em>\ud544\ub4dc\uc5d0 \uac12\uc744 \ubc18\ud658\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. <strong>_id<\/strong>.<\/p>\n<h2>\uadf8\ub798\ud504 \ucffc\ub9ac<\/h2>\n<p>\ucffc\ub9ac\ub294 \uc11c\ubc84\uc758 \ub370\uc774\ud130\ub97c \uac80\uc0c9\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n<p>\ucffc\ub9ac \uac1d\uccb4\ub3c4 \uc774\uc804\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc2a4\ud0a4\ub9c8\uc785\ub2c8\ub2e4. \uc774 \uacbd\uc6b0 \ud544\ub4dc\ub294 \uc0ac\uc6a9\uc790\uac00 \uc218\ud589\ud560 \uc218 \uc788\ub294 \ucffc\ub9ac\uc785\ub2c8\ub2e4. \uc138 \uac00\uc9c0 \uc720\ud615\uc758 \ucffc\ub9ac\ub97c \uc815\uc758\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ubaa8\ub4e0 \uc7a5\uc18c<\/h3>\n<p>\uc774 \ucffc\ub9ac\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ubaa8\ub4e0 \uc7a5\uc18c\ub97c \ucffc\ub9ac\ud558\uace0 \uc0dd\uc131\ub41c \ud544\ub4dc\uc5d0 \ub530\ub77c \uc21c\uc11c\ub97c \uc9c0\uc815\ud558\ubbc0\ub85c \uac00\uc7a5 \ucd5c\uadfc\uc758 \uc7a5\uc18c\ub97c \uba3c\uc800 \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc7a5\uc18c\uc758 \ubc30\uc5f4\uc744 \ubc18\ud658\ud558\ub294 \uac83\ucc98\ub7fc, \uc6b0\ub9ac\ub294 <strong>\uc720\ud615<\/strong>\u00a0\uc720\ud615 <em>\uadf8\ub798\ud504QL\ub9ac\uc2a4\ud2b8<\/em>\u00a0\uadf8\ub9ac\uace0 \uc6b0\ub9ac\ub294 <em>\uc7a5\uc18c \uc2a4\ud0a4\ub9c8<\/em><\/p>\n<p><code><br \/>\n...<\/code><\/p>\n<p>const PlaceSchema = require('.\/place');<\/p>\n<p>const Place = require('..\/\ubaa8\ub378\/place');<\/p>\n<p>&#8230;<\/p>\n<p>\ubaa8\ub4e0 \uc7a5\uc18c: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 GraphQLList(PlaceSchema),<\/p>\n<p>\uc124\uba85: '\ubaa8\ub4e0 \uc7a5\uc18c\uc5d0 \ub300\ud55c \ucffc\ub9ac',<\/p>\n<p>resolve(root, args) {<\/p>\n<p>\ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((\ud574\uacb0, \uac70\ubd80) =&gt; {{<\/p>\n<p>Place.find({}, {<\/p>\n<p>\uc815\ub82c: {<\/p>\n<p>\uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4: -1<\/p>\n<p>},<\/p>\n<p>}, (\uc624\ub958, \uc7a5\uc18c) =&gt; {<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>}<\/p>\n<p>\ud574\uacb0(\uc7a5\uc18c);<\/p>\n<p>})<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>\uc124\uba85\ub3c4 \ucd94\uac00\ud558\uba70, \uc774 \ud544\ub4dc\ub294 \uc120\ud0dd \uc0ac\ud56d\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9 \ub9e4\uac1c\ubcc0\uc218\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ub370\uc774\ud130\ub97c \uac80\uc0c9\ud558\ub294 \ubc29\ubc95\uc744 \uc9c0\uc815\ud558\ub294 \ud568\uc218, \uc989 resolve \ud568\uc218\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud55c \ud638\ucd9c\uc740 \ube44\ub3d9\uae30\uc801\uc774\ubbc0\ub85c \uc57d\uc18d\uc744 \ubc18\ud658\ud560 \uac83\uc774\uba70, \uc774 \uc57d\uc18d\uc740 \uc6b0\ub9ac\uac00 ottoman\uc73c\ub85c \uc815\uc758\ud55c \uc7a5\uc18c \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4. \uc774 \ubaa8\ub378\uc5d0\uc11c\ub294 find\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubb38\uc11c\ub97c \ucffc\ub9ac\ud558\uace0, \ubaa8\ub4e0 \ubb38\uc11c\ub97c \ucffc\ub9ac\ud558\uae30 \ub54c\ubb38\uc5d0 \uccab \ubc88\uc9f8 \ub9e4\uac1c\ubcc0\uc218\ub85c \ube48 \uac1d\uccb4\ub97c \uc804\ub2ec\ud569\ub2c8\ub2e4. \ub450 \ubc88\uc9f8 \ub9e4\uac1c\ubcc0\uc218\ub294 \ucffc\ub9ac\uc758 \uc635\uc158\uc774\uba70, \uc774 \uacbd\uc6b0 \ud544\ub4dc\ub97c \uae30\uc900\uc73c\ub85c \uc8fc\ubb38\ud560 \uac83\uc785\ub2c8\ub2e4. <em>\uc0dd\uc131<\/em>\u00a0\ub97c \ub0b4\ub9bc\ucc28\uc21c\uc73c\ub85c \ub098\uc5f4\ud569\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uac12\uc73c\ub85c \ud504\ub85c\ubbf8\uc2a4\ub97c \ud574\uacb0\ud558\uac70\ub098 \uc624\ub958 \ubc1c\uc0dd \uc2dc \uc774\ub97c \uac70\ubd80\ud558\ub294 \ucf5c\ubc31 \ud568\uc218\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc7a5\uc18c<\/h3>\n<p>\uc774 \ucffc\ub9ac\uc5d0\uc11c\ub294 \uacf5\uac04 \ubcf4\uae30\ub97c \uc0ac\uc6a9\ud558\uc5ec \ucffc\ub9ac\ud560 \uac83\uc774\ubbc0\ub85c \ucffc\ub9ac\uc758 \ub9e4\uac1c \ubcc0\uc218\uc5d0 bbox \ud3ec\uc778\ud2b8\ub97c \uc804\ub2ec\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\n...<\/code><\/p>\n<p>const queryByLocation = require('..\/models\/place').queryByLocation;<\/p>\n<p>&#8230;<\/p>\n<p>\uc7a5\uc18c: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 GraphQLList(PlaceSchema),<\/p>\n<p>\uc124\uba85: '\uacbd\uacc4 \uc0c1\uc790 \uc548\uc758 \ubaa8\ub4e0 \uc704\uce58\uc5d0 \ub300\ud55c \ucffc\ub9ac',<\/p>\n<p>args: {<\/p>\n<p>minLon: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uacbd\uacc4 \uc0c1\uc790\uc758 \ucd5c\uc18c \uacbd\ub3c4',<\/p>\n<p>},<\/p>\n<p>maxLon: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uacbd\uacc4 \uc0c1\uc790\uc758 \ucd5c\ub300 \uacbd\ub3c4',<\/p>\n<p>},<\/p>\n<p>minLat: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uacbd\uacc4 \uc0c1\uc790\uc758 \ucd5c\uc18c \uc704\ub3c4',<\/p>\n<p>},<\/p>\n<p>maxLat: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uacbd\uacc4 \uc0c1\uc790\uc758 \ucd5c\ub300 \uc704\ub3c4',<\/p>\n<p>},<\/p>\n<p>},<\/p>\n<p>resolve(root, args) {<\/p>\n<p>\/\/ bbox = [ \ucd5c\uc18c \uacbd\ub3c4 , \ucd5c\uc18c \uc704\ub3c4 , \ucd5c\ub300 \uacbd\ub3c4 , \ucd5c\ub300 \uc704\ub3c4 ]\uc785\ub2c8\ub2e4.<\/p>\n<p>const bbox = [<\/p>\n<p>args.minLon,<\/p>\n<p>args.minLat,<\/p>\n<p>args.maxLon,<\/p>\n<p>args.maxLat,<\/p>\n<p>];<\/p>\n<p>\ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((\ud574\uacb0, \uac70\ubd80) =&gt; {{<\/p>\n<p>queryByLocation(bbox, (err, places) =&gt; {<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>}<\/p>\n<p>resolve(places.map((place) =&gt; place.value));<\/p>\n<p>})<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>\uba3c\uc800 \uacf5\uac04 \ucffc\ub9ac\ub97c \uc218\ud589\ud558\uae30 \uc704\ud574 \uc815\uc758\ud55c \ud568\uc218\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc804 \ucffc\ub9ac\uc5d0\uc11c\uc640 \uac19\uc774 \uc720\ud615\uc744 \uc7a5\uc18c \ubc30\uc5f4\ub85c \uc815\uc758\ud558\uace0 \uc124\uba85\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ucffc\ub9ac\uc5d0\uc11c\ub294 \uc77c\ubd80 \ub9e4\uac1c\ubcc0\uc218\uac00 \ud544\uc694\ud558\ubbc0\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \ucc38\uc870\ud558\ub294 args\ub97c \uc815\uc758\ud558\uace0, \ub0b4\ubd80\uc758 \uac01 \uac12\uc744 <em>args<\/em>\u00a0\ub294 \ub9e4\uac1c\ubcc0\uc218\uc640 \uc77c\uce58\ud558\uba70, \uc774 \uacbd\uc6b0 4\ub97c \uc815\uc758\ud569\ub2c8\ub2e4, <strong>\ucd5c\uc18c\ub860, \ucd5c\ub300\ub860, \ucd5c\uc18c\uc704\ub3c4, \ucd5c\ub300\uc704\ub3c4<\/strong>\u00a0\uadf8\ub9ac\uace0 \uc774\ub4e4 \ubaa8\ub450\uc5d0 \ub300\ud574 \ud544\uc694\ud55c \uc720\ud615\uacfc \ubd80\ub3d9\ud615\uc744 \uc815\uc758\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uacbd\uc6b0 \ud574\uacb0 \ud568\uc218\ub3c4 \ud504\ub85c\ubbf8\uc2a4\uc785\ub2c8\ub2e4. \uba3c\uc800 \ud568\uc218\ub97c \uc804\ub2ec\ud558\uae30 \uc704\ud574 bbox \ubc30\uc5f4\uc744 \ube4c\ub4dc\ud569\ub2c8\ub2e4. <em>\uc704\uce58\ubcc4 \ucffc\ub9ac<\/em>. \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uba74 \uc624\ub958\ub85c \uc57d\uc18d\uc744 \uac70\ubd80\ud558\uace0, \uc131\uacf5\ud558\uba74 \uacf5\uac04 \ubcf4\uae30\uac00 \uc804\uccb4 \ubb38\uc11c\ub97c \ubc18\ud658\ud558\ub294 \uc9c0\uc624\ud3ec\uc778\ud2b8\uc640 \uac12\uc744 \ubc18\ud658\ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \uacf5\uac04 \ubcf4\uae30\ub97c \uc815\uc758\ud558\uba74 \ubcc0\uacbd\ub418\ubbc0\ub85c DB\uc5d0\uc11c \uac1d\uccb4\ub97c \ub9e4\ud551\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc7a5\uc18c<\/h3>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc815\uc758\ud560 \ucffc\ub9ac\ub294 ID\ub85c \ud55c \uc7a5\uc18c\ub97c \ucffc\ub9ac\ud558\ub294 \ucffc\ub9ac\uc785\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\n\uc7a5\uc18c: {<\/code><\/p>\n<p>\uc720\ud615: \uc7a5\uc18c \uc2a4\ud0a4\ub9c8,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c ID\ub85c \uc7a5\uc18c \ucffc\ub9ac',<\/p>\n<p>args: {<\/p>\n<p>id: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 GraphQLNonNull(GraphQLString),<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c ID',<\/p>\n<p>}<\/p>\n<p>},<\/p>\n<p>resolve(root, args) {<\/p>\n<p>\ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((\ud574\uacb0, \uac70\ubd80) =&gt; {{<\/p>\n<p>Place.getById(args.id, (err, place) =&gt; {{<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>}<\/p>\n<p>\ud574\uacb0(\uc7a5\uc18c);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>}<br \/>\n\uc774 \uacbd\uc6b0 \uc720\ud615\uc740 <em>\uc7a5\uc18c \uc2a4\ud0a4\ub9c8<\/em>\ub97c \uc815\uc758\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\uc218\uc5d0 \uc788\ub294 <strong>id<\/strong>\u00a0\ub97c \ubb38\uc790\uc5f4 \ubc0f \ud544\uc218\ub85c \uc124\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud574\uacb0 \ud568\uc218\ub294 \ub2e4\uc2dc \uc57d\uc18d\uc774\uba70, \uc774 \uacbd\uc6b0\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4. <em>queryById<\/em>\u00a0\ub97c \ubaa8\ub378\uc5d0 \uc804\ub2ec\ud558\uace0 <em>id<\/em>\u00a0\uac12\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uadf8\ub798\ud504 \ucffc\ub9ac \ub3cc\uc5f0\ubcc0\uc774<\/h2>\n<p>\ub3cc\uc5f0\ubcc0\uc774\ub97c \uc0ac\uc6a9\ud558\uba74 \uc11c\ubc84\uc758 \ub370\uc774\ud130\ub97c \uc218\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ucffc\ub9ac\uc5d0\uc11c \ub3cc\uc5f0\ubcc0\uc774 \uac1c\uccb4\ub294 \uc2a4\ud0a4\ub9c8\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc774\uc804 \uc2a4\ud0a4\ub9c8\uc640 \ub3d9\uc77c\ud55c \ud544\ub4dc\ub97c \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ubcc0\uc774 \ucffc\ub9ac\ub97c \uc218\ud589\ud560 \ub54c \uad04\ud638 \uc0ac\uc774\uc5d0 \uac12\uc744 \uc785\ub825\ud558\uace0 \ucffc\ub9ac\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc218\uc815\ub41c \uac1d\uccb4\uc5d0\uc11c \uac80\uc0c9\ud558\ub824\ub294 \uac12\uc744 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc5ec\uae30\uc11c\ub294 \uc7a5\uc18c\uc758 \uc0dd\uc131, \uc5c5\ub370\uc774\ud2b8 \ubc0f \uc0ad\uc81c\ub97c \uc218\ud589\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>createPlace<\/h3>\n<p>\uc774 \ub3cc\uc5f0\ubcc0\uc774\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uc0c8\ub85c\uc6b4 \uc7a5\uc18c\ub97c \ub9cc\ub4e4 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc2a4\ud0a4\ub9c8 \uc720\ud615\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\uc758\ud560 \uac83\uc785\ub2c8\ub2e4. <em>\uc7a5\uc18c \uc2a4\ud0a4\ub9c8<\/em>\uc0dd\uc131\ub41c \uc7a5\uc18c\ub97c \ubc18\ud658\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\ncreatePlace: {<\/code><\/p>\n<p>\uc720\ud615: \uc7a5\uc18c \uc2a4\ud0a4\ub9c8,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \ub9cc\ub4e4\uae30',<\/p>\n<p>args: {<\/p>\n<p>\uc774\ub984: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 GraphQLNonNull(GraphQLString),<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \uc774\ub984',<\/p>\n<p>},<\/p>\n<p>\uc124\uba85: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 GraphQLNonNull(GraphQLString),<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \uc124\uba85',<\/p>\n<p>},<\/p>\n<p>\uc704\ub3c4: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c\uc758 \uc704\ub3c4',<\/p>\n<p>},<\/p>\n<p>\uacbd\ub3c4: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 \uadf8\ub798\ud504QLNonNull(\uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8),<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c\uc758 \uacbd\ub3c4',<\/p>\n<p>}<\/p>\n<p>},<\/p>\n<p>resolve(source, args) {<\/p>\n<p>\ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((\ud574\uacb0, \uac70\ubd80) =&gt; {{<\/p>\n<p>const place = \uc0c8\ub85c\uc6b4 \uc7a5\uc18c({<\/p>\n<p>\uc774\ub984: args.name,<\/p>\n<p>\uc124\uba85: args.description,<\/p>\n<p>\uc704\uce58: {<\/p>\n<p>lat: args.latitude,<\/p>\n<p>LON: ARGS.\uacbd\ub3c4,<\/p>\n<p>},<\/p>\n<p>});<\/p>\n<p>place.save((err) =&gt; {<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>}<\/p>\n<p>\ud574\uacb0(\uc7a5\uc18c);<\/p>\n<p>})<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>}<br \/>\n\ucffc\ub9ac\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc0c8 \uc7a5\uc18c\ub97c \ub9cc\ub4dc\ub294 \ub370 \ud544\uc694\ud55c \uac12\uc73c\ub85c \uc778\uc218\ub97c \uc815\uc758\ud569\ub2c8\ub2e4. \uc774 \uacbd\uc6b0 \uc774\ub984\uacfc \uc124\uba85\uc740 \ubb38\uc790\uc5f4\ub85c, \uc704\ub3c4\uc640 \uacbd\ub3c4\ub294 \uc2e4\uc218\ub85c \uc785\ub825\ud574\uc57c \ud558\uba70 \ubaa8\ub4e0 \ud544\ub4dc\uac00 \ud544\uc218\uc785\ub2c8\ub2e4.<\/p>\n<p>\ud574\uacb0 \ud568\uc218\uc5d0\uc11c\ub294 \ud504\ub85c\ubbf8\uc2a4\ub97c \ubc18\ud658\ud560 \uac83\uc785\ub2c8\ub2e4. \ud504\ub85c\ubbf8\uc2a4 \ub0b4\ubd80\uc5d0 \ucffc\ub9ac \uac12\uc744 \uac00\uc9c4 \uc7a5\uc18c\ub97c \ub9cc\ub4e4 \uac83\uc785\ub2c8\ub2e4. <em>args<\/em>. \uadf8\ub7f0 \ub2e4\uc74c <em>\uc800\uc7a5<\/em>\u00a0\ub97c \ud074\ub9ad\ud569\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc7a5\uc18c\ub97c \uc800\uc7a5\ud558\ub294 \ub370 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uba74 \uc624\ub958\uc640 \ud568\uaed8 \uc57d\uc18d\uc744 \uac70\ubd80\ud558\uac70\ub098 \uc7a5\uc18c \ub370\uc774\ud130\ub85c \uc57d\uc18d\uc744 \ud574\uacb0\ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc5c5\ub370\uc774\ud2b8 \uc7a5\uc18c<\/h3>\n<p>\uc5d0\uc11c\uc640 \uac19\uc774 <em>createPlace<\/em>\u00a0\ub3cc\uc5f0\ubcc0\uc774 <em>\uc5c5\ub370\uc774\ud2b8 \uc7a5\uc18c<\/em>\u00a0\ubcc0\uc774\ub3c4 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ucc28\uc774\uc810\uc740 \uc774 \uacbd\uc6b0 \uc778\uc218\uc758 \ubaa8\ub4e0 \uac12\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uace0 ID \ud544\ub4dc\uac00 \ud544\uc218 \ubb38\uc790\uc5f4\uc774\ub77c\ub294 \uc810\uc785\ub2c8\ub2e4; \uadf8\ub9ac\uace0 \ud574\uacb0 \ud568\uc218\uc5d0\uc11c\ub294 \uba3c\uc800 \uac1d\uccb4\ub97c <em>id<\/em>\ub97c \ud638\ucd9c\ud55c \ub2e4\uc74c \uc0ac\uc6a9\uc790\uac00 \uc81c\uacf5\ud55c \ud544\ub4dc\ub97c \ud655\uc778\ud558\uace0 \uc7a5\uc18c\ub97c \uc5c5\ub370\uc774\ud2b8\ud55c \ub2e4\uc74c \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc800\uc7a5\ud558\uace0 \uc0c8 \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\nupdatePlace: {<\/code><\/p>\n<p>\uc720\ud615: \uc7a5\uc18c \uc2a4\ud0a4\ub9c8,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \uc5c5\ub370\uc774\ud2b8',<\/p>\n<p>args: {<\/p>\n<p>id: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 GraphQLNonNull(GraphQLString),<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c\uc758 \uc544\uc774\ub514',<\/p>\n<p>},<\/p>\n<p>\uc774\ub984: {<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QLString,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \uc774\ub984',<\/p>\n<p>},<\/p>\n<p>\uc124\uba85: {<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QLString,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \uc124\uba85',<\/p>\n<p>},<\/p>\n<p>\uc704\ub3c4: {<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c\uc758 \uc704\ub3c4',<\/p>\n<p>},<\/p>\n<p>\uacbd\ub3c4: {<\/p>\n<p>\uc720\ud615: \uadf8\ub798\ud504QL\ud50c\ub85c\ud2b8,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c\uc758 \uacbd\ub3c4',<\/p>\n<p>}<\/p>\n<p>},<\/p>\n<p>resolve(source, args) {<\/p>\n<p>\ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((\ud574\uacb0, \uac70\ubd80) =&gt; {{<\/p>\n<p>Place.getById(args.id, (err, place) =&gt; {{<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>} else {<\/p>\n<p>if (args.name) {<\/p>\n<p>place.name = args.name;<\/p>\n<p>}<\/p>\n<p>if (args.description) {<\/p>\n<p>place.name = args.name;<\/p>\n<p>}<\/p>\n<p>if (args.latitude) {<\/p>\n<p>place.location.lat = args.lat;<\/p>\n<p>}<\/p>\n<p>if (args.longitude) {<\/p>\n<p>place.location.lon = args.\uacbd\ub3c4;<\/p>\n<p>}<\/p>\n<p>place.save((err) =&gt; {<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>}<\/p>\n<p>\ud574\uacb0(\uc7a5\uc18c);<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>})<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<h3>\uc0ad\uc81c\uc7a5\uc18c<\/h3>\n<p>\ub9c8\uc9c0\ub9c9 \ubcc0\uc774\ub294 \uc0ad\uc81c\uc774\uba70, \uc5ec\uae30\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc720\ud615\uc744 \uc815\uc758\ud569\ub2c8\ub2e4. <em>\uc7a5\uc18c \uc2a4\ud0a4\ub9c8<\/em>\uc0ad\uc81c\ud55c \uac1d\uccb4\ub97c \ubc18\ud658\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc778\uc218\uc5d0\uc11c, \uc6b0\ub9ac\ub294 \ub2e8\uc9c0 <em>id<\/em>\u00a0\ub97c \uc0ad\uc81c\ud560 \uc7a5\uc18c\ub85c \ud074\ub9ad\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud574\uacb0 \ud568\uc218\uc5d0\uc11c\ub294 \uc544\uc774\ub514\ub85c \uc7a5\uc18c\ub97c \uac80\uc0c9\ud558\uace0 \uc81c\uac70\ub97c \uc218\ud589\ud558\ub294 \ud504\ub85c\ubbf8\uc2a4\ub97c \ubc18\ud658\ud560 \uac83\uc785\ub2c8\ub2e4. \uc7a5\uc18c\ub97c \ucc3e\uc744 \uc218 \uc5c6\uac70\ub098 \uc81c\uac70\ud558\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \uc788\ub294 \uacbd\uc6b0 \ud504\ub85c\ubbf8\uc2a4\ub97c \uac70\ubd80\ud558\uac70\ub098, \uc131\uacf5\uc801\uc73c\ub85c \uc81c\uac70\ud55c \uacbd\uc6b0 \uc7a5\uc18c \ub370\uc774\ud130\ub85c \ud504\ub85c\ubbf8\uc2a4\ub97c \ud574\uacb0\ud569\ub2c8\ub2e4.<\/p>\n<p><code><br \/>\ndeletePlace: {<\/code><\/p>\n<p>\uc720\ud615: \uc7a5\uc18c \uc2a4\ud0a4\ub9c8,<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c \uc0ad\uc81c',<\/p>\n<p>args: {<\/p>\n<p>id: {<\/p>\n<p>\uc720\ud615: \uc0c8\ub85c\uc6b4 GraphQLNonNull(GraphQLString),<\/p>\n<p>\uc124\uba85: '\uc7a5\uc18c\uc758 \uc544\uc774\ub514',<\/p>\n<p>},<\/p>\n<p>},<\/p>\n<p>resolve(source, args) {<\/p>\n<p>\ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((\ud574\uacb0, \uac70\ubd80) =&gt; {{<\/p>\n<p>Place.getById(args.id, (err, place) =&gt; {{<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>} else {<\/p>\n<p>place.remove((err) =&gt; {<\/p>\n<p>if (err) {<\/p>\n<p>reject(err);<\/p>\n<p>}<\/p>\n<p>\ud574\uacb0(\uc7a5\uc18c);<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>})<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<h2>\ud14c\uc2a4\ud2b8<\/h2>\n<p>\uc571\uc744 \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574 \uc11c\ubc84\uc5d0\uc11c \ud5c8\uc6a9\ud558\ub294 Graphiql\uc744 \uc0ac\uc6a9\ud558\uaca0\uc2b5\ub2c8\ub2e4. https:\/\/localhost:5000\/graphql<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/graphiql.png\" alt=\"graphiql\" \/><\/p>\n<p>\uc774 \ud398\uc774\uc9c0\uc5d0\uc11c\ub294 \uc774\uc804\uc5d0 \uc815\uc758\ud55c \ucffc\ub9ac \ubc0f \ubcc0\ud615\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ub9cc\ub4e4\uae30<\/h3>\n<p><code><br \/>\n\ub3cc\uc5f0\ubcc0\uc774 {<\/code><\/p>\n<p>createPlace(<\/p>\n<p>\uc774\ub984: \"testplace\"<\/p>\n<p>\uc124\uba85: \"\ud14c\uc2a4\ud2b8 \uc124\uba85\"<\/p>\n<p>\uc704\ub3c4: 1.36<\/p>\n<p>\uacbd\ub3c4: 18.36<\/p>\n<p>)\u00a0{<\/p>\n<p>id<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/mutation_create.png\" alt=\"mutation create\" \/><\/p>\n<h3>\uc5c5\ub370\uc774\ud2b8<\/h3>\n<p><code><br \/>\n\ub3cc\uc5f0\ubcc0\uc774 {<\/code><\/p>\n<p>\uc5c5\ub370\uc774\ud2b8 \ud50c\ub808\uc774\uc2a4(<\/p>\n<p>id: \u201c41133f98-18e8-4979-89e0-7af012b0e14f\u201d<\/p>\n<p>\uc774\ub984: \"updateplace\"<\/p>\n<p>\uc124\uba85: \"\uc5c5\ub370\uc774\ud2b8\ub41c\uc124\uba85\"<\/p>\n<p>\uc704\ub3c4: 2.36<\/p>\n<p>\uacbd\ub3c4: 15.96<\/p>\n<p>)\u00a0{<\/p>\n<p>id<\/p>\n<p>\uc774\ub984<\/p>\n<p>\uc124\uba85<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/mutation_update.png\" alt=\"mutation update\" \/><\/p>\n<h3>\uc0ad\uc81c<\/h3>\n<p><code><br \/>\n\ub3cc\uc5f0\ubcc0\uc774 {<\/code><\/p>\n<p>deletePlace(id: \"41133f98-18e8-4979-89e0-7af012b0e14f\") {<\/p>\n<p>id<\/p>\n<p>}<\/p>\n<p>}<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/mutation_delete.png\" alt=\"mutation delete\" \/><\/p>\n<h3>\ubaa8\ub450 \ucffc\ub9ac\ud558\uae30<\/h3>\n<p><code><br \/>\n\ucffc\ub9ac {<\/code><\/p>\n<p>\ubaa8\ub4e0 \uc7a5\uc18c {<\/p>\n<p>id<\/p>\n<p>\uc774\ub984<\/p>\n<p>\uc704\uce58 {<\/p>\n<p>\uc704\ub3c4<\/p>\n<p>lon<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/query_all.png\" alt=\"query all\" \/><\/p>\n<h3>\uacbd\uacc4 \uc0c1\uc790\ubcc4 \ucffc\ub9ac<\/h3>\n<p><code><br \/>\n\ucffc\ub9ac {<\/code><\/p>\n<p>\uc7a5\uc18c(<\/p>\n<p>minLon: 3<\/p>\n<p>maxLon: 5<\/p>\n<p>minLat: 49<\/p>\n<p>maxLat: 51<\/p>\n<p>)\u00a0{<\/p>\n<p>\uc774\ub984<\/p>\n<p>\uc704\uce58 {<\/p>\n<p>\uc704\ub3c4<\/p>\n<p>lon<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>}<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/query_bbox.png\" alt=\"query bbox\" \/><\/p>\n<h3>ID\ub85c \uc7a5\uc18c \uc870\ud68c\ud558\uae30<\/h3>\n<p><code><br \/>\n```<\/code><\/p>\n<p>\ub3cc\uc5f0\ubcc0\uc774 {<\/p>\n<p>deletePlace(id: \"41133f98-18e8-4979-89e0-7af012b0e14f\") {<\/p>\n<p>id<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&#8220;`<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/query_id.png\" alt=\"query id\" \/><\/p>\n<h2>\uacb0\ub860<\/h2>\n<p>Graphql\uc740 \uc815\uc758\ud55c \uc815\ubcf4\uc5d0 \ub300\ud574\uc11c\ub9cc \ucffc\ub9ac\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \uc5b8\ub354\ud398\uce6d\uc774\ub098 \uc624\ubc84\ud398\uce6d\uc744 \ud53c\ud560 \uc218 \uc788\uace0, \ud56d\uc0c1 \ub370\uc774\ud130\ub97c \ud655\ubcf4\ud560 \uc218 \uc788\ub294 \uc88b\uc740 \ucffc\ub9ac \uc5b8\uc5b4\uc785\ub2c8\ub2e4.<\/p>\n<p>Graphql \uc11c\ubc84\uc5d0\uc11c\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ud558\ub098\uc758 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub9cc \uc0ac\uc6a9\ud558\ubbc0\ub85c \ubc31\uc5d4\ub4dc\uc758 \ubcf5\uc7a1\uc131\uacfc \ub85c\uc9c1\uc744 \uc228\uae30\ubbc0\ub85c \uc11c\ubc84\uac00 \ub2e4\ub978 \ubc31\uc5d4\ub4dc\uc5d0 \uc5f0\uacb0\ud558\uac70\ub098 \ub2e4\ub978 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\uba70, \ubcc0\uacbd\ub418\ub354\ub77c\ub3c4 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uac00 \ub3d9\uc77c\ud558\ubbc0\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8 \ub85c\uc9c1\uc740 \ubcc0\uacbd\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub85c \ub370\uc774\ud130\uc5d0\uc11c \uc9c0\ub9ac\uc801 \ucffc\ub9ac\ub97c \uc218\ud589\ud558\ub294 \ubc29\ubc95\ub3c4 \uc0b4\ud3b4\ubd24\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ucc38\uc870<\/h2>\n<ul>\n<li><u><a href=\"https:\/\/github.com\/jmn8718\/node-couchbase-graphql.git\" target=\"_blank\" rel=\"noopener noreferrer\">\ucf54\ub4dc<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Graphql<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/developer.github.com\/early-access\/graphql\/\" target=\"_blank\" rel=\"noopener noreferrer\">Github graphql<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.6\/views\/sv-writing-views.html\" target=\"_blank\" rel=\"noopener noreferrer\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uacf5\uac04 \ubdf0<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/wiki.openstreetmap.org\/wiki\/Bounding_Box\" target=\"_blank\" rel=\"noopener noreferrer\">\uacbd\uacc4 \uc0c1\uc790<\/a><\/u><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p> Graphql\uc740 API\uc6a9 \ucffc\ub9ac \uc5b8\uc5b4\ub85c, Facebook\uc5d0\uc11c \uac1c\ubc1c\ud588\uc73c\uba70 2015\ub144\uc5d0 \ucd9c\uc2dc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub370\uc774\ud130 \uc694\uad6c \uc0ac\ud56d\uacfc \uc0c1\ud638 \uc791\uc6a9\uc744 \uc124\uba85\ud558\uae30 \uc704\ud55c \uc9c1\uad00\uc801\uc774\uace0 \uc720\uc5f0\ud55c \uad6c\ubb38\uacfc \uc2dc\uc2a4\ud15c\uc744 \uc81c\uacf5\ud558\uc5ec \ud074\ub77c\uc774\uc5b8\ud2b8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub3c4\ub85d \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4. O<\/p>","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1822,10128],"tags":[1726],"ppma_author":[9026],"class_list":["post-2854","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-node-js","category-ottoman","tag-graph-database"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Graphql server in nodejs with express - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn how to perform a geographical query in our data with couchbase.and how we can avoid underfetching or overfetching using Graphql.\" \/>\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\/graphql-server-node-couchbase-ottoman-spatial-view\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Graphql server with node and couchbase, ottoman and spatial view\" \/>\n<meta property=\"og:description\" content=\"Learn how to perform a geographical query in our data with couchbase.and how we can avoid underfetching or overfetching using Graphql.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/graphql-server-node-couchbase-ottoman-spatial-view\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-28T16:41:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:40:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/create_view.png\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Graphql server with node and couchbase, ottoman and spatial view\",\"datePublished\":\"2017-02-28T16:41:20+00:00\",\"dateModified\":\"2025-06-14T04:40:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/\"},\"wordCount\":2619,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"graph database\"],\"articleSection\":[\"Node.js\",\"Ottoman.js ODM\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/\",\"name\":\"Graphql server in nodejs with express - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-02-28T16:41:20+00:00\",\"dateModified\":\"2025-06-14T04:40:21+00:00\",\"description\":\"Learn how to perform a geographical query in our data with couchbase.and how we can avoid underfetching or overfetching using Graphql.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#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\/graphql-server-node-couchbase-ottoman-spatial-view\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Graphql server with node and couchbase, ottoman and spatial view\"}]},{\"@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\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Graphql server in nodejs with express - The Couchbase Blog","description":"couchbase\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\uc5d0\uc11c \uc9c0\ub9ac\uc801 \ucffc\ub9ac\ub97c \uc218\ud589\ud558\ub294 \ubc29\ubc95\uacfc Graphql\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc5b8\ub354\ud398\uce6d \ub610\ub294 \uc624\ubc84\ud398\uce6d\uc744 \ud53c\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uc138\uc694.","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\/graphql-server-node-couchbase-ottoman-spatial-view\/","og_locale":"ko_KR","og_type":"article","og_title":"Graphql server with node and couchbase, ottoman and spatial view","og_description":"Learn how to perform a geographical query in our data with couchbase.and how we can avoid underfetching or overfetching using Graphql.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/graphql-server-node-couchbase-ottoman-spatial-view\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-02-28T16:41:20+00:00","article_modified_time":"2025-06-14T04:40:21+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/create_view.png","type":"","width":"","height":""}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"14\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Graphql server with node and couchbase, ottoman and spatial view","datePublished":"2017-02-28T16:41:20+00:00","dateModified":"2025-06-14T04:40:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/"},"wordCount":2619,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["graph database"],"articleSection":["Node.js","Ottoman.js ODM"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/","url":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/","name":"Graphql server in nodejs with express - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-02-28T16:41:20+00:00","dateModified":"2025-06-14T04:40:21+00:00","description":"couchbase\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\uc5d0\uc11c \uc9c0\ub9ac\uc801 \ucffc\ub9ac\ub97c \uc218\ud589\ud558\ub294 \ubc29\ubc95\uacfc Graphql\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc5b8\ub354\ud398\uce6d \ub610\ub294 \uc624\ubc84\ud398\uce6d\uc744 \ud53c\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uc138\uc694.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/graphql-server-node-couchbase-ottoman-spatial-view\/#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\/graphql-server-node-couchbase-ottoman-spatial-view\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Graphql server with node and couchbase, ottoman and spatial view"}]},{"@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\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, \uac1c\ubc1c\uc790 \ucee4\ubba4\ub2c8\ud2f0 \uad00\ub9ac\uc790, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"\ub85c\ub77c \ucc60\ucf54\ube0c\uc2a4\ud0a4\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 Snr. \uac1c\ubc1c\uc790 \ucee4\ubba4\ub2c8\ud2f0 \ub9e4\ub2c8\uc800\ub85c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \ucee4\ubba4\ub2c8\ud2f0\ub97c \ucd1d\uad04\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub140\ub294 \uc6d4\uac04 \uac1c\ubc1c\uc790 \ub274\uc2a4\ub808\ud130\ub97c \ub2f4\ub2f9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","author_category":"","last_name":"Czajkowski","first_name":"Laura","job_title":"","user_url":"","description":"\ub85c\ub77c \ucc60\ucf54\ube0c\uc2a4\ud0a4\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 Snr. \uac1c\ubc1c\uc790 \ucee4\ubba4\ub2c8\ud2f0 \ub9e4\ub2c8\uc800\ub85c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \ucee4\ubba4\ub2c8\ud2f0\ub97c \ucd1d\uad04\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub140\ub294 \uc6d4\uac04 \uac1c\ubc1c\uc790 \ub274\uc2a4\ub808\ud130\ub97c \ub2f4\ub2f9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2854","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\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=2854"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2854\/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=2854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=2854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=2854"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=2854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}