์ด๊ฒ์ 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
๊ฑด๋ฐฐ.
Postman์ "Raw body"๋ฅผ ํตํด Dgraph ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ์๋ง๋ ๊ฐ๋ฅํ Dgraph๊ฐ apollo-link-rest์ ํจ๊ป ์๋ํ๋ค๋ ์ ํธ์ ๋๋ค
์ถ์ . "bodyBuilder: $customBuilder"๊ฐ ๊ทธ ๋ฐฉ๋ฒ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
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์ ์์ฒญ ๋ณธ๋ฌธ์ ์ฐจ์ด์ ์ ๋๋ค.
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++
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๋ฅผ ์์ฑํ ์ ์๋ ๋ฅ๋ ฅ์ ์๋นํ ์์กดํ๊ณ ์์ต๋๋ค.