{"id":5528,"date":"2018-07-26T07:00:06","date_gmt":"2018-07-26T14:00:06","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5528"},"modified":"2023-09-11T00:09:32","modified_gmt":"2023-09-11T07:09:32","slug":"processing-graphql-queries-with-java-spring-boot-and-nosql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/processing-graphql-queries-with-java-spring-boot-and-nosql\/","title":{"rendered":"Java, Spring Boot \ubc0f NoSQL\ub85c GraphQL \ucffc\ub9ac \ucc98\ub9ac\ud558\uae30"},"content":{"rendered":"<p>\uc9c0\ub09c \uba87 \ub2ec \ub3d9\uc548 \uc800\ub294 GraphQL\uc5d0 \ub300\ud574 \ubc30\uc6b0\uace0 RESTful API \uac1c\ubc1c\uc758 \ub300\uc548\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\uae4c\uc9c0\uc758 \ucd08\uc810\uc740 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/using-graphql-with-golang-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener\">GraphQL \ubc0f Golang<\/a> \ubfd0\ub9cc \uc544\ub2c8\ub77c <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/creating-a-graphql-application-with-node-js-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener\">GraphQL \ubc0f Node.js<\/a>. \uc774 \ub450 \uac00\uc9c0 \uac1c\ubc1c \uc5b8\uc5b4\uc5d0\uc11c \ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0 \uac83\uc744 \uc9dc\ub0b8 \uac83 \uac19\uc544\uc11c \uae30\uc5b4\ub97c \ubc14\uafb8\uace0 Java\ub85c \uc6b4\uc744 \uc2dc\ud5d8\ud574\ubcf4\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c\ub294 Java\uc640 \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 Spring Boot \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\uc5ec GraphQL\uc744 \ube60\ub974\uac8c \uc2dc\uc791\ud558\uace0 \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubd05\ub2c8\ub2e4.<\/p>\n<p><!--more--><\/p>\n<p>\ubcf8\ub860\uc5d0 \ub4e4\uc5b4\uac00\uae30\uc5d0 \uc55e\uc11c, \uacf5\ub85c\ub97c \uc778\uc815\ud560 \ub9cc\ud55c \uacf3\uc5d0 \uacf5\ub85c\ub97c \uc778\uc815\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. Prithviraj Pawar\uac00 \ud6cc\ub96d\ud55c \uae00\uc744 \uc37c\uc2b5\ub2c8\ub2e4,\u00a0<a href=\"https:\/\/medium.freecodecamp.org\/graphql-java-development-stack-in-production-21f402c4c37a\" target=\"_blank\" rel=\"noopener\">GraphQL Java \uc11c\ubc84\ub97c \uc989\uc2dc \uac00\ub3d9\ud558\uace0 \uc2e4\ud589\ud558\ub294 \ubc29\ubc95<\/a>\ub97c \ud1b5\ud574 \ubaa8\uc758 \ub370\uc774\ud130 \ub300\uc2e0 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub4f1 \ubcf4\uc644\ud574\uc57c \ud560 \uc810\uc774 \ub9ce\uc558\uc9c0\ub9cc \ub9ce\uc740 \uc544\uc774\ub514\uc5b4\ub97c \uc5bb\uc5c8\uc2b5\ub2c8\ub2e4. \uc81c \uae00\uc744 \uc77d\uc740 \ud6c4 \uadf8\uc758 \uae00\uc744 \uc77d\uc5b4\ubcf4\uc2dc\uae38 \uad8c\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uc694\uad6c \uc0ac\ud56d<\/h2>\n<p>GraphQL\uacfc \uac1c\ubc1c \uce21\uba74\uc73c\ub85c \ub4e4\uc5b4\uac00\uae30 \uc804\uc5d0 \ucda9\uc871\ud574\uc57c \ud560 \uba87 \uac00\uc9c0 \uc804\uc81c \uc870\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubbf8 Couchbase\ub97c \uc124\uce58, \uad6c\uc131 \ubc0f \uc2e4\ud589\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uae30\ubcf8 \uae30\ub2a5\ub9cc \uc0ac\uc6a9\ud560 \uac83\uc774\ubbc0\ub85c Couchbase Server 5.0 \uc774\ud6c4 \ubc84\uc804\uc740 \ubb34\uc5c7\uc774\ub4e0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c Spring Boot \uae30\ubcf8 \ud504\ub85c\uc81d\ud2b8\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud588\ub2e4\uace0 \uac00\uc815\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 <a href=\"https:\/\/start.spring.io\/\" target=\"_blank\" rel=\"noopener\">Spring Boot \uc6f9\uc0ac\uc774\ud2b8<\/a> \uc5d0\ub294 \uc885\uc18d\uc131\uc744 \uc815\uc758\ud560 \uc218 \uc788\ub294 \ud6cc\ub96d\ud55c \uc0dd\uc131\uae30\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uac00\uc774\ub4dc\uc5d0 \ub530\ub77c \uc77c\uad00\uc131\uc744 \uc720\uc9c0\ud558\ub824\uba74 Maven\uc774 \uc544\ub2cc Gradle \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h2>Gradle \ud504\ub85c\uc81d\ud2b8 \uc885\uc18d\uc131 \uc815\uc758\ud558\uae30<\/h2>\n<p>Spring Boot \ud15c\ud50c\ub9bf\uc774 \uc900\ube44\ub418\uc5b4 \uc788\ub2e4\uba74 \ub9e4\uc6b0 \ube48\uc57d\ud560 \uac83\uc785\ub2c8\ub2e4. Gradle \uad6c\uc131\uc5d0 \uc0ac\uc6a9\ud558\ub824\ub294 \uc885\uc18d\uc131\uc744 \ud3ec\ud568\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8\uc758\u00a0<strong>build.gradle<\/strong> \ud30c\uc77c\uc744 \uc5f4\uace0 \ub2e4\uc74c\uc744 \ud3ec\ud568\ud558\uc138\uc694:<\/p>\n<pre class=\"lang:default decode:true\">\uc758\uc874\uc131 {\r\n    compile('org.springframework.boot:spring-boot-starter-web')\r\n    compile('com.couchbase.client:java-client')\r\n    compile('com.graphql-java:graphql-java:9.0')\r\n    testCompile('org.springframework.boot:spring-boot-starter-test')\r\n}<\/pre>\n<p>GraphQL \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud574 Spring Boot, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640\uc758 \uc0c1\ud638 \uc791\uc6a9\uc744 \uc704\ud574 Couchbase Java SDK, \ucffc\ub9ac \ucc98\ub9ac\ub97c \uc704\ud574 GraphQL \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h2>RESTful \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub85c Java API \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\ud558\uae30<\/h2>\n<p>\uc885\uc18d\uc131\uc744 \uc124\uc815\ud588\uc73c\ub2c8 \uc774\uc81c API \uac1c\ubc1c\uc744 \uc2dc\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 \uc77c\ubc18\uc801\uc778 RESTful API\ub97c \ub300\uccb4\ud558\uae30 \uc704\ud574 GraphQL\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc9c0\ub9cc, \uadf8\ub807\ub2e4\uace0 \ud574\uc11c REST\uac00 \uc644\uc804\ud788 \ubc30\uc81c\ub41c \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc5ec\uc804\ud788 GraphQL \ucffc\ub9ac\ub97c \ubcf4\ub0bc \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8, \ud328\ud0a4\uc9c0 \ub4f1\uc758 \uc774\ub984\uc744 \uc9c0\uc815\ud55c \uac83\uc5d0 \ub530\ub77c \ub2e4\uc74c\uc774 \ud3ec\ud568\ub41c \ud30c\uc77c\uc744 \uc5fd\ub2c8\ub2e4. <code>\uba54\uc778<\/code> \ud568\uc218\ub97c \ud638\ucd9c\ud558\uace0 \ub2e4\uc74c\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">\ud328\ud0a4\uc9c0 com.couchbase.graphql;\r\n\r\ncom.couchbase.client.java.Bucket\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\nimport com.couchbase.client.java.Cluster;\r\ncom.couchbase.client.java.CouchbaseCluster\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ncom.couchbase.client.java.document.json.JsonObject\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.DataFetcher\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.beans.factory.annotation.Autowired\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.beans.factory.annotation.Value\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.boot.SpringApplication\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.boot.autoconfigure.SpringBootApplication\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.context.annotation.Bean\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.http.HttpStatus\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.http.ResponseEntity\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RequestBody\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RequestMapping\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RequestMethod\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RestController\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.ExecutionInput\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.ExecutionResult;\r\ngraphql.GraphQL\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.GraphQLSchema\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.StaticDataFetcher\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.RuntimeWiring\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.SchemaGenerator\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.SchemaParser\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.TypeDefinitionRegistry\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\n\r\nimport javax.annotation.PostConstruct;\r\n\r\n\uc815\uc801 graphql.schema.idl.RuntimeWiring.newRuntimeWiring\uc744 \uc784\ud3ec\ud2b8\ud569\ub2c8\ub2e4;\r\n\r\nimport java.io.File;\r\nimport java.nio.file.Files;\r\nimport java.nio.file.Paths;\r\nimport java.util.HashMap;\r\nimport java.util.Map;\r\n\r\n\uc2a4\ud504\ub9c1 \ubd80\ud305 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\r\nRestController\r\npublic class GraphqlApplication {\r\n\r\n\tpublic static void main(String[] args) { {\r\n\t\tSpringApplication.run(GraphqlApplication.class, args);\r\n\t}\r\n\r\n\t@RequestMapping(value=\"\/\", method= RequestMethod.GET)\r\n\tpublic Object rootEndpoint() {\r\n        Map response = new HashMap();\r\n        response.put(\"message\", \"Hello World\");\r\n        \uc751\ub2f5\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4;\r\n\t}\r\n\r\n    @RequestMapping(value=\"\/graphql\", method= RequestMethod.POST)\r\n    public Object graphql(@RequestBody String request) {\r\n        JsonObject jsonRequest = JsonObject.fromJson(request);\r\n        jsonRequest\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4;\r\n    }\r\n}<\/pre>\n<p>\ud328\ud0a4\uc9c0\uc640 \ud074\ub798\uc2a4 \uc774\ub984\uc774 \uc81c \uc774\ub984\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\ub2e4\ub294 \uc810\uc744 \uae30\uc5b5\ud558\uc138\uc694. \uc801\uc808\ud55c \uacbd\uc6b0 \ube48\uce78\uc744 \ucc44\uc6b0\uc138\uc694.<\/p>\n<p>\ub450 \uac1c\uc758 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uac00 \uc788\ub294\ub370 \ud558\ub098\ub294 \uc644\uc804\ud788 \uc120\ud0dd \uc0ac\ud56d\uc785\ub2c8\ub2e4. \uc800\ub294 <code>\ub8e8\ud2b8 \uc5d4\ub4dc\ud3ec\uc778\ud2b8<\/code> \ub97c \uc0ac\uc6a9\ud558\uc5ec RESTful API\uac00 \uc2e4\uc81c\ub85c \uc791\ub3d9\ud558\ub294\uc9c0 \ud14c\uc2a4\ud2b8\ud588\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 <code>\uadf8\ub798\ud504 \ucffc\ub9ac<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 \uc6b0\ub9ac\uac00 \uc2dc\uac04\uc744 \ubcf4\ub0bc \uacf3\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc5d0\uc11c\ub294 \uc694\uccad \ubcf8\ubb38\ubfd0\ub9cc \uc544\ub2c8\ub77c POST \uc694\uccad\ub3c4 \uae30\ub300\ud569\ub2c8\ub2e4. \uc694\uccad \ubcf8\ubb38\uc740 \uacb0\uad6d \uc2e4\uc81c GraphQL \ucffc\ub9ac\uac00 \ub420 \uac83\uc774\uc9c0\ub9cc \uc9c0\uae08\uc740 \uadf8\ub300\ub85c \ub450\uc5b4\ub3c4 \ub429\ub2c8\ub2e4.<\/p>\n<h2>GraphQL \uc2a4\ud0a4\ub9c8 \ubb38\uc11c \ub514\uc790\uc778<\/h2>\n<p>\uc9c0\uae08\uae4c\uc9c0\ub294 \uae30\ubcf8\uc801\uc778 Spring Boot \uc900\ube44 \uc791\uc5c5\ub9cc \uc218\ud589\ud588\uc744 \ubfd0 GraphQL\uacfc \uc2e4\uc81c\ub85c \uad00\ub828\ub41c \uc791\uc5c5\uc740 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. GraphQL\uc774 \uac00\ub2a5\ud558\ub824\uba74 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ucffc\ub9ac\uc640 \uc791\uc5c5 \uc911\uc778 \ub370\uc774\ud130 \uc720\ud615\uc744 \uc124\uba85\ud558\ub294 \uc815\uc758\ub41c \uc2a4\ud0a4\ub9c8\ub97c \uc54c\uc544\uc57c \ud569\ub2c8\ub2e4. \uc774\ub97c \uc218\ud589\ud558\ub294 \ubc29\ubc95\uc740 \uc5ec\ub7ec \uac00\uc9c0\uac00 \uc788\uc9c0\ub9cc \uc5ec\uae30\uc11c\ub294 \uc2a4\ud0a4\ub9c8 \ubb38\uc11c\uc5d0 \ucd08\uc810\uc744 \ub9de\ucd94\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub0b4 <strong>\ub9ac\uc18c\uc2a4<\/strong> \ud504\ub85c\uc81d\ud2b8\uc758 \ub514\ub809\ud1a0\ub9ac\uc5d0\u00a0<strong>schema.graphql<\/strong> \ud30c\uc77c\uc5d0 \ub2e4\uc74c\uc744 \ud3ec\ud568\ud558\ub294 \ud30c\uc77c\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">\ud0c0\uc785 \ucffc\ub9ac{\r\n    \ud3ec\ucf13\ubaac: \ud3ec\ucf13\ubaac: [\ud3ec\ucf13\ubaac]\r\n    games: [\uac8c\uc784]\r\n    \uac8c\uc784(id: \ubb38\uc790\uc5f4): Game\r\n}\r\n\uc720\ud615 \uac8c\uc784 {\r\n    id: String\r\n    \uc774\ub984: \ubb38\uc790\uc5f4\r\n}\r\n\uc720\ud615 \ud3ec\ucf13\ubaac {\r\n    id: \ubb38\uc790\uc5f4\r\n    \uac8c\uc784: \uac8c\uc784\r\n    name: \ubb38\uc790\uc5f4\r\n    height: Int\r\n    weight: Int\r\n}<\/pre>\n<p>\uba85\ud655\ud558\uc9c0 \uc54a\uc740 \uacbd\uc6b0\ub97c \ub300\ube44\ud574 \ud3ec\ucf13\ubaac \ub370\uc774\ud130\ub85c \uc791\uc5c5\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc704\uc758 \ud30c\uc77c\uc5d0\ub294 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ucffc\ub9ac\uc640 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub450 \uac00\uc9c0 \ub370\uc774\ud130 \uc720\ud615\uc774 \uc815\uc758\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc2dc\uc911\uc5d0\ub294 \ub2e4\uc591\ud55c \ud3ec\ucf13\ubaac \uac8c\uc784\uc774 \uc788\uc73c\uba70 \uac01 \uac8c\uc784\uc5d0\ub294 \uc11c\ub85c \ub2e4\ub978 \ud3ec\ucf13\ubaac\uc774 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc800\ud76c\uac00 \uc815\uc758\ud55c \uad00\uacc4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc9c4\uc815\ud55c \ud3ec\ucf13\ubaac \ud32c\uc774\ub77c\uba74 \uc774\ubcf4\ub2e4 \ub354 \ub9ce\uc740 \uac83\uc774 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uaca0\uc9c0\ub9cc, \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \uc774 \uc815\ub3c4\uba74 \ucda9\ubd84\ud569\ub2c8\ub2e4.<\/p>\n<h2>Couchbase NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc6a9 \uac00\uc838\uc624\uae30 \ub85c\uc9c1 \uac1c\ubc1c\ud558\uae30<\/h2>\n<p>\uc2a4\ud0a4\ub9c8\uac00 \uc815\uc758\ub418\uba74 \ucffc\ub9ac\uac00 \uc2e4\ud589\ub420 \ub54c \uc2e4\ud589\ub420 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub85c\uc9c1\uc744 \ub9cc\ub4e4\uc5b4\uc57c \ud558\uba70, \uc774 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub85c\uc9c1\uc740 \ub450 \ub370\uc774\ud130 \uc720\ud615 \uac01\uac01\uacfc \uc77c\uce58\ud558\ub294 \uacb0\uacfc\ub97c \ubc18\ud658\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8 \uc720\uc9c0 \uad00\ub9ac\ub97c \uc880 \ub354 \uc27d\uac8c \ud558\uae30 \uc704\ud574 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uad00\ub9ac\ub97c \uc704\ud55c \ubcc4\ub3c4\uc758 \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\u00a0<strong>Database.java<\/strong> \ud30c\uc77c\uc5d0 \ub2e4\uc74c\uc744 \ud3ec\ud568\ud558\ub294 \ud30c\uc77c\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">\ud328\ud0a4\uc9c0 com.couchbase.graphql;\r\n\r\ncom.couchbase.client.java.Bucket\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\ncom.couchbase.client.java.document.JsonDocument\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ncom.couchbase.client.java.document.json.JsonObject\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ncom.couchbase.client.java.query.N1qlQuery\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ncom.couchbase.client.java.query.N1qlQueryResult\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ncom.couchbase.client.java.query.N1qlQueryRow\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.DataFetcher\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\npublic class Database {\r\n\r\n    public static DataFetcher getPokemonData(Bucket bucket) { }\r\n\r\n    public static DataFetcher getGameData(Bucket bucket) { }\r\n\r\n    public static DataFetcher getGamesData(Bucket bucket) { }\r\n\r\n    private static List&lt;Map&gt; extractResultOrThrow(N1qlQueryResult result) { }\r\n\r\n}<\/pre>\n<p>\ub300\ubd80\ubd84\uc758 \uacbd\uc6b0 \uc704\uc758 \ud568\uc218 \uc9d1\ud569\uc740 GraphQL \uc2a4\ud0a4\ub9c8 \ud30c\uc77c\uc5d0 \uc788\ub294 \uac83\uacfc \uc5b4\ub290 \uc815\ub3c4 \uc77c\uce58\ud558\ub3c4\ub85d \uc815\uc758\ud588\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uac8c \ubcf4\uc77c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uac01 \uae30\ub2a5\uc744 \ucc44\uc6b0\uae30 \uc804\uc5d0 \uba87 \uac00\uc9c0 \uc8fc\uc758\ud574\uc57c \ud560 \uc0ac\ud56d\uc774 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ubc84\ud0b7\uc740 \ub85c\uc9c1\uc744 \uc815\uc758\ud55c \uc9c1\ud6c4 \uba54\uc778 \ud504\ub85c\uc81d\ud2b8 \ud30c\uc77c\uc5d0 \uc815\uc758\ub429\ub2c8\ub2e4.<\/li>\n<li>GraphQL\uc740 \ud2b9\uc815 \uc720\ud615\uc758 \uc751\ub2f5\uc744 \uae30\ub300\ud558\ubbc0\ub85c, \ub530\ub77c\uc11c <code>\ucd94\ucd9c \uacb0\uacfc \ub610\ub294 \ub358\uc9c0\uae30<\/code> \ub798\ud37c \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc138\uc694.<\/li>\n<\/ol>\n<p>\uc774\ub97c \uc5fc\ub450\uc5d0 \ub450\uace0 \ub798\ud37c \ud568\uc218\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ub798\ud37c \ud568\uc218\uc758 <code>\ucd94\ucd9c \uacb0\uacfc \ub610\ub294 \ub358\uc9c0\uae30<\/code> \ud568\uc218\ub294 N1QL \ucffc\ub9ac\uc5d0\ub9cc \uc0ac\uc6a9\ub418\uba70 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">private static List&lt;Map&gt; extractResultOrThrow(N1qlQueryResult result) {\r\n    List&lt;Map&gt; content = new ArrayList&lt;Map&gt;();\r\n    for (N1qlQueryRow row : result) { {\r\n        content.add(row.value().toMap());\r\n    }\r\n    \ucf58\ud150\uce20\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4;\r\n}<\/pre>\n<p>\uae30\ubcf8\uc801\uc73c\ub85c \uc6b0\ub9ac\ub294 N1QL \uacb0\uacfc \uc9d1\ud569\uc744 \ubc18\ubcf5\ud558\uace0 <code>\ubaa9\ub85d<\/code> \uc758 <code>\uc9c0\ub3c4<\/code> \ub97c \ud074\ub9ad\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uac8c\uc784 \ub370\uc774\ud130\uac00 \uc788\ub2e4\uace0 \uac00\uc815\ud558\uba74, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 <code>getGamesData<\/code> \ud568\uc218\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">public static DataFetcher getGamesData(\ubc84\ud0b7 \ubc84\ud0b7) {\r\n    \ubc18\ud658 \ud658\uacbd -&gt; {\r\n        System.out.println(\"FETCHING GAMES DATA...\");\r\n        String statement = \"SELECT example.* \"\r\n                + \"FROM example \"\r\n                + \"WHERE type = 'game'\"\";\r\n        N1qlQueryResult queryResult = bucket.query(N1qlQuery.simple(statement));\r\n        return extractResultOrThrow(queryResult);\r\n    };\r\n}<\/pre>\n<p>N1QL\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uacfc \uc77c\uce58\ud558\ub294 \ubb38\uc11c\ub97c \ucffc\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>\uc720\ud615<\/code> \uc758 <code>\uac8c\uc784<\/code> \ub97c \uc0ac\uc6a9\ud558\uace0 \ub798\ud37c \ud568\uc218\ub85c \uacb0\uacfc\ub97c \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uc815\ub9d0 \uc5c4\uaca9\ud558\uac8c \ucc98\ub9ac\ud558\uace0 \uc2f6\ub2e4\uba74 \uc640\uc77c\ub4dc\uce74\ub4dc \ubcc4\ud45c\ub97c \uc0ac\uc6a9\ud558\ub294 \ub300\uc2e0 \uc2a4\ud0a4\ub9c8\uc640 \uc77c\uce58\ud558\ub294 \uc18d\uc131\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \uae30\ub2a5\uc785\ub2c8\ub2e4, <code>\ud3ec\ucf13\ubaac \ub370\uc774\ud130 \uac00\uc838\uc624\uae30<\/code>\ub97c \uc0ac\uc6a9\ud558\uba74 \uac8c\uc784 \ub370\uc774\ud130\uc640 \uc720\uc0ac\ud55c \ubc29\uc2dd\uc73c\ub85c \ud3ec\ucf13\ubaac \ub370\uc774\ud130\ub97c \ucffc\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:default decode:true\">public static DataFetcher getPokemonData(\ubc84\ud0b7 \ubc84\ud0b7) {\r\n    \ubc18\ud658 \ud658\uacbd -&gt; {\r\n        System.out.println(\"\ud3ec\ucf13\ubaac \ub370\uc774\ud130 \uac00\uc838 \uc624\uae30...\");\r\n        String statement = \"SELECT example.* \"\r\n                         + \"FROM example \"\r\n                         + \"WHERE type = 'pokemon'\"\";\r\n        N1qlQueryResult queryResult = bucket.query(N1qlQuery.simple(statement));\r\n        return extractResultOrThrow(queryResult);\r\n    };\r\n}<\/pre>\n<p>\ubcc0\uacbd \uc0ac\ud56d \uc678\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \uac83\uc774 \uc5c6\ub2e4\ub294 \uac83\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>\uc720\ud615<\/code> \uc18d\uc131\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c \ud765\ubbf8\ub85c\uc6b4 \uc77c\uc774 \ubc8c\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac8c\uc784 \ub370\uc774\ud130\uc640 \uad00\ub828\ud558\uc5ec \ud3ec\ucf13\ubaac\uc5d0 \ub300\ud55c \ub370\uc774\ud130 \uad00\uacc4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ud604\uc7ac \ucffc\ub9ac\uc5d0\uc11c \uac00\uc838\uc62c \uc218\ub3c4 \uc788\uace0, \ub354 \ubaa8\ub4c8\ud654\ub418\uace0 \uc7a0\uc7ac\uc801\uc73c\ub85c \ub354 \uac00\ubcbc\uc6cc\uc9c0\ub3c4\ub85d \ubd84\ud560\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \ubaa8\ub4c8\uc2dd \uacbd\ub7c9\ud654 \uc635\uc158\uc744 \uc120\ud0dd\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \ud1b5\ud574 \uc6b0\ub9ac\ub294 <code>getGameData<\/code> \ud568\uc218\uc785\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">public static DataFetcher getGameData(\ubc84\ud0b7 \ubc84\ud0b7) {\r\n    \ubc18\ud658 \ud658\uacbd -&gt; {\r\n        \ud574\uc2dc \ub9f5  \ubd80\ubaa8 = environment.getSource();\r\n        JsonDocument \ubb38\uc11c;\r\n        if(parent != null) {\r\n            System.out.println(\"FETCHING GAME DATA FOR \" + (String)parent.get(\"game\") + \"...\");\r\n            document = bucket.get((String) parent.get(\"game\"));\r\n        } else {\r\n            System.out.println(\"FETCHING GAME DATA FOR \" + (String)environment.getArgument(\"id\") + \"...\");\r\n            document = bucket.get((String)environment.getArgument(\"id\"));\r\n        }\r\n        return document.content().toMap();\r\n    };\r\n}<\/pre>\n<p>\uc704\uc758 \ud568\uc218\uc5d0\ub294 \ub450 \uac00\uc9c0 \uc77c\uc774 \ubc1c\uc0dd\ud558\ub294\ub370, \ub458 \ub2e4 N1QL\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc2a4\ud0a4\ub9c8\uc5d0\uc11c\ub294 \uac8c\uc784 \ub370\uc774\ud130\uc5d0 \ub300\ud55c \uc778\uc218 \uae30\ubc18 \ucffc\ub9ac\uc640 \ud3ec\ucf13\ubaac \ub370\uc774\ud130\uc758 \ub370\uc774\ud130 \uad00\uacc4\ub97c \uc815\uc758\ud588\uc2b5\ub2c8\ub2e4. \ub3d9\uc77c\ud55c \ud568\uc218\uc5d0\uc11c \uc774 \ub450 \uac00\uc9c0 \uc2dc\ub098\ub9ac\uc624\ub97c \ubaa8\ub450 \uc218\uc6a9\ud558\ub824\uace0 \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc0ac\uc6a9 <code>environment.getSource()<\/code> \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uba74 \uc694\uccad\uacfc \ud568\uaed8 \uc81c\uacf5\ub418\ub294 \uc0c1\uc704 \ub370\uc774\ud130\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc0c1\uc704 \ub370\uc774\ud130\uc758 \uc608\ub85c\ub294 \ud3ec\ucf13\ubaac \ub370\uc774\ud130\ub97c \ucffc\ub9ac\ud560 \ub54c\ub97c \ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uacbd\uc6b0 <code>\uac8c\uc784<\/code> \ud544\ub4dc\ub294 <code>getGameData<\/code> \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uace0 \uc774\ub984, \ubab8\ubb34\uac8c \ub4f1 \ub2e4\ub978 \ub370\uc774\ud130\ub294 \uc0c1\uc704 \ub370\uc774\ud130\ub97c \ucc38\uc870\ud569\ub2c8\ub2e4. \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac8c\uc784 \uc815\ubcf4\ub294 ID\ub85c \uc800\uc7a5\ub418\ubbc0\ub85c \uc0c1\uc704 \ub370\uc774\ud130\uc5d0\uc11c \uc774\ub97c \ucd94\ucd9c\ud55c \ud6c4 \uac8c\uc784 \ub370\uc774\ud130\ub97c \uc870\ud68c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\ub978 \uc2dc\ub098\ub9ac\uc624\ub294 \uac8c\uc784 ID\ub97c \ub098\ud0c0\ub0b4\ub294 \uc778\uc218\ub97c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub458 \ub2e4 \uc720\ud6a8\ud558\uba70 \ub458 \ub2e4 \ub2e4\ub978 \uc77c\uc744 \ud569\ub2c8\ub2e4. \uacb0\uad6d, \uc6b0\ub9ac\ub294 \uacb0\uacfc \ubc30\uc5f4\uc774 \uc544\ub2cc \ub2e8\uc77c \uacb0\uacfc\ub9cc \uc6d0\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uc131\uacf5\uc801\uc778 GraphQL \ucc98\ub9ac\ub97c \uc704\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud568\uaed8 \ubc30\uc120\ud558\uae30<\/h2>\n<p>\uc774\uc81c \ub9c9\ubc14\uc9c0\uc5d0 \uc774\ub974\ub800\uc2b5\ub2c8\ub2e4. API\uc640 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub85c\uc9c1\uc774 \uc900\ube44\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub294 GraphQL \uc2a4\ud0a4\ub9c8\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub85c\uc9c1\uc5d0 \uc5f0\uacb0\ud558\uace0 \uacb0\uacfc\uac00 \uc81c\ub300\ub85c \uad6c\ud604\ub418\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc804 \ub2e8\uacc4\uc5d0\uc11c \ubc84\ud0b7 \uc815\ubcf4 \uad6c\uc131\uc5d0 \ub300\ud574 \uc5b8\uae09\ud588\ub358 \uac83\uc744 \uae30\uc5b5\ud558\uc2dc\ub098\uc694? \uadf8 \ubd80\ubd84\uc744 \uba3c\uc800 \ucc98\ub9ac\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\uc758\u00a0<strong>application.properties<\/strong> \ud30c\uc77c\uc5d0 \uc788\ub294\u00a0<strong>\ub9ac\uc18c\uc2a4<\/strong> \ub514\ub809\ud130\ub9ac\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e4\uc74c\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">\ud638\uc2a4\ud2b8 \uc774\ub984=127.0.0.1\r\n\ubc84\ud0b7=\uc608\uc2dc\r\n\uc0ac\uc6a9\uc790 \uc774\ub984=\uc608\uc2dc\r\n\ube44\ubc00\ubc88\ud638=123456<\/pre>\n<p>\ub0b4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc815\ubcf4\ub294 \uc608\uc2dc\uc77c \ubfd0\uc785\ub2c8\ub2e4. Couchbase \uc778\uc2a4\ud134\uc2a4\uc5d0 \uc0ac\uc6a9 \uc911\uc778 \uc815\ubcf4\ub85c \ubc14\uafb8\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uba54\uc778 \ud504\ub85c\uc81d\ud2b8 \ud30c\uc77c\ub85c \ub3cc\uc544\uac00\uc11c \uac12\uc744 \ub9e4\ud551\ud558\uace0 \uc778\uc2a4\ud134\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">\ud328\ud0a4\uc9c0 com.couchbase.graphql;\r\n\r\ncom.couchbase.client.java.Bucket\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\nimport com.couchbase.client.java.Cluster;\r\ncom.couchbase.client.java.CouchbaseCluster\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ncom.couchbase.client.java.document.json.JsonObject\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.DataFetcher\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.beans.factory.annotation.Autowired\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.beans.factory.annotation.Value\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.boot.SpringApplication\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.boot.autoconfigure.SpringBootApplication\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.context.annotation.Bean\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.http.HttpStatus\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.http.ResponseEntity\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RequestBody\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RequestMapping\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RequestMethod\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\norg.springframework.web.bind.annotation.RestController\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.ExecutionInput\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.ExecutionResult;\r\ngraphql.GraphQL\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.GraphQLSchema\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.StaticDataFetcher\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.RuntimeWiring\uc744 \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.SchemaGenerator\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.SchemaParser\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\ngraphql.schema.idl.TypeDefinitionRegistry\ub97c \uac00\uc838\uc635\ub2c8\ub2e4;\r\n\r\nimport javax.annotation.PostConstruct;\r\n\r\n\uc815\uc801 graphql.schema.idl.RuntimeWiring.newRuntimeWiring\uc744 \uc784\ud3ec\ud2b8\ud569\ub2c8\ub2e4;\r\n\r\nimport java.io.File;\r\nimport java.nio.file.Files;\r\nimport java.nio.file.Paths;\r\nimport java.util.HashMap;\r\nimport java.util.Map;\r\n\r\n\uc2a4\ud504\ub9c1 \ubd80\ud305 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\r\nRestController\r\npublic class GraphqlApplication {\r\n\r\n    @Value(\"${\ud638\uc2a4\ud2b8\uba85}\")\r\n    \ube44\uacf5\uac1c \ubb38\uc790\uc5f4 \ud638\uc2a4\ud2b8 \uc774\ub984;\r\n\r\n    @Value(\"${\ubc84\ud0b7}\")\r\n    private String \ubc84\ud0b7;\r\n\r\n    @Value(\"${\uc0ac\uc6a9\uc790 \uc774\ub984}\")\r\n    private String \uc0ac\uc6a9\uc790 \uc774\ub984;\r\n\r\n    @Value(\"${password}\")\r\n    private String password;\r\n\r\n    public @Bean\r\n    Cluster cluster() {\r\n        \ud074\ub7ec\uc2a4\ud130 cluster = CouchbaseCluster.create(this.hostname);\r\n        cluster.authenticate(\uc774.\uc0ac\uc6a9\uc790\uba85, \uc774.\ube44\ubc00\ubc88\ud638);\r\n        return cluster;\r\n    }\r\n\r\n    public @Bean\r\n    \ubc84\ud0b7 \ubc84\ud0b7() {\r\n        return cluster().openBucket(this.bucket);\r\n    }\r\n\r\n    \ube44\uacf5\uac1c GraphQL \ube4c\ub4dc;\r\n\r\n\tpublic static void main(String[] args) { {\r\n\t\tSpringApplication.run(GraphqlApplication.class, args);\r\n\t}\r\n\r\n\t@RequestMapping(value=\"\/\", method= RequestMethod.GET)\r\n\tpublic Object rootEndpoint() { }\r\n\r\n    @RequestMapping(value=\"\/graphql\", method= RequestMethod.POST)\r\n    public Object graphql(@RequestBody String request) { }\r\n}<\/pre>\n<p>\ub450 \uac1c\uc758 <code>Bean<\/code> \ub97c \uc5f4\uace0 \uc18d\uc131 \ud30c\uc77c\uc758 \uc815\ubcf4\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \uadf8\ub807\uac8c \ud574\uc11c Couchbase\uc5d0 \uc5f0\uacb0\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \ub2e8\uacc4\ub294 GraphQL \uc2a4\ud0a4\ub9c8\ub97c \ucd08\uae30\ud654\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ubc29\ubc95\uc740 \uc5ec\ub7ec \uac00\uc9c0\uac00 \uc788\uc9c0\ub9cc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc2dc\uc791\ub420 \ub54c Spring Boot \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \uc27d\ub2e4\ub294 \uac83\uc744 \uc54c\uc558\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">@PostConstruct()\r\npublic void init() {\r\n    \ud074\ub798\uc2a4 \ub85c\ub354 classLoader = getClass().getClassLoader();\r\n    File schemaFile = new File(classLoader.getResource(\"schema.graphql\").getFile());\r\n    \uc2a4\ud0a4\ub9c8 \ud30c\uc11c schemaParser = \uc0c8\ub85c\uc6b4 \uc2a4\ud0a4\ub9c8 \ud30c\uc11c();\r\n    \ud0c0\uc785 \uc815\uc758 \ub808\uc9c0\uc2a4\ud2b8\ub9ac typeDefinitionRegistry = schemaParser.parse(schemaFile);\r\n    \ub7f0\ud0c0\uc784 \ubc30\uc120 \ub7f0\ud0c0\uc784\ubc30\uc120 = \ub7f0\ud0c0\uc784\ubc30\uc120.newRuntimeWiring()\r\n            .type(\"Query\",typeWiring -&gt; typeWiring\r\n                    .dataFetcher(\"pokemons\",Database.getPokemonData(bucket()))\r\n            )\r\n            .type(\"Query\",typeWiring -&gt; typeWiring\r\n                    .dataFetcher(\"games\",Database.getGamesData(bucket()))\r\n            )\r\n            .type(\"Query\",typeWiring -&gt; typeWiring\r\n                    .dataFetcher(\"game\",Database.getGameData(bucket()))\r\n            )\r\n            .type(\"Pokemon\",typeWiring -&gt; typeWiring\r\n                    .dataFetcher(\"game\",Database.getGameData(bucket())))\r\n            ).build();\r\n\r\n    \uc2a4\ud0a4\ub9c8 \uc0dd\uc131\uae30 schemaGenerator = \uc0c8\ub85c\uc6b4 \uc2a4\ud0a4\ub9c8 \uc0dd\uc131\uae30();\r\n    \uadf8\ub798\ud504QLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);\r\n    this.build = GraphQL.newGraphQL(graphQLSchema).build();\r\n}<\/pre>\n<p>\uadf8\ub9ac\uace0 <code>init<\/code> \ud568\uc218\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc2dc\uc791\ub420 \ub54c \ud638\ucd9c\ub429\ub2c8\ub2e4. \uc774 \ud568\uc218\ub294 \uc2a4\ud0a4\ub9c8 \ud30c\uc77c\uc744\u00a0<strong>\ub9ac\uc18c\uc2a4<\/strong> \ub514\ub809\ud130\ub9ac\ub97c \ub9cc\ub4e4\uace0 \ubc30\uc120\uc744 \uc815\uc758\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 <code>\ud3ec\ucf13\ubaac<\/code>, <code>\uac8c\uc784<\/code>\ubc0f <code>\uac8c\uc784(id: \ubb38\uc790\uc5f4)<\/code> \ub294 \ubaa8\ub450 \ucffc\ub9ac \uc720\ud615\uc785\ub2c8\ub2e4. \uac01\uac01\uc740 \uc801\uc808\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud568\uc218\uc5d0 \ub9e4\ud551\ub418\uace0 \uc5f4\ub9b0 \ubc84\ud0b7\uc774 \uc804\ub2ec\ub429\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c <code>\uac8c\uc784<\/code> \ub97c <code>\ud3ec\ucf13\ubaac<\/code> \uc720\ud615\uc73c\ub85c \uc815\uc758\ud569\ub2c8\ub2e4. \ud544\ub4dc\uc640 \ucffc\ub9ac\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\ud638 \uc791\uc6a9\uc5d0 \uc5b4\ub5bb\uac8c \uc5f0\uacb0\ub418\ub294\uc9c0 \uc5b4\ub290 \uc815\ub3c4 \uc815\uc758\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc2a4\ud0a4\ub9c8\ub97c \ube4c\ub4dc\ud558\uace0 \ub098\uba74 \ud074\ub798\uc2a4 \ubcc0\uc218\uc5d0 \uc2a4\ud0a4\ub9c8\ub97c \uc5f0\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ube4c\ub4dc\ub41c \uc2a4\ud0a4\ub9c8\ub85c GraphQL RESTful \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uc644\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">@RequestMapping(value=\"\/graphql\", method= RequestMethod.POST)\r\npublic Object graphql(@RequestBody String request) {\r\n    JsonObject jsonRequest = JsonObject.fromJson(request);\r\n    ExecutionInput executionInput = ExecutionInput.newExecutionInput().query(jsonRequest.getString(\"query\")).build();\r\n    \uc2e4\ud589 \uacb0\uacfc \uc2e4\ud589 \uacb0\uacfc = \uc774.\ube4c\ub4dc.\uc2e4\ud589(\uc2e4\ud589 \uc785\ub825);\r\n    executionResult.toSpecification()\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4;\r\n}<\/pre>\n<p>\uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0\uc11c\ub294 \uc694\uccad\uacfc \ud568\uaed8 \uc804\ub2ec\ub41c \ucffc\ub9ac \ubb38\uc790\uc5f4\uc744 \uac00\uc838\uc640\uc11c \ube4c\ub4dc\ub41c \uc2a4\ud0a4\ub9c8\ub85c \uc2e4\ud589\ud569\ub2c8\ub2e4. \uacb0\uacfc\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ucffc\ub9ac\uc5d0\uc11c \uc694\uccad\ud55c \ub0b4\uc6a9\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub807\ub2e4\uba74 \ucffc\ub9ac\ub294 \uc5b4\ub5a4 \ubaa8\uc2b5\uc77c\uae4c\uc694? \ub2e4\uc74c\uc744 \uc608\ub85c \ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \ud3ec\ucf13\ubaac {\r\n    name\r\n    weight\r\n    \uac8c\uc784 {\r\n      \uc774\ub984\r\n    }\r\n  }\r\n  \uac8c\uc784 {\r\n    name\r\n  }\r\n  game(id: \"game-2\") {\r\n    name\r\n  }\r\n}<\/pre>\n<p>\uc704\uc758 \ucffc\ub9ac\ub294 \ub204\uad6c\ub098 \uc2e4\ud589\ud560 \ud544\uc694\ub294 \uc5c6\uc9c0\ub9cc, \uc6d0\ud55c\ub2e4\uba74 \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc704\uc758 \uc608\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \ud3ec\ucf13\ubaac \ub370\uc774\ud130\uc640 \ud3ec\ucf13\ubaac\uc774 \uc18d\ud55c \uac8c\uc784\uc5d0 \ub300\ud574 \ucffc\ub9ac\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c \ud2b9\uc815 \uac8c\uc784\ubfd0\ub9cc \uc544\ub2c8\ub77c \ubaa8\ub4e0 \uac8c\uc784\uc5d0 \ub300\ud574 \ucffc\ub9ac\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ucffc\ub9ac\uc758 \uc138 \ubd80\ubd84\uc740 \ubaa8\ub450 \uc11c\ub85c \uad00\ub828\uc774 \uc5c6\uc9c0\ub9cc \ub3d9\uc77c\ud55c \ucffc\ub9ac\uc5d0 \uc874\uc7ac\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc7ac\ubbf8\uc788\ub294 \uc0ac\uc2e4\uc740 <code>\ud3ec\ucf13\ubaac<\/code> \ucffc\ub9ac\uc5d0\uc11c \uac8c\uc784 \ub370\uc774\ud130\ub97c \ucffc\ub9ac\ud558\uc9c0 \uc54a\uae30\ub85c \uc120\ud0dd\ud558\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud568\uc218\ub294 \ud638\ucd9c\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. GraphQL\uc740 \ud544\uc694\ud560 \ub54c\ub9cc \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uacb0\ub860<\/h2>\n<p>\ubc29\uae08 Spring Boot, Java, Couchbase Server\ub97c NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c \uc0ac\uc6a9\ud558\uc5ec GraphQL \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc0d8\ud50c \ucffc\ub9ac\uc5d0\uc11c \ubcf4\uc168\ub4ef\uc774, RESTful API\uc5d0\uc11c\ub294 \uc5ec\ub7ec \uac1c\uc758 \uc694\uccad\uc774 \ud544\uc694\ud588\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc11c\ub85c \uad00\ub828\uc774 \uc5c6\ub294 \ub370\uc774\ud130\ub97c \ud55c \ubc88\uc758 \uc694\uccad\uc73c\ub85c \ucffc\ub9ac\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Couchbase\uc640 \ud568\uaed8 Java SDK\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc744 \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/developers\/\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uac1c\ubc1c\uc790 \ud3ec\ud138<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Over the span of the past few months I&#8217;ve been learning about GraphQL and how to use it as an alternative to RESTful API development. The focus thus far had been around GraphQL and Golang as well as GraphQL and [&hellip;]<\/p>","protected":false},"author":63,"featured_media":5529,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1816,1818,1812],"tags":[1393,2210],"ppma_author":[9032],"class_list":["post-5528","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-couchbase-server","category-java","category-n1ql-query","tag-api","tag-graphql"],"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>GraphQL Queries: Convert + Build w\/ Java, Spring Boot, NoSQL<\/title>\n<meta name=\"description\" content=\"In this Couchbase tutorial, we\u2019re going to see how to quickly get up and running with GraphQL queries using Java, Spring Boot, and NoSQL frameworks.\" \/>\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\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Processing GraphQL Queries with Java, Spring Boot, and NoSQL\" \/>\n<meta property=\"og:description\" content=\"In this Couchbase tutorial, we\u2019re going to see how to quickly get up and running with GraphQL queries using Java, Spring Boot, and NoSQL frameworks.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-26T14:00:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-11T07:09:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/07\/coffee-1580595_1920.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Processing GraphQL Queries with Java, Spring Boot, and NoSQL\",\"datePublished\":\"2018-07-26T14:00:06+00:00\",\"dateModified\":\"2023-09-11T07:09:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\"},\"wordCount\":1690,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg\",\"keywords\":[\"API\",\"graphql\"],\"articleSection\":[\"Application Design\",\"Couchbase Server\",\"Java\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\",\"name\":\"GraphQL Queries: Convert + Build w\/ Java, Spring Boot, NoSQL\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg\",\"datePublished\":\"2018-07-26T14:00:06+00:00\",\"dateModified\":\"2023-09-11T07:09:32+00:00\",\"description\":\"In this Couchbase tutorial, we\u2019re going to see how to quickly get up and running with GraphQL queries using Java, Spring Boot, and NoSQL frameworks.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg\",\"width\":1920,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Processing GraphQL Queries with Java, Spring Boot, and NoSQL\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"GraphQL Queries: Convert + Build w\/ Java, Spring Boot, NoSQL","description":"In this Couchbase tutorial, we\u2019re going to see how to quickly get up and running with GraphQL queries using Java, Spring Boot, and NoSQL frameworks.","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\/processing-graphql-queries-with-java-spring-boot-and-nosql\/","og_locale":"ko_KR","og_type":"article","og_title":"Processing GraphQL Queries with Java, Spring Boot, and NoSQL","og_description":"In this Couchbase tutorial, we\u2019re going to see how to quickly get up and running with GraphQL queries using Java, Spring Boot, and NoSQL frameworks.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/processing-graphql-queries-with-java-spring-boot-and-nosql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-07-26T14:00:06+00:00","article_modified_time":"2023-09-11T07:09:32+00:00","og_image":[{"width":1920,"height":1024,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/07\/coffee-1580595_1920.jpg","type":"image\/jpeg"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"8\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Processing GraphQL Queries with Java, Spring Boot, and NoSQL","datePublished":"2018-07-26T14:00:06+00:00","dateModified":"2023-09-11T07:09:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/"},"wordCount":1690,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg","keywords":["API","graphql"],"articleSection":["Application Design","Couchbase Server","Java","SQL++ \/ N1QL Query"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/","url":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/","name":"GraphQL Queries: Convert + Build w\/ Java, Spring Boot, NoSQL","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg","datePublished":"2018-07-26T14:00:06+00:00","dateModified":"2023-09-11T07:09:32+00:00","description":"In this Couchbase tutorial, we\u2019re going to see how to quickly get up and running with GraphQL queries using Java, Spring Boot, and NoSQL frameworks.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/coffee-1580595_1920.jpg","width":1920,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/processing-graphql-queries-with-java-spring-boot-and-nosql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Processing GraphQL Queries with Java, Spring Boot, and NoSQL"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, \uac1c\ubc1c\uc790 \uc639\ud638\uc790, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"\ub2c9 \ub77c\ubcf4\uc774\ub294 \ucd5c\uc2e0 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc744 \uc639\ud638\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. \uadf8\ub294 Java, JavaScript, Golang \ubc0f Angular, NativeScript, Apache Cordova\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub300\ud55c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. Nic\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","first_name":"Nic","last_name":"Raboy","user_url":"https:\/\/www.thepolyglotdeveloper.com","author_category":"","description":"\ub2c9 \ub77c\ubcf4\uc774\ub294 \ucd5c\uc2e0 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc744 \uc639\ud638\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. \uadf8\ub294 Java, JavaScript, Golang \ubc0f Angular, NativeScript, Apache Cordova\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub300\ud55c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. Nic\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5528","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=5528"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5528\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/5529"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=5528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=5528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=5528"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=5528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}