๐ฌ 'Gutenberg๊ณผ ๋ถ๋ฆฌํ ์ ํ๋ฆฌ์ผ์ด์ '์ ๋ํ ์๋ก์ด ์ ๊ทผ ๋ฐฉ์ ์ ์
๋ฉฐ์น ์ , WPGraphQL์ ์ ์์์ธ Jason Bahl์ด Gutenberg and Decoupled Applications๋ฅผ ๊ณต๊ฐํ์ฌ GraphQL๊ณผ Gutenberg๋ฅผ ํตํฉํ๋ 3๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ์ฅ๋จ์ ์ ๋ถ์ํ์ต๋๋ค.
๊ทธ๋ก๋ถํฐ ์ผ์ฃผ์ผ ์ , ๊ทธ๋ Twitter์์๋ ์ธ๊ธํ์ต๋๋ค. Gato GraphQL์ Gutenberg ๋ชจ๋ธ๋ง ์ ๊ทผ ๋ฐฉ์์ ๋ถ์ ์ ํ๋ค๊ณ ์:
์ ์๊ฒฌ์ผ๋ก๋ ์ด๊ฒ์ ์๋ํ ๋งํ ๊ฒ์ด ์๋๋๋ค. GraphQL์ด ํ์ ์ด ์ง์ ๋ ์คํค๋ง๋ก ํด๊ฒฐํ๋ ค๋ ๊ฒ ์ค ํ๋๋ ํด๋ผ์ด์ธํธ์๊ฒ ์์ธก ๊ฐ๋ฅ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ ๊ณตํ๊ณ , ํ๋ ์์ค๊น์ง ์ํ๋ ๊ฒ์ ์์ฒญํ ์ ์๋ ์ ์ด๊ถ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ถ์ฌํ๋ ๊ฒ์ ๋๋ค.
์์ธก ๊ฐ๋ฅํ ํํ๊ฐ ์๋ ์์ผ๋์นด๋ ใObjectใ ํ์ ์ ๋ฐํํ๋ค๋ ๊ฒ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ๋ ์ด์ ๊ณ์ฝ์ด ์์ผ๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ์ ๋ ์ง ์ค๋จ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ด๊ถ์ ๋นผ์์ ๋ฒ๋ฆฐ ๊ฒ์ ๋๋ค.
์ด ๊ธ์ ํตํด ์ ๋ ์ด ๋ํ์ ์ฐธ์ฌํ๊ฒ ์ต๋๋ค. Jason์ ๋นํ์ ๋์ํ๋ฉด์ ์ ํ๋ฌ๊ทธ์ธ์ ์ ๊ทผ ๋ฐฉ์์ ์ค๋ช ํ๊ณ , ์ ๊ทธ๊ฒ์ด Gutenberg์ ์ค์ ๋ก ๋งค์ฐ ์ ๋ง๋๋ค๊ณ ์๊ฐํ๋์ง ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
COPE๋ฅผ ์ฌ์ฉํ Gutenberg ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ
์ ์ ์๋ฃจ์ ์ ๋ค ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋ณผ ์ ์์ผ๋ฉฐ, ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
GraphQL์ ๊ตฌ๋ํ๊ธฐ ์ํ Gutenberg ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด PHP ์ธก์ ์ถ๊ฐ ์คํค๋ง๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ์ง ์์ต๋๋ค. ๋์ COPE(ใCreate Once, Publish Everywhereใ) ์ ๋ต์ ์ฌ์ฉํ์ฌ ๋ธ๋ก์ ์ ์ฅ๋ ์ฝํ ์ธ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
(COPE๋ ์ฝํ ์ธ ์ ๋จ์ผ ์ ๋ขฐ ์์ค๋ฅผ ๊ฐ๊ณ ์ด๋ฅผ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ธ์ถํ ์ ์๋ ์ ๋ต์ ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋จ์ผ ์ ๋ขฐ ์์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ Gutenberg ๋ธ๋ก ๋ฐ์ดํฐ์ ๋๋ค. COPE์ WordPress์ ๋ํ ๊ตฌํ์ ์ด ๊ธ์์ ์ค๋ช ํ์ต๋๋ค.)
์ต์ข
์ ์ผ๋ก GraphQL์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ธ๋ก์ ๋จ์ผ Block ํ์
์ ๋งคํํจ์ผ๋ก์จ ์์์ Gutenberg ๋ธ๋ก์ ๋ํ ์ถ์ถ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ด ์ ๋ต์ ์ ์ถฉ์์ด์ง ๊ฒฐ์ ์ ์ธ ํด๊ฒฐ์ฑ ์ด ์๋๋๋ค
์ด ์ ๋ต์ Jason์ด ์ง์ ํ๋ ๋ฌธ์ , ์ฆ ์๋ฒ ์ธก์ ์คํค๋ง๊ฐ ์์ด ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ๊ณ์ฝ์ ๋ง๋ค ์ ์๋ค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ์์ต๋๋ค.
COPE๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ด์ ๋ ์ ์ฅ๋ ์ฝํ ์ธ ๋ง์ผ๋ก๋ ์คํค๋ง๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค:
- ์ ์ฅ๋ ์ฝํ ์ธ ๋ ํ๋์ ํ์ ์ ๋ํ๋ด์ง ์์ต๋๋ค
- ์ ์ฅ๋ ์ฝํ ์ธ ๋ ํ๋์ ์ ์ฝ ์กฐ๊ฑด(nullable์ธ์ง? ์์ ์ ์์ธ์ง? ๋ฌธ์์ด์ด ์ด๋ฉ์ผ์ธ์ง URL์ธ์ง?)์ ๋ํ๋ด์ง ์์ต๋๋ค
- nullable ํ๋๋ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง ์ ์๋๋ฐ, ์ด๋ ์ ์ฅ๋ ์ฝํ ์ธ ์ ๋ํ๋์ง ์์ต๋๋ค
๊ทธ๋ฌ๋ COPE ์ ๋ต๊ณผ ๋จ์ผ Block ํ์
์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ธ๋ก์ ํํํจ์ผ๋ก์จ, Gato GraphQL์ ๊ธฐ์กด์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ Gutenberg์์ ๋งค์ฐ ํ๋ฅญํ ํตํฉ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด ๊ธ ์ ์ฒด์์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
Gato GraphQL๊ณผ Gutenberg์ ํตํฉ
์ด ์๋ฃจ์ ์ ์์ง ์งํ ์ค์ธ ์์ ์ด์ง๋ง, ์ด๋ป๊ฒ ๋์ํ ์ง๋ ์ด๋ฏธ ์ค๋ช ํ ์ ์์ต๋๋ค.
๋ธ๋ก๋ง๋ค ๋ค๋ฅธ ํ์
์ ์์กดํ๋(WPGraphQL์ด WPGraphQL for Gutenberg ํ๋ฌ๊ทธ์ธ์ ์์กดํ ๋ ํ๋ ๋ฐฉ์) ๋์ , Gato GraphQL์ ๋ชจ๋ ๋ธ๋ก์ ํํํ๋ ๋จ์ผ Block ํ์
์ ์ ๊ณตํฉ๋๋ค.
์ด ์ฟผ๋ฆฌ์์ Post.blockDataItems ํ๋๋ ๊ฒ์๋ฌผ์์ Block ์์ ๋ชฉ๋ก์ ๊ฒ์ํฉ๋๋ค(๋จ๋ฝ, ์ด๋ฏธ์ง, ๋ชฉ๋ก ๋ฑ ๋ค์ํ Gutenberg ๋ธ๋ก ํฌํจ):
{
post(by: { id: 1499 }) {
title
blockDataItems
}
}ํน์ ๋ธ๋ก์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ค๋ฉด ๋ธ๋ก์ ์ด๋ฆ(core/paragraph, core/quote ๋ฑ)์ ๊ธฐ์ค์ผ๋ก ํํฐ๋งํ ์ ์์ต๋๋ค.
์ด ์ฟผ๋ฆฌ์์๋ ์ด๋ฏธ์ง ๋ธ๋ก๋ง ๊ฒ์ํฉ๋๋ค:
{
post(by: { id: 1177 }) {
title
blockDataItems(
filterBy: { include: "core/image" }
)
}
}๋จ์ผ Block ํ์
์ดํด๋ณด๊ธฐ
์ด ์ ๊ทผ ๋ฐฉ์์์ ์๋ต์ ์คํค๋ง๊ฐ ์๋ ์ ์ฅ๋ ์ฝํ ์ธ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ด ํน์ฑ์ ๊ทธ ์ฅ์ (API๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ฆ)์ด์ ๋จ์ (์๋ฒ-ํด๋ผ์ด์ธํธ ๊ณ์ฝ์ ๊ฐ์ ํ ์ ์์)์ ๋๋ค.
๋ชจ๋ Block ์์๋ ๋ ๊ฐ์ง ์์ฑ์ ํฌํจํฉ๋๋ค:
name: ๋ธ๋ก์ ์ด๋ฆ(core/paragraph,core/quote๋ฑ)meta: ๋ธ๋ก์ ํฌํจ๋ ๋ฉํ๋ฐ์ดํฐ
๊ฐ Gutenberg ๋ธ๋ก์ ์๋ก ๋ค๋ฅด๋ฉฐ, ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค(๋จ๋ฝ ์ฝํ
์ธ , YouTube ๋์์, ์ด๋ฏธ์ง ์์ค URL๊ณผ ํฌ๊ธฐ ๋ฑ). ๋ฐ๋ผ์ meta ํ๋์ ์๋ต์ ํฌํจ๋ ๋ฐ์ดํฐ๋ ๋ฌ๋ผ์ง๋๋ค.
๊ทธ ๋๋ฌธ์ meta ํ๋๋ GraphQL ์คํค๋ง์ ํด๋น JSONObject ํ์
์ ํตํด ๋จ์ํ JSON ๊ฐ์ฒด(ใ์์ใ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์ ์๋)๋ก ๋งคํ๋์์ต๋๋ค.
์ด๋ฐ ์๋ต์ด ์์ฑ๋ฉ๋๋ค:
{
"data": {
"post": {
"title": "COPE with WordPress: Post demo containing plenty of blocks",
"blockDataItems": [
{
"name": "core/paragraph",
"attributes": {
"content": "Lorem ipsum dolor sit amet"
}
},
{
"name": "core/image",
"attributes": {
"src": "https://ps.w.org/gutenberg/assets/banner-1544x500.jpg"
}
},
{
"name": "core/quote",
"attributes": {
"quote": "Etiam tempor orci eu lobortis elementum nibh tellus molestie",
"cite": "Aristoteles"
}
},
{
"name": "core/heading",
"attributes": {
"size": "xl",
"heading": "Welcome to my site"
}
},
{
"name": "core/list",
"attributes": {
"items": [
"First element",
"Second element",
"Third element"
]
}
},
]
}
}
}๋ณด์๋ค์ํผ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ธ๋ก์ด ๋ค๋ฅธ ์์ฑ์ ๊ฒ์ํฉ๋๋ค:
core/paragraph๋content์์ฑ์ ๊ฐ์ง๋๋คcore/image๋src์์ฑ์ ๊ฐ์ง๋ฉฐ, ์ ํ์ ์ผ๋กwidth,height,caption์์ฑ์ ๊ฐ์ง๋๋ค(์ ์๋ต์๋ ๋ํ๋์ง ์์)core/quote๋quote์cite(์ธ์ฉ๋ ์ธ๋ฌผ์ ์ํ) ์์ฑ์ ๊ฐ์ง๋๋คcore/heading์header์size์์ฑ์ ๊ฐ์ง๋๋ค(xl๊ฐ์<h2>๋ฅผ ๋ํ๋ ๋๋ค. COPE๊ฐ ๊ฐ์ ๋์ ์ ํ๋ฆฌ์ผ์ด์ , ์ด ๊ฒฝ์ฐ ์น์ฌ์ดํธ๋ก๋ถํฐ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ)core/list๋items์์ฑ์ ๊ฐ์ง๋ฉฐ, ์ด๋ ์์์ ๋ชฉ๋ก์ ๋๋ค
JSONObject ํ์
์ด ์คํ์ ํฌํจ๋์ง ์๋ ์ด์
์์์ ์ค๋ช
ํ JSONObject ํ์
์ ํตํด GraphQL์ ใ๋์ ใ ํ๋(๋ชจ๋ฅด๋ ํ๋ ๋ฑ) ๋๋ ์ฌ๋ฌ ๊ตฌ์ฑ์ ๊ฐ์ง ์ ์๋ ํ๋(Gutenberg ๋ธ๋ก์ ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋น)๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
ํ์ฌ GraphQL ์คํ์ JSONObject๋ Map ํ์
์ ์ง์ํ์ง ์์ต๋๋ค. ์ง์ ์ถ๊ฐ๊ฐ ์์ฒญ๋์๋๋ฐ, ๊ทธ ์ด์ ๋ก ๋ค์๊ณผ ๊ฐ์ ์๊ฒฌ์ด ์์ต๋๋ค:
[...] ์ด ๊ธฐ๋ฅ์ ๋ถ์ฌ๋ ํนํ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. GraphQL์ด ์ธํฐํ์ด์คํ๋ ๋ง์ ํ์ ์์คํ ๊ณผ ์๋น์ค์์ ์ง์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ก ์ธํด ์๋ฒ๊ฐ Map์ ์ ์กํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ Map์ ์ํ๋๋ฐ, GraphQL์ด Map ์ง์ ์์ด ์ค๊ฐ์ ๋ผ์ด ์๋ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฒ์ ์ปค์คํ ๋ฆฌ์กธ๋ฒ๋ฅผ ๊ตฌํํ๊ณ ํด๋ผ์ด์ธํธ์ ์ปค์คํ ๋ณํ์ ๊ตฌํํ๊ฒ ๋ฉ๋๋ค. ๋ค, ๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ณ ์ ๋ ํด๋ดค์ต๋๋ค๋ง, GraphQL๋ก API ์คํ์ ์์ฑํ๋ ๋ชฉ์ ์ ํผ์ํ๋ ์๋นํ ๋ณด์ผ๋ฌํ๋ ์ดํธ์ ์ถ์ํ๊ฐ ํ์ํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์คํ์์ ์ง์๋์ง ์๋ ๊ฒ์ ๋์ ํ๋๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด GraphQL์ ๊ฐ๋ ฅํ ํ์ ์ง์ ๋์์ ๋ฐํ์ฌ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๊ณ์ฝ์ ๊นจ๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋๋ ์ด ํ์ ์ Gutenberg์ ์ ์ตํ ์ ์์ต๋๋ค. ๋์ค์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ธ๋ก๋ง๋ค ๋ค๋ฅธ ํ์ ๊ณผ ์๋ฒ ์ธก ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋์ ๋ฌธ์
๋ธ๋ก๋ง๋ค ์ GraphQL ํ์ ์ ๋ง๋ค ๊ฒฝ์ฐ, ๋ชจ๋ ํ๋ฌ๊ทธ์ธ์ด ๊ทธ ๋ธ๋ก์ GraphQL ์คํค๋ง์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ ๋ชจ๋ ๋ธ๋ก์ด ์ ์๋ ์ ์๋ฒ ์ธก ๋ ์ง์คํธ๋ฆฌ์ ์์ฑ์ ์ ์ํจ์ผ๋ก์จ ์๋์ผ๋ก ๋ฌ์ฑ๋ ์ ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋น ๋ธ๋ก์ API์์ ์ฌ์ฉํ ์ ์๊ฒ ๋๊ณ , ์ด๋ ์ถ๊ฐ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ์ด๋ค ์ํฉ์์๋ ์ฟผ๋ฆฌ๋ ๊ฒ์๋ฌผ์ ์ ์ฒด ์ฝํ ์ธ ๊ฐ ์ ๋ขฐํ ์ ์๊ฒ ๋ ์ ์์ต๋๋ค.
์ด๋ GraphQL์ด ์ธ๋ถ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค์ ์ํธ์์ฉํ์ฌ ๊ฒ์๋ฌผ์ ๋ชจ๋ ๋ธ๋ก์ ์ด๋ค ๊ธฐ๋ฅ์ ์ ์ฉํ ๋(๋ฒ์ญ, ๋ฌธ๋ฒ ์์ , SEO ์ ์, ๋ถ์ ๋ฑ์ ์๊ฐํด ๋ณด์ธ์) ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด์ ๋ํ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Gutenberg 4๋จ๊ณ์์ ๋ค๊ตญ์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ์์ ์ด๋ฏ๋ก, @strTranslate ๋๋ ํฐ๋ธ๋ฅผ ํตํด ์คํ๋๋ Google Translate API ํธ์ถ๋ก ํ๋ฌ๊ทธ์ธ ๋ด ๋ชจ๋ ๋ธ๋ก์ ๋ฒ์ญํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ธ๋งํด ๋ณด๊ฒ ์ต๋๋ค.
(์ด ์ด๊ธฐ API ๊ธฐ๋ฐ ๋ฒ์ญ ์ดํ, ์ฌ์ฉ์๋ ํญ์ WordPress ํธ์ง๊ธฐ ๋ด์์ ๋ฒ์ญ๋ ์ธ์ด๋ก ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๊ณ์ ํธ์งํ ์ ์์ต๋๋ค.)
๊ฐ๊ธฐ ๋ค๋ฅธ ๋ธ๋ก์๋ ๋ฒ์ญ์ด ํ์ํ ๋ค์ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค:
core/paragraph: ํ ์คํธcore/image: ์บก์ core/quote: ์ธ์ฉ๋ฌธ ๋ฐ ์ธ์ฉ๋ ์ธ๋ฌผ(ใ๊ต์ฅ ์ ์๋ใ๊ณผ ๊ฐ์ ์งํจ์ผ ์ ์์ผ๋ฏ๋ก)core/heading: ์ ๋ชฉcore/list: ๋ชฉ๋ก์ ๋ชจ๋ ํญ๋ชฉ
๋ธ๋ก๋ง๋ค ๋ค๋ฅธ ํ์ ์ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ณผ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
{
post(by: { id: 1 }) {
blocks {
... on CoreParagraphBlock {
content @strTranslate
}
... on CoreImageBlock {
caption @strTranslate
}
... on CoreQuoteBlock {
quote @strTranslate
cite @strTranslate
}
... on CoreHeadingBlock {
heading @strTranslate
}
... on CoreListBlock {
items @strTranslateList
}
... on EmbedTwitterBlock {
caption @strTranslate
}
... on EmbedYoutubeBlock {
caption @strTranslate
}
... on EmbedVimeoBlock {
caption @strTranslate
}
}
}
}์ด๋ฐ ์์ผ๋ก ๊ณ์๋ฉ๋๋ค. ๋ธ๋ก์ด ๋ง์์ง์๋ก ์ด ์ฟผ๋ฆฌ๋ ๊ธธ์ด์ ธ์ ์ฝ๊ฒ 100์ค ์ด์์ผ๋ก ๋์ด๋ฉ๋๋ค.
๋ช ๋ฐฑํ ๋ฌธ์ ๋ ์ฟผ๋ฆฌ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ ์ง ๊ด๋ฆฌํด์ผ ํ๋ ๋ค๋ฃจ๊ธฐ ํ๋ ์กด์ฌ๊ฐ ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ํ ๋ชจ๋ ๋ธ๋ก์ ๋ํด ์๋ํ๊ฒ ํ๋ ค๋ฉด ์ปค์คํ
๊ธฐ๋ฅ์ ๋์
ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด @strTranslate๋ CoreListBlock.items์๋ ์๋ํ์ง ์์ต๋๋ค. ์ด๋ ๋ฌธ์์ด ๋ชฉ๋ก(์ฆ, [String]์ ๋ฐํ)์ธ๋ฐ ๋๋ ํฐ๋ธ๋ String์ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ @strTranslateList๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด core/table์๋ ์์ฒด ์ปค์คํ
๋๋ ํฐ๋ธ(@strTranslateTable?)๊ฐ ํ์ํด์ง๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ํํฐ ์ปค์คํ ๋ธ๋ก์ ์์ฒด ์ปค์คํ ๋๋ ํฐ๋ธ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
๋ํ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ ๋ณด์ ๋๋ค.
์ ๋ถ ์๋๋ฉด ์ ๋ฌด
๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์๋ WordPress ํธ์ง๊ธฐ์ ์ค์น๋ ์์์ ๋ธ๋ก์ด ํฌํจ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ฝ๋ฉํ ๋ ๊ฒ์๋ฌผ์ด ์ด๋ค ๋ธ๋ก์ ์ฌ์ฉํ๋์ง ๋ฏธ๋ฆฌ ์ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ธ๋ก๋น ํ๋์ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ฟผ๋ฆฌ์์ ์ฒ๋ฆฌํด์ผ ํ ํ์ ์ ์๋ ๊ฒ์๋ฌผ์ ๋ธ๋ก ์์ ๋์ผํ์ง ์์ต๋๋ค. ๋์ WordPress ํธ์ง๊ธฐ์ ์ค์น๋ ๋ธ๋ก์ ์์ ๋์ผํด์ง๋๋ค.
WordPress ์ฝ์ด์ ํ๋ฌ๊ทธ์ธ ๋ชจ๋ ํฌํจํ์ฌ ์ฌ์ดํธ์ 100๊ฐ์ ๋ธ๋ก์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๊ทธ๋ฌ๋ฉด GraphQL ์คํค๋ง์ ๋งคํ๋ 100๊ฐ์ ํ์ ์ด ํ์ํฉ๋๋ค. ๋งคํ๋์ง ์์ ๋จ ํ๋๊ฐ ใ์ฝํ ์ธ ๊ณ์ฝใ์ ๊นจ๋จ๋ ค, ์ผ๋ถ ๋ธ๋ก์ ์์ด์์ ํ๋์ค์ด๋ก ๋ฒ์ญ๋๊ณ ๋๋จธ์ง๋ ์์ด๋ก ๋จ์ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ๋๋ ๋ธ๋ก์ ํฌํจํ๋ ์๋๋ ๋ฒ์ญ๋ ๊ฒ์๋ฌผ์ ๋ ์ด์ ์ ๋ขฐํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๋ธ๋ก์ด ๋ ์ง์คํธ๋ฆฌ์ ์ถ๊ฐ๋์ง ์์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ขฐํ ์ ์๊ฒ ๋ ์ ์์ต๋๋ค.
์ ๋ธ๋ก์ด ์ค์น๋ ๋๋ง๋ค ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค
๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ๋ธ๋ก์ GraphQL ์ฟผ๋ฆฌ์์ ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค. ์ฆ, ์ ๋ธ๋ก์ ์ค์นํ ๋๋ง๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ก ๋์๊ฐ์ ์ ๋ฐ์ดํธํ๊ณ ์ฌ๋ฐฐํฌํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋จ์ํ ์ถ๊ฐ ๊ด๋ฃ์ฃผ์๊ฐ ์๋๋๋ค: ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๊น์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊นจ๋จ๋ฆด ์ฐ๋ ค ์์ด ๋ผ์ด๋ธ ์ฌ์ดํธ์ ๋ธ๋ก์ ์ค์นํ ์ ์๊ฒ ๋ฉ๋๋ค.
GraphQL์ WordPress๋ฅผ ์ํด ์กด์ฌํด์ผ ํ๋ฉฐ, ๊ทธ ๋ฐ๋๊ฐ ์๋๋๋ค
JSONObject๊ฐ GraphQL ์คํ์ ์ถ๊ฐ๋์ง ์์ ์ด์ ๋ฅผ ๋ค์ ์๊ฐํด๋ณด๋ฉด, ๊ทธ๊ฒ์ด GraphQL ๋ฐฉ์์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ผ๋ก ๊ด์ฌ์ ๊ฐ๋ ๊ฒ์ GraphQL์ด ์๋๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ ์ฐ๋ ๊ฒ์ WordPress์ด๋ฉฐ, ์ด ๊ฒฝ์ฐ์๋ ๋ ๊ตฌ์ฒด์ ์ผ๋ก Gutenberg์ ๋๋ค.
GraphQL์ Gutenberg์ ํตํฉํ ๋ GraphQL์ WordPress ์ปจํ ์คํธ ๋ด์์ ์๋ํฉ๋๋ค. ์ฆ, WordPress๊ฐ GraphQL์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค. ํ์ง๋ง ๋ ์ค์ํ ๊ฒ์ GraphQL์ด WordPress์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ WordPress๊ฐ ์ฐ์ ํฉ๋๋ค.
์ด๋ค ๊ธฐ๋ฅ์ด GraphQL์๋ ๋ง์ง ์์ง๋ง Gutenberg์๋ ๋ง๋ ๊ฒฝ์ฐ, ๊ทธ๊ฒ์ ๊ณ ๋ คํด์ผ ํ ๊น์?
์ ๋ ๊ทธ๋์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋จ์ผ Block ํ์
์ด ์ด๋ป๊ฒ Gutenberg๋ฅผ ๋ ์ ์ง์ํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จ์ผ Block ํ์
์ผ๋ก ์ด์ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
์์ ์์์ ๋ฐ๋ผ ๋จ์ผ Block ํ์
์ ์ฌ์ฉํ์ฌ ๊ฒ์๋ฌผ์ ๋ชจ๋ ๋ธ๋ก์ ์์ด์์ ํ๋์ค์ด๋ก ๋ฒ์ญํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค(๋๋ ์ด ๊ฐ๋
์ ๊ทผ์ ํ ๋ฐฉ์์ผ๋ก):
{
post(by: { id: 1 }) {
blocks {
name
meta
@advancePointersInArray(paths: "{{ translatablePaths }}")
@underEachArrayItem
@strTranslate(from: "en", to: "fr")
}
}
}์ด๊ฒ ์ ๋ถ์ธ๊ฐ์? ์ ์ฒด ์ฟผ๋ฆฌ๊ฐ? ๋ชจ๋ ๋ธ๋ก์ ๋ฒ์ญํ๊ธฐ ์ํด? ๋ค.
์ฝ์ด์ ํ๋ฌ๊ทธ์ธ ๋ชจ๋์ ์ด๋ฏธ ์กด์ฌํ๊ฑฐ๋ ์์ง ๋ง๋ค์ด์ง์ง ์์ ๋ชจ๋ ๋ธ๋ก์ ๋ํด ์๋ํ ๊น์? ๋ค.
์ด ์ฟผ๋ฆฌ๊ฐ ์กฐ๊ธ ์ด์ํด ๋ณด์ด์๋์? ๊ทธ๋ ๋ค๋ฉด Gato GraphQL์์๋ง ์ง์ํ๋ ๋นํ์ค GraphQL ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค:
{{ translatablePaths }}๋ ์๋ฒ ๋ ๊ฐ๋ฅํ ํ๋๋ก, ํ๋์ ๊ฐ์ ๋ค๋ฅธ ํ๋๋ ๋๋ ํฐ๋ธ์ ์ธ์๋ก ์ ๋ ฅํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค(์ด ๊ฒฝ์ฐBlockํ์ ์translatableFieldsํ๋๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ทธ ๊ฐ์ด@advancePointersInArray๋๋ ํฐ๋ธ์ ์ฃผ์ ๋ฉ๋๋ค)- ๋๋ ํฐ๋ธ๋ ๋ค๋ฅธ ๋๋ ํฐ๋ธ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค
์ด๋ค ๊ธฐ๋ฅ์ด CMS๊ฐ ํ์๋ก ํ๋ ๊ฒ์ ์ ํํ ์ถฉ์กฑ์ํค์ง๋ง ๊ทธ ๊ธฐ๋ฅ์ด ๋นํ์ค์ธ ๊ฒฝ์ฐ, ๊ทธ๋๋ ์ฌ์ฉํด์ผ ํ ๊น์? ์ ๋ ๊ทธ๋์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ๋ํด GraphQL ์คํ์๋ ์์ฒญ์ ํ์ต๋๋ค(๋ฐ์๋ค์ฌ์ง์ง ์๊ฒ ์ง๋ง):
๋จ์ผ Block ํ์
์ ์๋ ๋ฐฉ์
์ฃผ์: ๊ธฐ์ ์ ์ธ ์น์ ์ด ์ด์ด์ง๋๋ค.
Block ํ์
์ translatablePaths ํ๋๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ฒ์ญ์ด ํ์ํ JSONObject์ ์์ฑ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค:
core/paragraph๋["content"]๋ฅผ ๋ฐํํฉ๋๋คcore/image๋["caption"]์ ๋ฐํํฉ๋๋คcore/quote๋["quote", "cite"]๋ฅผ ๋ฐํํฉ๋๋คcore/heading์["header"]๋ฅผ ๋ฐํํฉ๋๋คcore/list๋["items.0", "items.1", "items.2", ...]๋ฅผ ๋ฐํํฉ๋๋ค
@advancePointersInArray๋ ๋ฉํ ๋๋ ํฐ๋ธ์
๋๋ค: ์ดํ ๋๋ ํฐ๋ธ์ ์ปจํ
์คํธ๋ฅผ ์์ ํฉ๋๋ค. ์ดํ ๋๋ ํฐ๋ธ๊ฐ ์ฟผ๋ฆฌ๋ JSONObject ๋ด์ ํ์ ์์(๋จ๋ฝ ๋ธ๋ก์ content ์์ฑ ๋ฑ)๋ฅผ ๋ฐ๋๋ก ํฉ๋๋ค. ๊ฒฝ๋ก ๋ชฉ๋ก์ ๋์ผํ๊ฒ ์ฟผ๋ฆฌ๋ ์ํฐํฐ์์ ํ๊ฐ๋ translatablePaths ํ๋๋ฅผ ํตํด ์ป์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ @underEachArrayItem์ ๋ ๋ค๋ฅธ ๋ฉํ ๋๋ ํฐ๋ธ๋ก, ์ฟผ๋ฆฌ๋ ์ํฐํฐ์ ์์ ๋ชฉ๋ก์ ๋ฐ๋ณตํ๊ณ ๋ฐ๋ณต๋ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ค์ ๋๋ ํฐ๋ธ์ ์ ๋ฌํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ชจ๋ ์ํฐํฐ์ ๋ํด ๋ฒ์ญํ ์์ฑ์ ์ ์ฒด ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๊ณ , ๊ฐ๊ฐ์ String ํ์
์ด๋ฉฐ, ๊ฐ๋ณ String ์์๋ฅผ ์๋๋ก ์ ๋ฌํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก @strTranslate ๋๋ ํฐ๋ธ๋ JSONObject ๋ด์ ํฌํจ๋ String ํ์
์ ์์๋ฅผ ๋ฐ์ JSONObject ์์ฒด ๋ด์์ ๋ฐ๋ก ๋ฒ์ญํฉ๋๋ค.
์ด ์๋ฃจ์
์ด ์ผ๋ง๋ ์ ์ฐํ์ง ์ฃผ๋ชฉํด ์ฃผ์ธ์. JSONObject ๋ด์ ๋ฌธ์์ด ๊ฒฝ๋ก๋ง ์ ๊ณตํ๋ฉด ๊ฐ์ ์ ๊ทผํ๊ณ , @strTranslate(๋๋ ๋ค๋ฅธ ๋๋ ํฐ๋ธ)๋ก ์์ ํ๊ณ , ์ฌ์ง์ด DB์ ๊ฐ์ ๋ค์ ์ ์ฅํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค(์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ์์
์ด ํ์ฌ ์งํ ์ค์
๋๋ค).
core/list์์๋ ์ด๋ฏธ ์๋ํฉ๋๋ค. ๋ชฉ๋ก์ ๋ชจ๋ ์์๋ ์์ฒด ๊ฒฝ๋ก(items.0์ด ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์ ๋ฑ)๋ฅผ ํตํด ๋๋ฌํ ์ ์๊ณ , ๊ฐ๊ฐ์์ String ๊ฐ์ ์ ๊ทผํ์ฌ @strTranslate์ ์ ๋ฌํ ์ ์์ผ๋ฏ๋ก @strTranslateList๋ฅผ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก core/table์์๋ ์๋ํฉ๋๋ค. cells ์์ฑ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋
ธ์ถํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ 2์ฐจ์ ๋ฐฐ์ด(ํ์ ์ํ ๋ฐฐ์ด, ์ด์ ํฌํจํ๋ ๋ฐฐ์ด)์ด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด translatablePaths๋ ["cells.0.0", "cells.0.1", "cells.1.0", ...]๋ก ๋ชจ๋ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์๋ํํฐ ๋ธ๋ก์์๋ ์๋ํฉ๋๋ค. ๊ทธ๋ฅผ ์ํด ๋ธ๋ก ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ฉด ์์ฑ ๊ฒฝ๋ก๋ฅผ ์ถ๋ก ํ ์ ์์ต๋๋ค.
๋จ์ผ Block์ PHP ์ฝ๋์ ๊ธฐ๋ฐํ ์ค์ ์ด ํ์ํฉ๋๋ค
๋ธ๋ก์ ๋งคํํ๊ณ ๋ฉํ๋ฐ์ดํฐ ์์ฑ์ ์์น๋ฅผ ํ์ ํ๋ ๊ฒ์ ์ค์ ์ ํตํด ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋งค์ฐ ์ ์ฐํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Gutenberg์์ ๋ธ๋ก์ ์์ฑ์ ์ ์ฅํ ์ ์๋ ๋ ๊ฐ์ง ์์น๊ฐ ์์ต๋๋ค: ์์ฑ(attribute)์ผ๋ก์, ๋๋ ๋ ๋๋ง๋ ์ฝํ ์ธ ๋ด๋ถ์.
์๋ฅผ ๋ค์ด core/image ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค:
<!-- wp:image {"id":1670,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large">
<img src="https://newapi.getpop.org/wp/wp-content/uploads/2021/01/dynamic-include-first-query.webp" alt="" class="wp-image-1670"/>
</figure>
<!-- /wp:image -->์ด ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
id,sizeSlug,linkDestination์์ฑ์ attribute๋ก ์ ์ฅ๋ฉ๋๋คsrc์์ฑ์ ๋ ๋๋ง๋ ์ฝํ ์ธ ๋ด๋ถ์ ์ ์ฅ๋ฉ๋๋ค
์ด์ API๋ฅผ ์ฟผ๋ฆฌํ๋ฉด core/image ๋ธ๋ก์ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
{
"data": {
"blocks": [
{
"name": "core/image",
"meta": {
"id": 1670,
"sizeSlug": "large",
"linkDestination": "none",
"src": "https://newapi.getpop.org/wp/wp-content/uploads/2021/01/dynamic-include-first-query.webp"
}
}
]
}
}API๋ Gutenberg์ ์ ์ฅ๋ ๋ธ๋ก์ ํ์ฑํ์ฌ ์์ฑ์ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค(๊ทธ๊ฒ์ด COPE ์ ๋ต์ ๋๋ค). ์ด ๊ณผ์ ์ ์ด๋ ์ ๋ ์๋์ผ๋ก ์ํ๋ ์ ์๊ณ , ์ดํ ํ ์ ํตํ ์๋ ์ ๋ ฅ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ํ์ํฉ๋๋ค.
attribute๋ก ์ง์ ๋งคํ๋ ์์ฑ์ ์ป๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. GraphQL ์๋ฒ๋ ์ด๋ฏธ ๋ธ๋ก์์ ๋ชจ๋ attribute๋ฅผ ๊ฒ์ํ์ฌ ์์ฑ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋๋ ๋ ธ์ถํ ๊ฒ์ ๋ช ์์ ์ผ๋ก ์ ์ํ๋ ค๋ฉด ํํฐ ํ ์ ํตํด ํ ์ ์์ต๋๋ค:
$attrs = apply_filters("blockPropsAsAttr:core/image", []);
add_filter("blockPropsAsAttr:core/image", function ($attrs) {
return array_merge($attrs, ['id', 'sizeSlug', 'linkDestination']);
})์ฝํ ์ธ ์ ์ ์ฅ๋ ์์ฑ์ ์ ๊ท์์ผ๋ก ์ถ์ถํ ์ ์์ต๋๋ค:
$propRegexes = apply_filters("blockPropsAsRegex:core/image", []);
add_filter("blockPropsAsRegex:core/image", function ($propRegexes) {
$propRegexes['src'] = '/<img src="(.*?)"/';
return $propRegexes;
})๋ง์ง๋ง์ผ๋ก @strTranslate๊ฐ ์์ฉํ ๋ธ๋ก์ ๋ฒ์ญ ๊ฐ๋ฅํ ์์ฑ์ ์ง์ ํฉ๋๋ค:
$propRegexes = apply_filters("translatableProperties:core/image", []);
add_filter("translatableProperties:core/image", function ($properties) {
$properties[] = 'caption';
return $properties;
})์ด์ ์ด๋ฌํ ์์ฑ๋ค์ ์ฌ์ ํ ๋๊ตฐ๊ฐ, ์๋ง๋ ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฐ์๊ฐ ์ถฉ์กฑ์์ผ์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ฒ ์ธก ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ฐ์ถ๋ฉด ์ด ๋ชฉํ ๋ฌ์ฑ์ ๋์์ด ๋ฉ๋๋ค.
ํ์ง๋ง WordPress ์ปค๋ฎค๋ํฐ๊ฐ ์ ์๋ ์๋ฒ ์ธก ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ง ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด ์ ๋ต์ ์ฝ๊ฒ ์ ์ํ ์ ์์ต๋๋ค. ๋งคํ์ PHP ์ฝ๋๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(๋ฐฉ๊ธ ๋ณด์ฌ๋๋ฆฐ ๊ฒ์ฒ๋ผ).
์ด๋ค ๋ธ๋ก์ด ๋งคํ๋์ง ์์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๋ Gutenberg์ ๋ํ ์ฝ๊ฐ์ ์ง์๋ง ์์ผ๋ฉด(GraphQL์ด๋ ์คํค๋ง์ ๋ํ ์ง์์ ๋ถํ์) ์ง์ ๋งคํํ ์ ์์ต๋๋ค.
๋ํ ๋งคํ๋์ง ์์ ๋ธ๋ก(๋ฒ์ญํ ์ ์๋ ๋ธ๋ก)์ด ์์ ๋ GraphQL์ด ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ๋ณด๋ด๋๋ก ํ ์๋ ์์ต๋๋ค. ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด @sendEmail ๋๋ ํฐ๋ธ๋ฅผ ์คํํ๋ @if ๋ฉํ ๋๋ ํฐ๋ธ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ์คํํ ์ ์์ต๋๋ค:
{
post(by: { id: 1 }) {
blocks {
name
meta
@advancePointersInArray(paths: "{{ translatablePaths }}")
@underEachArrayItem
@strTranslate(from: "en", to: "fr")
@if(condition: "{{ isTranslatablePathsUnmapped }}")
@sendEmail(
to: "{{ root.adminEmail }}",
subject: "Block with name {{ name }} has 'translatablePaths' unmapped"
)
}
}
}์ด ์๋ฃจ์ ์ ์ ์ฐํ๊ณ ๋จ์ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ฑฐ๋ Gutenberg ์๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ์ง ์์๋ GraphQL์ด WordPress๋ฅผ ์ํด ๋ด์ฌํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
GraphQL๊ณผ Gutenberg์ ํตํฉ์ด ์ด๋ป๊ฒ ๋ ์ง(WordPress ์ฝ์ด์ ์ ์ฌ์ ์ผ๋ก ํฌํจ๋๋ ๊ด์ ์์) ์๊ฐํ ๋, GraphQL์ด Gutenberg์ ๋ชจ๋ ๋ฏธ๋ ์๊ตฌ ์ฌํญ์ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ํ ์์ ํ ์ง์์ด ํ์ํฉ๋๋ค:
- ๋ค๊ตญ์ด ๋ธ๋ก
- Full Site Editing
- ํ์ ํธ์ง
- ๋ผ์ด๋ธ ์ฌ์ดํธ์์ ์๋ํํฐ ์๋น์ค์์ ์ํธ์์ฉ
์ด ๋ชจ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ฉด Gutenberg๋ฅผ (์ ์ด๋ ํฌ๊ฒ๋) ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฌ์ฑ๋์ด์ผ ํ๋ฉฐ, ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฐ์์๊ฒ ํ์ํ ์๋ก์ด ์์ ์ ์ค์ฌ์ผ ํฉ๋๋ค.
์ด๋ฅผ ๊ฐ์ํ๋ฉด ์ ๊ฐ ์ฌ๊ธฐ์ ์ ์ํ๋ ๋ค ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์์ด ์ค์ ๋ก ๋งค์ฐ ์ ์๋ํ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.