Apollo-link-rest: Raw HTTP ๋์ ์„ ํ†ตํ•œ Dgraph ์ง€์› ๊ฐ€๋Šฅ

์— ๋งŒ๋“  2018๋…„ 11์›” 06์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apollographql/apollo-link-rest

์ด๊ฒƒ์€ GraphQL๊ณผ Dgraph์˜ GraphQL + -๋ฅผ ํ˜ผํ•ฉํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ cURL์—์„œ์™€ ๊ฐ™์ด Dgraph ์ฟผ๋ฆฌ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด. Dgraph๋Š” Apollo์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

curl -X POST -H 'X-Dgraph-LinRead: {"1": 12}' localhost:8080/query -d $'
{
  balances(func: anyofterms(name, "Alice Bob")) {
    uid
    name
    balance
  }
}' | jq

์ถ”๊ฐ€ ์ •๋ณด: https://docs.dgraph.io/clients/#raw -http

์˜ˆ;

const query = gql`
  query Dgraph {
    apartments@rest(type: "query", path: "query", endpoint: "DgraphEnd") {
      bhk
      uid
    }
  }
`;

`` JS const query = gql
์ฟผ๋ฆฌ D๊ทธ๋ž˜ํ”„ {
์•„ํŒŒํŠธ(ํ•จ์ˆ˜: eq(neighborhood.name, "Lutyens")) @rest(์œ ํ˜•: "์ฟผ๋ฆฌ", ๊ฒฝ๋กœ: "์ฟผ๋ฆฌ", ๋์ : "DgraphEnd") {
bhk
์•„์ด๋””
}
}
`;

Mutation example:

```bash
curl -X POST localhost:8080/mutate -H 'X-Dgraph-MutationType: json' -H 'X-Dgraph-CommitNow: true' -d  $'
    {
      "set": [
      {"name": "Alice"},
      {"name": "Bob"}
    ]
      }' | jq

๊ฑด๋ฐฐ.

enhancement๐Ÿ’ก

๋ชจ๋“  7 ๋Œ“๊ธ€

Postman์˜ "Raw body"๋ฅผ ํ†ตํ•ด Dgraph ์ฟผ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๊ฐ€๋Šฅํ•œ Dgraph๊ฐ€ apollo-link-rest์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค

์ถ”์‹ . "bodyBuilder: $customBuilder"๊ฐ€ ๊ทธ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

image

BTW https://play.dgraph.io/query ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Postman์ด ํ•ด๋‹น ๋์ ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๊ณ  "POST"๋ฅผ ์„ค์ •ํ•˜๊ณ  Body์—์„œ RAW๋ฅผ ์„ค์ •ํ•˜๊ณ  ์•„๋ž˜ ์ฟผ๋ฆฌ๋ฅผ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.

UID๋Š” ํ–ฅํ›„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค.

{
  node(func: uid(0x36bb9)) {
    uid
    expand(_all_) {
      uid
      expand(_all_)
    }
  }
}

์ด๊ฒƒ์€ ํฐ ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. -- ๋‚˜๋Š” ์–ด๋ ค์šด ๋ถ€๋ถ„์ด apollo-link-rest ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค -- ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ customBodyBuilder ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ customFetch ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. -- ์–ด๋ ค์šด ๋ถ€๋ถ„์€ ์˜ฌ๋ฐ”๋ฅธ Dgraph ํ˜ธํ™˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ "์ƒ์„ฑ"ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•Œ์•„๋‚ธ ๊ฒƒ์„ ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ํ•˜์ง€๋งŒ customFetch ๊ตฌํ˜„์œผ๋กœ ์‚ฌ์šฉ๋  ๊ฝค ๊ด‘๋ฒ”์œ„ํ•œ "์ฟผ๋ฆฌ ์ƒ์„ฑ๊ธฐ"๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Dgraph๋Š” GraphQL์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. "GraphQL + -"๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์–ธ์–ด๊ฐ€ ์žˆ๋Š” DB ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ GraphQL์—๋Š” ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ํ˜ธํ™˜๋˜๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์€ ํฐ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ apollo-link-rest๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Dgraph์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ด๋ฏธ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "Hack"). Postman์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์‹œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ "Body"๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

RAW ํ…์ŠคํŠธ๋กœ Body๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์€ Dgraph๊ฐ€ apollo-link-rest์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‘๋‹ต์ด JSON์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋น„๋ฐ€์€ ์—†์Šต๋‹ˆ๋‹ค.

์ด Apollo ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋ฉด Dgraph์˜ ํฐ ์ž ์žฌ๋ ฅ์ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ.

@MichelDiz -- ๊ทธ๋ ‡๋‹ค๋ฉด apollo-link-rest ๋ฅผ ํฌํฌํ•˜๊ณ  apollo-link-dgraph ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ apollo-link-http ๋ฅผ ํฌํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. -- ํ•ด๋‹น ๋ ˆ์ด์–ด๋Š” GraphQL์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ GraphQL์—์„œ GraphQL๊ณผ ์œ ์‚ฌํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฌ์šธ๊นŒ์š”?

apollo-link-http๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dgraph GraphQL+-๊ฐ€ graphql-tag์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์ „์— Dgraph์˜ ๋์ ์—์„œ Apollo ๋งํฌ๋ฅผ ์„ฑ๊ณตํ•˜์ง€ ์•Š๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์š”์ฒญ ๋ณธ๋ฌธ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. /graphql์€ "์ฟผ๋ฆฌ ํ‚ค"์—์„œ ์ฟผ๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ Dgraph์—๋Š” "์ฟผ๋ฆฌ" ํ•„๋“œ๊ฐ€ ์—†๊ณ  RAW ํ•„๋“œ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Dgraph์˜ dev(go lang)๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ํŒ€๊ณผ ์ด ์ƒํ™ฉ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ฃผ์š” ์ฐจ์ด์ ์€ graphql-tag์™€ ์ฟผ๋ฆฌ ํŽ˜์ด๋กœ๋“œ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. apollo-link-rest๋„ graphql-tag๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Dgraph ์ฟผ๋ฆฌ(๋ณธ๋ฌธ์œผ๋กœ)๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  GraphQL๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @' ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. "๊ฒฝ๋กœ:"์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ถ”์ธก์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ์•„์ง ์‹œ๊ธฐ์ƒ์กฐ์ž…๋‹ˆ๋‹ค.

์˜ˆ:

const dgraphQ = ` 
{ 
  users (func: has(user), first:1000 ) {
   id : uid
   name
   email
}
}
`;

const query = gql`
      query dgraphTest(
        $customBuilder: any
      ) {
        users @rest(type: "User ", bodyBuilder: $customBuilder, method: "POST") { 
                                         #Maybe bodyKey?? I'll test it
          id
          name
          email
        }
      }
    `;

apolloClient.query({
  query: Query,
  variables: {
    input: { customBuilder: dgraphQ }
  }
}).then(response => {
  console.log(response);
});

๋‹ค์Œ์€ Dgraph์™€ GraphQL์˜ ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„QL

POST /graphql HTTP/1.1
Host: api.githunt.com
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: xxxxx
query=%7B%0A++++feed+(type%3A+NEW%2C+limit%3A+5)+%7B%0A++++++repository+%7B%0A++++++++owner+%7B+login+%7D%0A++++++++name%0A++++++%7D%0A%0A++++++postedBy+%7B+login+%7D%0A++++%7D%0A++%7D%0A++

Dgraph์˜ GraphQL+-

POST /query HTTP/1.1
Host: play.dgraph.io
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: xxxxx
{
  node(func: uid(0x36bb9)) {
    uid
    expand(_all_) {
      uid
      expand(_all_)
    }
  }
}------WebKitFormBoundary7MA4YWxkTrZu0gW--

ํด๋ผ์ด์–ธํŠธ์—์„œ DGraph๋กœ ์ง์ ‘ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์™€ ๊ฐ™์€ ๊ฐœ๋…์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋‚จ๊ธฐ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋งํฌ๋Š” ๊ณต๊ฐœ ๊ทธ๋ž˜ํ”„๋ฅผ ์ง์ ‘ ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” DGraph๋ฅผ ์†Œ๋น„์ž ์•ฑ์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋“ค์–ด์˜ค๋Š” GraphQL ์ฟผ๋ฆฌ๋ฅผ DGraph ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ‘œ์ค€ Apollo Server ์•ฑ์„ DGraph ๋ฐฑ์—”๋“œ์— ๋งค์šฐ ์‰ฝ๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šคํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • AST ์‚ฌ์šฉ( join-monster ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์—์„œ ์˜๊ฐ์„ ๋ฐ›์Œ). ๊ทธ๋ž˜๋„ ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ์•„์ด๋””์–ด๋ฅผ ํ™”์ดํŠธ๋ณด๋“œ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ๋‹ฌ์— ๋Œ€ํ•œ ์•ฝ์†์€ ์—†์Šต๋‹ˆ๋‹ค.

https://github.com/a-type/dgraphql

์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋งŒ๋“  ์ฟผ๋ฆฌ ๋ณ€ํ™˜ ๋ ˆ์ด์–ด๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ์ด์‹๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์ƒ์˜ apollo-link-dgraph ๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ถ”์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ๋Š” ์Šคํ‚ค๋งˆ ์ž์ฒด๋ฅผ ์ฝ๊ณ  ํ•ด๋‹น AST๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์— ์ƒ๋‹นํžˆ ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰