๐ค ์๋ก์ด Gato GraphQL ๋ฆด๋ฆฌ์ค์ ์ 1.5๋ ์ด๋ ๊ฑธ๋ ธ์๊น์?
Gato GraphQL ๋ฒ์ 0.9๊ฐ ์ถ์๋์์ต๋๋ค. ์ถ์๊น์ง ๊ฑฐ์ 1.5๋
๊ฐ์ ๊ฐ๋ฐ ๊ธฐ๊ฐ๊ณผ 16,000๊ฐ ์ด์์ ์ปค๋ฐ์ด ํ์ํ์ต๋๋ค. ์ ๋ง ๊ธด ์๊ฐ์ด์์ต๋๋ค!
Hacker News์์ ์ด ๋ฐํ๋ฅผ ๊ณต์ ํ์ ๋, ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ ๋ฐ์์ต๋๋ค:
[...] 16k ์ปค๋ฐ์ ๋ฌด์์ด ๋ค์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ ๊ฐ ์ฐธ์ฌํ๋ ํ๋ก์ ํธ ์ค ์ปค๋ฐ ์๊ฐ ๋ง ๊ฐ๋ฅผ ๋๋ ๊ฒ๋ค์ ์์ญ ๋ช ์์ ์๋ฐฑ ๋ช ์ด ํํ์์ผ๋ก ์ผํ๊ณ ์์์ต๋๋ค. [...] ์ด ๊ธ์์ ๋ค๋ฃจ์ง ์์, ๊ทน๋ณตํด์ผ ํ ๋ณต์ก์ฑ์ด ์์๋ ๊ฑธ๊น์?
์ปค๋ฐ ์๋ ๊ทธ๋ค์ง ์ ๋ขฐํ ์ ์๋ ์งํ๊ฐ ์๋๋๋ค. ๋งค์ฐ ๋จ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ํ๋์ ์ปค๋ฐ์ผ๋ก ํธ์ํ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์
๋๋ค. 16k ์ปค๋ฐ ์ค ๋ง์ ์๋ "typo" ์์ ์ด๊ฑฐ๋, README์ ์ค๋ช
์ ์กฐ๊ธ ๊ฐ์ ํ ๊ฒ์ ๋ถ๊ณผํ์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ปค๋ฐ ์๋ ์ค์ ์์
๋์ ๋๋ต์ ์ธ ์ฒ๋๊ฐ ๋ฉ๋๋ค. ๋ํ ํ ๋ฒ์ ์์ญ ๊ฐ, ์ฌ์ง์ด ์๋ฐฑ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ด์ ๋๊ท๋ชจ ์ปค๋ฐ๋ ๋ง์์ต๋๋ค. ๋ฒ์ 0.8๊ณผ 0.9 ์ฌ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ก ๋ฐฉ๋ํ๋ฉฐ, ๊ทธ๊ฒ์ ์์ฑํ๋ ๋ฐ ๋
ธ๋ ฅ๊ณผ ์๊ฐ์ด ํ์ํ์ต๋๋ค.
์ด ๋ธ๋ก๊ทธ ๊ธ์์๋ ๊ทธ ๋ณ๊ฒฝ ์ฌํญ๋ค์ด ๋ฌด์์ธ์ง ์ค๋ช
ํ์ฌ, ์ ์ด๋ ๊ฒ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋์ง ๋ฐํ๊ฒ ์ต๋๋ค. ๊ทธ์ ํจ๊ป, ์ฝ๋๋ฒ ์ด์ค์ ์ถ๊ฐ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ ์๊ฐํฉ๋๋ค. ์ด ๊ธฐ๋ฅ๋ค์ ๊ณง ์ถ์๋ ๋ฒ์ 1.0๊ณผ ํจ๊ป ๋น์ ๋ฐํ๊ฒ ๋ ๊ฒ์
๋๋ค.
GraphQL ์๋ฒ์ ๋ฐฐ๊ฒฝ
๋จผ์ , ์ด ์์ง์ ์ญ์ฌ์ ๋์ ๋ฐฉ์์ ๊ดํ ๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ ๊ฐ๋ตํ ์๊ฐํ๊ฒ ์ต๋๋ค.
(์ด ๋ด์ฉ์ ์ฃผ๋ก ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ๊ธฐ์ ์ ์ธ ๋ด์ฉ์ ๊ด์ฌ์ด ์์ผ์ ๋ถ์ ๋ค์ ์น์ ์ผ๋ก ๋์ด๊ฐ์ ๋ ๋ฉ๋๋ค.)
Gato GraphQL์ PoP(PHP์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ์์ง์ผ๋ก, JavaScript์ React๋ Vue์ ํด๋นํฉ๋๋ค) ์์ ๊ตฌ์ถ๋์ด ์์ต๋๋ค. ์ด ์์ง์ ๋ํ ์์กด์ฑ์ ์ ๋์ ์ด๋ฉฐ, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋ฌ๊ทธ์ธ์ GitHub์ GatoGraphQL/GatoGraphQL ๋ชจ๋
ธ๋ ํฌ์ ํธ์คํ
๋์ด ์์ต๋๋ค.
๋ด๋ถ์ ์ผ๋ก, ์ด ์์กด ๊ด๊ณ๋ ๋ค์๊ณผ ๊ฐ์ ํํ์ ๋๋ค.
Gato GraphQL์ GraphQL ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ๋๋ฑํ ์ปดํฌ๋ํธ ๋ชจ๋ธ๋ก ๋ณํํ๊ณ , PoP๊ฐ ๊ทธ ๋ชจ๋ธ์ ํด๊ฒฐํ์ฌ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค, ๋ฐ์ดํฐ๊ฐ GraphQL ์ฟผ๋ฆฌ์ ํํ๋ก ์ ํํ๋ฉ๋๋ค.
2013๋
์์ 2014๋
๊ฒฝ์ PoP ๊ฐ๋ฐ์ ์์ํ์ ๋ GraphQL์ ์์ง ์กด์ฌํ์ง ์์์ผ๋ฉฐ, ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ก ์ ์ฒ์๋ถํฐ ์ค๊ณยท๊ตฌํ๋์์ต๋๋ค. ์ฐธ์กฐํ ๋ชจ๋ธ์ด ์์๋ค๋ ์ (๊ฐ๋
์ ๋ํด์๋ GraphQL, ๊ตฌํ์ ๋ํด์๋ graphql-js ์ฐธ์กฐ ํ๋ก์ ํธ์ ๊ฐ์)์ ๋์ค์ ์ค๋ช
ํ๊ฒ ์ง๋ง, ์ฅ์ ๋ฌผ์ด ๋๊ธฐ๋ ํ๊ณ ์ถ๋ณต์ด ๋๊ธฐ๋ ํ์ต๋๋ค.
PoP๋ ์ฒ์์ ์๋ฒ ์ฌ์ด๋์์ ์น์ฌ์ดํธ ์ ์ฒด๋ฅผ HTML๋ก ๋ ๋๋งํ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ํ์ด์ง URL์ ?output=json์ ์ถ๊ฐํ๋ฉด JSON ํ์์ผ๋ก ์์ ๋ฐ์ดํฐ๋ฅผ ๋
ธ์ถํ๊ณ , ์ถ๊ฐ URL ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ(์ค์ , DB ๊ฐ์ฒด ๋ฐ์ดํฐ)๋ฅผ ๋์ฑ ์ธ๋ฐํ๊ฒ ์ ํํ ์ ์์์ต๋๋ค.
์๋ ๋งํฌ๋ค์ ํด๋ฆญํด ๋ณด์ธ์(๋ชจ๋ ๋์ผํ ์น ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง URL ํ๋ผ๋ฏธํฐ๊ฐ ๋ค๋ฆ ๋๋ค). ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ํ์ธํด ๋ณด์ธ์:
- HTML ์ฝํ ์ธ : mesym.com/en/posts/
- JSON ์์ ๋ฐ์ดํฐ(์ค์ + DB): mesym.com/en/posts/?output=json
- JSON ์์ ๋ฐ์ดํฐ(DB): mesym.com/en/posts/?output=json&module=data
๋ง์ง๋ง ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ํ ๊ฐ์ง ๊นจ๋ฌ์์ด ์ฐพ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ค์ GraphQL์ ๋๋ค! ์ ์ผํ ํฐ ์ฐจ์ด์ ์ ์๋ต ๋ด ๋ฐ์ดํฐ๊ฐ ์๋ฌต์ ์ด๋ผ๋ ๊ฒ์ผ๋ก, ํ์ด์ง์ ํฌํจ๋ ์ปดํฌ๋ํธ(PHP)์ ์ํด ์ด๋ฏธ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ฉด GraphQL์์๋ ์ฟผ๋ฆฌ๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋์ 2019๋ ๊ฒฝ์ GraphQL์ ์๊ฒ ๋์์ ๋, PoP๋ก GraphQL ์๋ฒ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ ์๊ฒ ๋น์ฐํ ์ผ์ด์์ต๋๋ค. ํด์ผ ํ ์ผ์ GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ทธ ์ฟผ๋ฆฌ์ ๊ธฐ๋ฐํ์ฌ ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ์ฆ์์์ ์์ฑํ๋ ๊ฒ๋ฟ์ด์์ต๋๋ค.
๊ทธ๋์ ๊ทธ๋ ๊ฒ ํ์ต๋๋ค. ์ ์๋ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ธ์ต๋๋ค. PoP๋ ์์ฒด ์ ๋ ฅ ํ์์ ์ดํดํ๋ ๊ฒ์ด์๊ธฐ ๋๋ฌธ์, GraphQL ์ฟผ๋ฆฌ๋ฅผ PoP ํ์์ผ๋ก ๋ณํํด์ผ ํ์ต๋๋ค:
- GraphQL ์ฟผ๋ฆฌ๋ฅผ ํ์ฑํ๊ณ , ๊ทธ๋ค์
- ์ฟผ๋ฆฌ๋ฅผ PoP ํ์์ผ๋ก ๋ณํํ๊ณ , ๊ทธ๋ค์
- PoP ํ์์ ํ์ฑํ๋ค
GraphQL ์ฟผ๋ฆฌ ํ์ฑ์ด ๋ ๋ฒ ์ด๋ฃจ์ด์ก์ผ๋ฉฐ(GraphQL์ฉ ํ ๋ฒ, PoP์ฉ ํ ๋ฒ), PoP ํ์์ AST๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ๋ฐ๋ณตํด์ ํ์ฑํ๋ ๋ฐฉ์์ด์์ต๋๋ค. (AST๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์กฐ์
ํ ์ฝ๋ฉ์ด์์ง๋ง, ๋ฐ๋ฅผ ๋ช
์ธ๊ฐ ์์๊ณ ๊ฐ๋ฐ์ด ์ ๊ธฐ์ ์ผ๋ก ์งํ๋์ด ๋จ์ํ substr(...)์ผ๋ก ๋งค์ผ๋งค์ผ์ ํด๊ฒฐํ๊ณ ์์์ต๋๋ค.)
GraphQL ๋ช
์ธ๊ฐ ์์๋ ๊ฒ์ด ์ฅ์ ๋ฌผ์ด์๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ์
๋๋ค. ์ ์๋ฃจ์
์ ๋๋ ธ๊ณ (๋ฒ์ 0.8 ์์ ์ ์ํฉ์ด์์ต๋๋ค), ์์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์์ง์ GraphQL-first๋ก ์ ํํ๊ธฐ
์ ๊ฐ ๊ฒฐ์ ํ ํด๊ฒฐ์ฑ ์ PoP๊ฐ ๋ค์ดํฐ๋ธ๋ก GraphQL ์ธ์ด๋ฅผ ๋ค๋ฃฐ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด PoP์ ์ ๋ ฅ์ผ๋ก GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฌํ๋ ๊ฒ๋ง์ผ๋ก, ์ถ๊ฐ ์ด๋ํฐ ์์ด, ๋ํ ์์ ์ ๋ ๋ฒ ์ํํ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ๋ชจ๋ธ๋ก ๋ณํ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ PoP ํ๋ก์ ํธ๋ฅผ, GraphQL ์ฟผ๋ฆฌ๋ฅผ ํด๊ฒฐํ๋๋ก ๊ฐ์กฐ๋ ์๋ฒ ์ฌ์ด๋ ์น์ฌ์ดํธ ์ปดํฌ๋ํธ ๋ ๋๋ง PHP ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์, ์ค์ GraphQL ์๋ฒ ์์ฒด๋ก ์ ํํ๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค.
์ฝ๋๋ฒ ์ด์ค๋ ์ดํ ๋๊ท๋ชจ ๋ณํ์ ๊ฑฐ์ณ, ์์ง ๋ด ๋ชจ๋ PHP ์๋น์ค ๊ฐ ์ํ ์ ๋ฌ์ ๊ธฐ๋ฐ์ผ๋ก GraphQL AST๊ฐ ๋์ ๋์์ต๋๋ค. GraphQL AST ๊ฐ์ฒด๊ฐ PoP์ ์ ๋ ฅ์ด ๋์์ต๋๋ค(์ฟผ๋ฆฌ ๋ฌธ์์ด ๋์ ).
PHP ๊ธฐ๋ฐ์ ๋ค๋ฅธ GraphQL ์๋ฒ๋ค์ graphql-php์ ์์กดํ์ง๋ง, Gato GraphQL ํ๋ฌ๊ทธ์ธ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ๋์ ์์์ด์ง๋ง(๋ค๋ฅธ ์ฌ๋์ด ์ฝ๋ฉํ ๊ฒ์ ์ฌ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์), ๋
๋ฆฝ์ฑ ์ธก๋ฉด์์๋ ์ข์ ์์์
๋๋ค. ์ ์๋์ ํ๋จ์ ๋ฐ๋ผ ํ๋ฌ๊ทธ์ธ์ ์ปค์คํ
๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค(๊ทธ๋์ ํ๋ฌ๊ทธ์ธ์ ์ด๋ฏธ ใoneofใ ์
๋ ฅ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค).
๊ทธ๋ฆฌ๊ณ ์๋ ์น์ ์์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ง๋ง, ์ด๊ฒ์ ํฐ ์ด์ ์ ๋๋ค.
GraphQL์ ๋ ์ฐฝ์ ์ธ ๊ธฐ๋ฅ ํตํฉํ๊ธฐ
GraphQL์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ํ์นญ๊ณผ ์ฐ๊ด๋ฉ๋๋ค. ๋น์ฐํ Gato GraphQL์์ ์์์ ๋ฐ์ดํฐ(๊ฒ์๋ฌผ, ์ฌ์ฉ์, ๋๊ธ ๋ฑ)๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
query {
posts(
pagination: { limit: 5, offset: 20 }
sort: { by: DATE, order: ASC }
) {
id
title
content
url
author {
id
name
url
}
comments {
id
date
content
}
}
}ํ์ง๋ง ์ด๊ฒ์ ์ฝ๊ฒ ์ป์ ์ ์๋ ๊ฒฐ๊ณผ์ ๋ถ๊ณผํฉ๋๋ค. GraphQL์ ๋ฐ์ดํฐ ์กฐ์ ๋ฐ ๋ณํ, ์ฌ์ง์ด ์๋น์ค ๊ฐ ์ค๊ฐ ์ญํ ์ ํ๋ ํ์ดํ๋ผ์ธ์ GraphQL์ ํตํฉํ๋ ๋ฑ ๋ค์ํ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์๋ ํ์ฉ๋ ์ ์์ต๋๋ค.
GraphQL์ด ์ ์ฉํ ์ฌ์ฉ ์ฌ๋ก์ ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ๋ ์ด์์ ์์ค์์ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ (์: WordPress ์ฌ์ดํธ์ ์ฌ์ฉ์์ Mailchimp์ ๋ด์ค๋ ํฐ ์ฐ๋ฝ์ฒ ๋ฐ์ดํฐ), ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ์ฌ ๋จ์ผ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ถ์ํ๊ธฐ
- ์ฌ์ดํธ์ ์ฝํ
์ธ ๋ฅผ ์์ ํ๋ ์์
์คํํ๊ธฐ:
- ์ผํ์ฑ ์์
์ผ๋ก, ์๋ฅผ ๋ค์ด ์ฌ์ดํธ๋ฅผ ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก ์ด์ ํ ๋ ์ฝํ
์ธ ์ ๋ฉํ๋ฐ์ดํฐ ์ ์ฒด์์
"www.myoldsite.com"์"mynewsite.com"์ผ๋ก ๊ต์ฒดํ๊ธฐ - ์ง์์ ์ธ ์์
์ผ๋ก, ์์ฑ์๊ฐ ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ฐํํ ๋๋ง๋ค
"http://"๋ฅผ"https://"๋ก ๊ต์ฒดํ๊ธฐ
- ์ผํ์ฑ ์์
์ผ๋ก, ์๋ฅผ ๋ค์ด ์ฌ์ดํธ๋ฅผ ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก ์ด์ ํ ๋ ์ฝํ
์ธ ์ ๋ฉํ๋ฐ์ดํฐ ์ ์ฒด์์
- Google Translate API์ ์ฐ๊ฒฐํ์ฌ ๋ชจ๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ค๋ฅธ ์ธ์ด๋ก ๋ฒ์ญํ๊ธฐ
- ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด ๋ฐํ๋ ํ ์๋์ผ๋ก ํธ์ ์ ์กํ๊ธฐ
PoP๋ ์ด๋ฌํ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ, GraphQL์์ (๊ธฐ๋ณธ์ ์ผ๋ก) ์ง์๋์ง ์๋ ๊ธฐ๋ฅ๋ค์ ํตํด ๊ตฌํ๋ฉ๋๋ค:
- ์คํค๋ง์ ๋ชจ๋ ํ์ ์ ์ถ๊ฐ๋๋ ใ๊ธฐ๋ฅใ ํ๋(ใ๋ฐ์ดํฐใ ํ๋์ ๋ํ์ฌ) ์ง์
- ๋์ผํ ์ฟผ๋ฆฌ ๋ด์์ ํ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํ๋์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌํ๊ธฐ
- ๋๋ ํฐ๋ธ๋ฅผ ํฉ์ฑํ์ฌ ํ ๋๋ ํฐ๋ธ๊ฐ ๋ค๋ฅธ ๋๋ ํฐ๋ธ์ ๋์์ ์์ ํ ์ ์๊ฒ ํ๊ธฐ
- ํ๋ ๊ฐ์ ๋ฐ๋ผ ๋๋ ํฐ๋ธ ์ ์ฉ ์ฌ๋ถ๋ฅผ ๋์ ์ผ๋ก ๊ฒฐ์ ํ๊ธฐ
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ด ๊ธฐ๋ฅ๋ค์ GraphQL ์๋ฒ์์ ์ ๊ฑฐํ๊ณ ์ถ์ง ์์์ต๋๋ค. ์ด๋ฏธ ์ฝ๋ฉํด ๋์๊ณ , ๋ถ๋ช ํ ๊ฐ์น ์๋ ๊ฒ๋ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
v0.9๊ฐ ์ด๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฐ ๋ ๋ฒ์งธ ์ด์ ๋, GraphQL ๋ช
์ธ๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ด ์๋ก์ด ๊ธฐ๋ฅ๋ค์ GraphQL์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค(์๋ฅผ ๋ค์ด, GraphQL ๊ตฌ๋ฌธ์ ์๋ก์ด ์์๋ฅผ ๋์
ํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์์ต๋๋ค).
GraphQL์์์ ๋ฐ์ดํฐ ์กฐ์ ์์
ํ๋ฌ๊ทธ์ธ์์ GraphQL์ ๋์
๋ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๋ฒ์ 1.0์ด ์ถ์๋๋ฉด ๊ฐ๊น์ด ๋ฏธ๋์ ๋์ฑ ๋ช
ํํ๊ฒ ๋ณด์ด๊ฒ ๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ผ๋ถ๋ ์ด๋ฏธ ๋ง๋ณผ ์ ์์ต๋๋ค.
๋ค์ GraphQL ์ฟผ๋ฆฌ๋ ์ธ๋ถ REST API์์ ์ฌ์ฉ์ ํญ๋ชฉ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๊ณ (์๋ต์์ @removeํ ์๋ ์์ต๋๋ค), ๋์ผํ ์ฟผ๋ฆฌ ๋ด ๋ค๋ฅธ ํ๋์ ์ด ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๊ณ , ๊ฐ ํญ๋ชฉ์์ ์ด๋ฉ์ผ ์์ฑ์ ์ถ์ถํ๋ฉฐ, ๋ง์ง๋ง์ผ๋ก ๋์ผ ํญ๋ชฉ์ ์ธ์ด๊ฐ ์์ด ๋๋ ๋
์ผ์ด์ธ ๊ฒฝ์ฐ์๋ง ์ด๋ฉ์ผ์ ๋๋ฌธ์๋ก ๋ณํํฉ๋๋ค:
###################################################################
# Fetch data from a REST endpoint, extract the emails, and make
# uppercase those ones from users with a special language.
###################################################################
query ExtractEmailsFromAPIAndUpperCaseSpecialOnes
{
# Retrieve data from a REST API endpoint
userEntries: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
}
) # @remove # <= Uncomment this directive to not print the API data
emails: _echo(value: $__userEntries)
# Iterate all the entries, passing every entry
# (under the dynamic variable $userEntry)
# to each of the next 4 directives
@underEachArrayItem(
passValueOnwardsAs: "userEntry"
affectDirectivesUnderPos: [1, 2, 3, 4]
)
# Extract property "lang" from the entry
# via the functionality field `_objectProperty`,
# and pass it onwards as dynamic variable $userLang
@applyField(
name: "_objectProperty"
arguments: {
object: $userEntry,
by: {
key: "lang"
}
}
passOnwardsAs: "userLang"
)
# Execute functionality field `_inArray` to find out
# if $userLang is either "en" or "de", and place the
# result under dynamic variable $isSpecialLang
@applyField(
name: "_inArray"
arguments: {
value: $userLang,
array: ["en", "de"]
}
passOnwardsAs: "isSpecialLang"
)
# Extract property "email" from the entry
# and set it back as the value for that entry
@applyField(
name: "_objectProperty"
arguments: {
object: $userEntry,
by: {
key: "email"
}
}
setResultInResponse: true
)
# If $isSpecialLang is `true` then execute
# directive `@strUpperCase`
@if(condition: $isSpecialLang)
@strUpperCase
}๋ค์์ ๊ทธ ์๋ต์ ๋๋ค(ํน์ ์ด๋ฉ์ผ๋ง ๋๋ฌธ์๋ก ๋ณํ๋ ๊ฒ์ ํ์ธํ์ธ์):
{
"data": {
"userEntries": [
{
"email": "abracadabra@ganga.com",
"lang": "de"
},
{
"email": "longon@caramanon.com",
"lang": "es"
},
{
"email": "rancotanto@parabara.com",
"lang": "en"
},
{
"email": "quezarapadon@quebrulacha.net",
"lang": "fr"
},
{
"email": "test@test.com",
"lang": "de"
},
{
"email": "emilanga@pedrola.com",
"lang": "fr"
}
],
"emails": [
"ABRACADABRA@GANGA.COM",
"longon@caramanon.com",
"RANCOTANTO@PARABARA.COM",
"quezarapadon@quebrulacha.net",
"TEST@TEST.COM",
"emilanga@pedrola.com"
]
}
}์ง์ ํ์ธํด ๋ณด์ธ์! "Run" ๋ฒํผ์ ๋๋ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํด ๋ณด์ธ์:
###################################################################
# Fetch data from a REST endpoint, extract the emails, and make
# uppercase those ones from users with a special language.
###################################################################
query ExtractEmailsFromAPIAndUpperCaseSpecialOnes {
# Retrieve data from a REST API endpoint
userEntries: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
}
)
# @remove # <= Uncomment this directive to not print the API data
emails: _echo(value: $__userEntries)
# Iterate all the entries, passing every entry
# (under the dynamic variable $userEntry)
# to each of the next 4 directives
@underEachArrayItem(
passValueOnwardsAs: "userEntry"
affectDirectivesUnderPos: [1, 2, 3, 4]
)
# Extract property "lang" from the entry
# via the functionality field `_objectProperty`,
# and pass it onwards as dynamic variable $userLang
@applyField(
name: "_objectProperty"
arguments: { object: $userEntry, by: { key: "lang" } }
passOnwardsAs: "userLang"
)
# Execute functionality field `_inArray` to find out
# if $userLang is either "en" or "de", and place the
# result under dynamic variable $isSpecialLang
@applyField(
name: "_inArray"
arguments: { value: $userLang, array: ["en", "de"] }
passOnwardsAs: "isSpecialLang"
)
# Extract property "email" from the entry
# and set it back as the value for that entry
@applyField(
name: "_objectProperty"
arguments: { object: $userEntry, by: { key: "email" } }
setResultInResponse: true
)
# If $isSpecialLang is `true` then execute
# directive `@strUpperCase`
@if(condition: $isSpecialLang)
@strUpperCase
}GraphQL ๋ช ์ธ์ ๊ตฌ์๋์ง ์์๋ ๊ฒ์ด ์ฅ์ ๋ฌผ์ด์๋ค๊ณ ๋งํ์ง๋ง, (๋์ด์ผ ๋ณด๋ฉด) ์ถ๋ณต์ด๊ธฐ๋ ํ์ต๋๋ค. GraphQL ๋ช ์ธ์ ์ ์ฝ์ด ์์๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ์์ ๋กญ๊ฒ ๊ฟ๊ฟ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ด ๊ธฐ๋ฅ๋ค์ด Gato GraphQL๋ก ์ด์ ๋๋ฉด์, WordPress ์ฌ์ดํธ์ ์ฝํ
์ธ ๊ฒ์, ์กฐ์, ๋ณํ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ฉ๋์์ ๋งค์ฐ ์ ์ฉํ ๋๋ฐ์๊ฐ ๋ ์ ์์ต๋๋ค. (๋ค๋ง, ์ด ๊ธฐ๋ฅ๋ค์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ๊ณง ์ถ์๋ v1.0๋ถํฐ์
๋๋ค.)
์๊ฐ์ด ๊ฑธ๋ ธ์ง๋ง, ๊ทธ ๋ ธ๋ ฅ์ ๋ถ๋ช ๊ฐ์น ์๋ ๊ฒ์ด์์ต๋๋ค.
์ง๊ธ ๋ฐ๋ก ์ฌ์ฉํด ๋ณด์ธ์!
์ค๋ ๊ธฐ๋ค๋ฆผ์ด ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์๋ค๊ณ ํ์ ํ์ จ๋์? ๊ทธ๋ ๊ฒ ์๊ฐํด ์ฃผ์๋ฉด ๊ฐ์ฌํฉ๋๋ค!
ํ๋ฌ๊ทธ์ธ์ ๋ค์ด๋ก๋ํ๊ณ ์ง์ ํ์ธํด ๋ณด์ธ์:
๊ฐ๋ฐ ํํฉ, ์๋ก์ด ๋ฌธ์, v1.0์ ํฌํจํ ํฅํ ๋ฆด๋ฆฌ์ค ์์์ ๋ฐ์๋ณด๊ณ ์ถ์ผ์ ๊ฐ์? ๋ด์ค๋ ํฐ ๊ตฌ๋
์ ํ์ํฉ๋๋ค.
GitHub์์ ์คํ์์ค ์ฝ๋๋ฅผ ํ์ํ๊ณ ์ถ์ผ์ ๊ฐ์? GatoGraphQL/GatoGraphQL์ ๋ฐฉ๋ฌธํด ๋ณด์ธ์ (๋ณ์ ์ฃผ์๋ ๊ฒ๋ ์ธ์ ๋ ์ง ํ์ํฉ๋๋ค... ๋ณ์ ์ ๋ง ์ข์ํฉ๋๋ค! โญ๏ธโญ๏ธโญ๏ธ)
๊ทธ๋ฐ๋ฐ, WordPress์์ ์ด๋ค ์ฝํ ์ธ ๋ณํ์ด ํ์ํ์ ๊ฐ์(์ด๋ฏธ ์ ์ฉ ์์ ์ฉ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ณ ๊ณ์ ๊ฒฝ์ฐ๋ ํฌํจํ์ฌ)? ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๋ ค ์ฃผ์ธ์.
์ด ๋ด์ฉ์ด ๋ง์์ ๋์ ๋ค๋ฉด, ์น๊ตฌ์ ๋๋ฃ์๊ฒ ๊ณต์ ํ์ฌ ์ฌ๋์ ๋๋ฆฌ ์ ํด ์ฃผ์ธ์ โค๏ธ.