๐ฅ Gato GraphQL vs WPGraphQL: ๋๊ฒฐ!
2024๋ 05์ 01์ผ ์ ๋ฐ์ดํธ: Gato GraphQL vs WPGraphQL ๋น๊ต๋ฅผ ํ์ธํด ๋ณด์ธ์.
์ ์ฌ ์๋ ์ฌ๋ฌ๋ถ.

์ธ๊ธฐ์ ๋๊ฒฐ์ด ํผ์ณ์ง๋ MGM ๊ทธ๋๋ ๊ฐ๋ ์๋ ๋์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค! ์ค๋ ๋ฐค, ์ฐ๋ฆฌ๋ ์ญ์ฌ๋ฅผ ๋ง๋ค์ด ๊ฐ๋๋ค. ๋ ์ ์ ํ์ดํฐ๊ฐ ๋ง ์์์ ๋ง๋ฅ๋จ๋ ค, ์ดํ ๋ก ์ด์ฌํ ์ธ์์จ ๊ทธ ์์ ๋๊ณ ๊ฒจ๋ฃน๋๋ค:
"WordPress์ GraphQL" ์ธ๊ณ ์ฑํผ์ธ ๐ ์ ํ์ดํ์ ์ฐจ์งํ๊ธฐ ์ํด
์ค๋ฅธ์ชฝ ์ฝ๋์๋ ํ ์ฑํผ์ธ์ด ์์ต๋๋ค. ์ด์ ๊ฒจ์ฐ 4์ด์ด์ง๋ง ์ด๋ฏธ ํ๋ถํ ๊ฒฝํ์ ๊ฐ์ถ๊ณ ์์ผ๋ฉฐ, ์ต๊ทผ ๋ฒ์ 1.0์ ๋๋ฌํ์ฌ wp.org ๋๋ ํฐ๋ฆฌ์ ๊ฒ์๋์๊ณ , ๋์ค๋ค์๊ฒ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ๋์ต๋๋ค.
๐ฅ ๋จ๊ฑฐ์ด ๐ฅ ๋ฐ์๋ก ๐ฅ ๋ง์ดํด ๐ฅ ์ฃผ์ธ์์ค์ค์ค ๐ฅ ...... WPGraphQL!

์ผ์ชฝ ์ฝ๋์๋ ๋์ ์๊ฐ ์์ต๋๋ค. ์ธ์์ ๋์จ ์ง ๊ฒจ์ฐ ํ ๋ฌ์ด ๋์์ง๋ง ์๋์ง ๋์น๊ณ ์ผ์ฌ ์ฐจ๋ฉฐ, ์ฒซ๋ ๋ถํฐ ์์ ์ ๊ฐ์ ์ ๋ฝ๋ด๊ณ ์์ต๋๋ค. ์ค๋์ ๋๊ฒฐ์ ์์ฒญํ ๊ฒ๋ ๋ฐ๋ก ๊ทธ์์ต๋๋ค. ์ค๋ ๋ฐค์ด ๊ทธ์ ๊ธฐํ์ด๋ฉฐ, ์ ์ธ๊ณ๊ฐ ์ฃผ๋ชฉํ๊ณ ์์ต๋๋ค.
๐ฅ ๋จ๊ฑฐ์ด ๐ฅ ๋ฐ์๋ก ๐ฅ ๋ง์ดํด ๐ฅ ์ฃผ์ธ์์ค์ค์ค ๐ฅ ...... Gato GraphQL!

์ค๋ ๋ฐค, ๋ ์ ์๋ ์ฒ์์ผ๋ก ์ผ๊ตด์ ๋ง๋๋ฉฐ 12๋ผ์ด๋ ๊ฒฝ๊ธฐ๋ฅผ ์น๋ฆ ๋๋ค. ๋ง ์ค์์ ์๋ฆฌ๋ฅผ ์ก๊ณ ๊ฐ์ ๋ฒจ์ ๊ธฐ๋ค๋ฆฌ๋ฉด์, ์๋ก๋ฅผ ์ดํผ๋ฉฐ ์๋๋ฐฉ์ ์ฝ์ ์ ์ฐพ์ผ๋ ค ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ ์ ๋ชจ๋ ์์ ๊ฐ ๋์น๋ ํ์ ์ ๋ณด์ผ ๋ฟ์ ๋๋ค.

๋๊ฐ ์น๋ฆฌํ ๊น์? WPGraphQL์ด ์ง์ง์๋ค์ ์์์ ๋ฐํ์ผ๋ก ์ฐ์๋ฅผ ์ ์งํ ๊น์? ์๋๋ฉด ์ ์ฐธ Gato GraphQL์ด ๋ฐฉ์ฌํ๊ณ ์๋ ๋์ค์ ๋๋ผ๊ฒ ํ๋ฉฐ ๊ตฐ์ค์ ์๊ธฐํธ์ผ๋ก ๋ง๋ค๊น์?
์ค๋ ๋ฐค, ์ฌ๋ฌ๋ถ, ์ฐ๋ฆฌ๋ ๊ทธ ๋ต์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ฒ ํ ํ์ธ์. ๊ทธ๋ฆฌ๊ณ ๊ฒฝ๊ธฐ๋ฅผ ์ฆ๊ธฐ์ธ์!
๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ๐คฃ
์ต๊ทผ ์ ์ ํ๋ฌ๊ทธ์ธ์ธ Gato GraphQL๊ณผ WPGraphQL์ ์ฐจ์ด์ ์ ์ค๋ช ํด ๋ฌ๋ผ๋ ์์ฒญ์ ๋ฐ์์ต๋๋ค.
๋ ํ๋ฌ๊ทธ์ธ ๋ชจ๋ WordPress์ฉ GraphQL ์๋ฒ์ด๋ฏ๋ก ๊ฐ์ ๋ชฉ์ ์ ์ํํฉ๋๋ค. ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์๋ก ๋ค๋ฅธ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ด, ํน์ ์๊ฑด์ ์ถฉ์กฑํ๋ ๋ฐ ์์ด์ ํ๋๊ฐ ๋ค๋ฅธ ํ๋๋ณด๋ค ๋ ๋์ ์ ์์ต๋๋ค.
์ ํ๋ฌ๊ทธ์ธ์ ํธํฅ์ด ์๋ค๋ ๊ฒ์ ์ธ์ ํ์ง๋ง, GraphQL๊ณผ WordPress ๋ชจ๋์ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ์ฃผ์ ๋ฅผ ๋ฐํ์ผ๋ก ๊ณต์ ํ ๋น๊ต๋ฅผ ํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. (๋ค๋ฅธ ์ฃผ์ ์ ๋ํ ๋น๊ต๋ฅผ ์ํ์๋ฉด ๊ธฐ๊บผ์ด ์ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.)
์ด ๋น๊ต๋ ์์ ํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ์๋ฒ์์ ๋์ผํ GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋๋ฅผ ์ธก์ ํ๋ ๋ฒค์น๋งํฌ๋ ํ๊ณ ์ถ์ต๋๋ค. (๋ ์ ์ฌ๋ฌ๋ถ์ด ์ด ์ ์์ ํฅ๋ฏธ๋ฅผ ๋๋ผ์ ๋ค๋ฉด, ๋ค์ ๊ธ์์ ๋ค๋ฃฐ ์ ์์ต๋๋ค.)
๋น๊ต๋ฅผ 4๊ฐ์ ์ฃผ์ ์์ญ์ผ๋ก ๋๋์์ต๋๋ค: ์ธ๊ธฐ๋, ์ฝ๋ ์คํ์ผ๊ณผ ํ์ค, ํต์ฌ ์ฌ์, ๋ฒ์ ํ์ฅ. ๊ฐ ์์ญ์ 3๊ฐ์ ํญ๋ชฉ์ด ์์ด ์ด 12๊ฐ์ "๋ผ์ด๋"๊ฐ ๋ฉ๋๋ค. ๋ง์ง๋ง์ ์ฌํ์ด ํ์ ์ ๋ด๋ ค ์ฑํผ์ธ์ ๊ฐ๋ฆฝ๋๋ค.
์๋๋ฅผ ํด๋ฆญํ์ฌ ํน์ ์ฃผ์ ๋ก ๋ฐ๋ก ์ด๋ํ์ธ์:
๐ ๋ฉ ๐ ๋ฉ ๐ ๋ฉ~...
๊ฐ์ ๋ฒจ์ด ์ธ๋ ธ์ต๋๋ค...
๊ฒฝ๊ธฐ๊ฐ ์์๋์์ต๋๋ค!
์ธ๊ธฐ๋
์ํํธ์จ์ด(๋๋ ๊ธฐ์ )๋ ์ฌ๋๋ค์ด ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, ๋์๋ณด๋ค ๋ ๋ฐ์ด๋๋๋ผ๋ ๊ทธ์ ์ผํ์ ๋ถ๊ณผํ ๋ฟ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ ๋น ๋ฅด๊ฒ ํ์ดํํ ์ ์๋ ๋์์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๋ ์ฌ์ ํ ์ฃผ๋ก QWERTY ํค๋ณด๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ ํ๋ฌ๊ทธ์ธ์ ์ผ๋ง๋ ์ธ๊ธฐ๊ฐ ์์๊น์?
๋ผ์ด๋ 1: ๋๊ฐ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์ผ๋ง๋ ์์ฑ๋์๋๊ฐ
WPGraphQL์ ์ง๊ธ๊น์ง WordPress์์ GraphQL์ ๋๋ช ์ฌ์์ต๋๋ค. 4๋ ์ด์์ ๊ฐ๋ฐ ๊ธฐ๊ฐ(2016๋ 11์ ์์)์ ๊ฑฐ์ณ ์ ์ฅ์์์ 2,800๊ฐ ์ด์์ ์คํ๋ฅผ ํ๋ํ๊ณ , 4,600๋ช ์ด์์ ํ๋ก์ ์ปค๋ฎค๋ํฐ๋ฅผ ๊ตฌ์ถํ์์ผ๋ฉฐ, ๊ฑฐ์ 100๋ช ์ ํ๋ก์ ํธ ๊ธฐ์ฌ์๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค.
๋ฒ์ 1.0์ ๋๋ฌํ์ฌ 2020๋ 11์์ wp.org ํ๋ฌ๊ทธ์ธ ๋๋ ํฐ๋ฆฌ์ ๋ฑ๋ก๋์์ต๋๋ค. ๊ทธ ์ดํ๋ก 8,000๊ฐ ์ด์์ ํ์ฑ ์ค์น๋ฅผ ๊ธฐ๋กํ์ต๋๋ค. ํ์ฌ Gatsby์ WordPress ์ฝํ ์ธ ๋ฅผ ์์ฑํ๋ ์ ์ผํ ์๋ฃจ์ ์ด๋ฉฐ, ์ต๊ทผ์๋ WPEngine์ Headless ํ๋ ์์ํฌ์ WebDevStudios์ Next.js WordPress ์คํํฐ ๋ฑ ์ฌ๋ฌ ํ๋ก์ ํธ๊ฐ ์คํ์ ํฌํจ์์ผฐ์ต๋๋ค.
์ฆ, WPGraphQL์ ์ธ๊ธฐ๊ฐ ์์ต๋๋ค.
Gato GraphQL์ ๋ณธ๊ฒฉ์ ์ธ ๊ฐ๋ฐ์ ์ฝ 1.5๋ ์ (๋ ํฐ ํ๋ก์ ํธ์ ์ผ๋ถ๋ก)์ ์์๋์์ผ๋ฉฐ, 6๊ฐ์ ์ ์ "์ถฉ๋ถํ ์ข์" ์ํ์ ๋๋ฌํ์ฌ ์ดํ ์ ์ฅ์์์ 150๊ฐ์ ์คํ๋ฅผ ๋ฐ์์ต๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ ํ์ฌ ๋ฒ์ 0.7์ด๋ฉฐ, 1.0์ ๋๋ฌํ๊ธฐ๊น์ง ์์ง ๋ช ๋ฌ์ด ๋จ์ ์์ต๋๋ค(์๋ฅผ ๋ค์ด, ์คํค๋ง์ ์์ง ์นดํ ๊ณ ๋ฆฌ๊ฐ ์์ต๋๋ค).
์ง๋๋ฌ ํ์ฌ ์ฌ์ดํธ์ธ gatographql.com์ ๊ฐ์คํ์ผ๋ฉฐ, ๊ทธ ์ดํ ๋ธ๋ก๊ทธ(์ง๊ธ ์ฝ๊ณ ๊ณ์ ์ด ๊ธ์ฒ๋ผ)๋ฅผ ํตํด ํ๋ฌ๊ทธ์ธ์ ํ๋ณดํ๊ณ , CSS-Tricks์ ์๊ฐ ๊ธ๋ ๊ฒ์ฌํ์ต๋๋ค. ์ด๋ฌํ ๋ ธ๋ ฅ ๋๋ถ์ ์๋ฐฑ ๋ช ์ด ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ์ผ๋ฉฐ, 100๋ช ์ด์์ ๋ฐฉ๋ฌธ์๊ฐ ํ๋ฌ๊ทธ์ธ์ ๋ค์ด๋ก๋ํ์ต๋๋ค.
์ฆ, Gato GraphQL์ ๋๋ฆฌ์ง๋ง ๊พธ์คํ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ผ๋ฉฐ, ํ์ฌ ์งํ ์ค์ธ ์์ ์ ๋๋ค.
๋ผ์ด๋ ์น์: WPGraphQL.

๋ผ์ด๋ 2: ํ์ฅ ๊ธฐ๋ฅ์ ์ด์ฉ ๊ฐ๋ฅ์ฑ
ํ์ฅ ๊ธฐ๋ฅ์ ํตํด Gato GraphQL์ ํตํด ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ๊ณผ ์ฐ๋ํ ์ ์์ต๋๋ค.
WPGraphQL์๋ ACF, WooCommerce, Yoast ๋ฑ์ ํ์ฅ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
Gato GraphQL์๋ ์์ง ํ์ฅ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ, ๋ฒ์ 1.0 ์ถ์ ์ ์๋ ๋ง์ง ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
ํ์ง๋ง Gato GraphQL์ ์ํคํ ์ฒ์์ ํ์ฅ ๊ธฐ๋ฅ์ ํฌ๊ฒ ๊ฐ์กฐํ๊ณ ์์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ค์ "Modules" ํ์ด์ง์์ ํ์ฅ ๊ธฐ๋ฅ์ ๊ด๋ฆฌ(ํ์ฑํ, ๋นํ์ฑํ, ์ค์ , ๋ฌธ์ ํ์ธ)ํ ์ ์์ต๋๋ค:

์ฆ, WPGraphQL์๋ ์ด๋ฏธ ํ์ฅ ๊ธฐ๋ฅ์ด ์๊ณ , Gato GraphQL์ ๊ทธ ๊ธฐ๋ฐ์ ๋ง๋ จํ๊ณ ์๋ ์ค์ ๋๋ค.
๋ผ์ด๋ ์น์: WPGraphQL.

๋ผ์ด๋ 3: ๋์ ์ฌ์ฉ์
WPGraphQL์ ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค: WordPress ์ฌ์ดํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ค๋ฉด ์ฝ๋ ์ด๋๊ฐ(์ฃผ๋ก JavaScript ํจ์ ๋ด)์ GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ค๋ฉด ํ๋ก๊ทธ๋๋ฐ์ ์ถฉ๋ถํ ๋ฅ์ํด์ผ ํฉ๋๋ค.
๋ฐ๋ฉด Gato GraphQL์ ๋น๊ธฐ์ ์๋ฅผ ํฌํจํ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์๋ค๋ WordPress ์ฒ ํ์ ๋ฐ๋ฆ ๋๋ค. ์ด ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด, WordPress ์๋ํฐ๋ฅผ ํตํด GraphQL ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ํ์ฌ, WordPress ์ฌ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ API๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๋ ๊ฒ๋งํผ ์ฌ์์ง๋๋ค.
๋ํ Gato GraphQL์ GraphQL ์๋น์ค์ ์๊ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ์ํธ์์ฉํ๋ ํด๋ผ์ด์ธํธ ์ ๊ณต์ ๋ ์ค์ ์ ๋ก๋๋ค. ๋ ํ๋ฌ๊ทธ์ธ ๋ชจ๋ GraphiQL ํด๋ผ์ด์ธํธ๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ง๋ง, Gato GraphQL๋ง์ด ์คํค๋ง๋ฅผ ์ธํฐ๋ํฐ๋ธํ๊ฒ ํ์ํ ์ ์๋ Voyager ํด๋ผ์ด์ธํธ๋ ์ ๊ณตํฉ๋๋ค:

๋ผ์ด๋ ์น์: Gato GraphQL.

์ฝ๋ ์คํ์ผ๊ณผ ํ์ค
์ฝ๋ ์ด์ผ๊ธฐ๋ฅผ ํด ๋ด ์๋ค!
GraphQL์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์๋ง๋ ํค๋๋ฆฌ์ค WordPress๋ฅผ ํ๋ฉด์ JavaScript ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ๋ฅผ ๋ ๋๋งํ๊ณ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ชจ๋ํ ํจ๋ฌ๋ค์์ ๋๋ค. ๊ฒ๋ค๊ฐ WordPress๋ ์ค๋๋ CMS์ผ์ง ๋ชจ๋ฅด์ง๋ง, GraphQL์ ์ฌ์ดํธ์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํ ๋ชจ๋ํ ์ธํฐํ์ด์ค์ ๋๋ค. ๋ฐ๋ผ์ ์ฌ๋ฌ๋ถ์ด ์ฐ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ด์ ์ ์ด๋ฉฐ ์ต์ ์ด ์๋ ์๋ฃจ์ ์ ๋ฐ์๋ค์ด์ง ์์ ํ๋ช ํ ๊ฐ๋ฐ์๋ผ๊ณ ์์ ํ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ด ๋ ํ๋ฌ๊ทธ์ธ์ ์ฝ๋(์์ฒด ์ฝ๋๋ฒ ์ด์ค์ ์ปค์คํ ๊ตฌํ์์ ๊ธฐ๋๋๋ ์ฝ๋)๋ ์ผ๋ง๋ ์ฐ์ํ ๊น์?
๋ผ์ด๋ 4: PHP ์๊ตฌ ์ฌํญ
WPGraphQL๊ณผ Gato GraphQL ๋ชจ๋ PHP 7.1 ์ด์์ ์๊ตฌํฉ๋๋ค.
ํ์ง๋ง ์ฐจ์ด์ ์ด ์์ต๋๋ค: Gato GraphQL์ ์ค์ ๋ก PHP 7.4๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ฉ๋๋ฉฐ, ๊ทธ ํ ํ๋ก๋์ ํ๊ฒฝ์์ PHP 7.1๋ก ํธ๋์คํ์ผ๋ฉ๋๋ค.
๋ฐ๋ผ์ Gato GraphQL ์ฝ๋ฉ์ ํจ์ฌ ๋ ์ฆ๊ฒ์ต๋๋ค: object ํ์
, ํ์
์ง์ ํ๋กํผํฐ, ํ์ดํ ํจ์ ๋ฑ ์๋ก์ด PHP ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. PHP 8.0 ์ง์์ด ์ถ๊ฐ๋๋ฉด(Lando์ ์ ๋ฒ์ ์ด ์ถ์๋ ๋), ์ ๋์จ ํ์
, match ํํ์ ๋ฑ๋ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ผ์ด๋ ์น์: Gato GraphQL.

๋ผ์ด๋ 5: ์ฝ๋ฉ ๊ดํ
๋จผ์ WPGraphQL๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. wp-graphql/wp-graphql ์ ์ฅ์๋ฅผ ์ดํด๋ณด๋ฉด, ์ ๋์ ๋๋๋ฌ์ง๋ ๊ฒ์ด ์์ต๋๋ค:

ํ๋ํ๋ฉด:

์ฃ์กํ์ง๋ง, ์ด์ ๋ํด ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ํ๋๋ฟ์ ๋๋ค:

Composer์ vendor ํด๋๋ฅผ ์ ์ฅ์์ ์ปค๋ฐํ๋ ๊ฒ์ ๋์ ๊ดํ์ด๋ฉฐ, Composer๋ ๋ช
์์ ์ผ๋ก ์ด๋ฅผ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์์ ํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ต๋๋ค(GitHub actions์ ๊ธฐ๋ฐํ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ์ ๋ ์์ต๋๋ค), ๊ทธ๋์ ์ ๊ทธ๋ ๊ฒ ๋์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด ๋ผ์ด๋์์๋ WPGraphQL์ด ์ค์ค๋ก๋ฅผ ์น๊ณ ์๋ค๊ณ ๋งํ ์ ์๊ฒ ์ต๋๋ค!

๊ณ์ํ๊ฒ ์ต๋๋ค. WPGraphQL ๊ฐ๋ฐ์๋ ๋งค์ฐ ๊ด๋ฒ์ํ ํ (์ก์ ๋ฐ ํํฐ) ์ปฌ๋ ์ ์ ์์์ผ ํฉ๋๋ค. WPGraphQL์ ๊ฐ๋ฐ์ ์ฐธ์กฐ๋ฅผ ๋ณด๋ฉด ๊ทธ ๊ท๋ชจ๋ฅผ ์ ์ ์์ต๋๋ค.
์ก์ ๋ชฉ๋ก์ ์คํฌ๋ฆฐ์ท์ ์ฐ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ฅผ 50%๊น์ง ์ถ์ํด์ผ ํ์ต๋๋ค:

ํํฐ ๋ชฉ๋ก์ ๊ฒฝ์ฐ, 30%(Firefox๊ฐ ์ง์ํ๋ ์ต์๊ฐ)๊น์ง ์ถ์ํด๋ ์ ์ฒด ๋ชฉ๋ก์ ๋ณผ ์ ์์์ต๋๋ค:

GatoGraphQL/GatoGraphQL ์ ์ฅ์(Gato GraphQL์ ํฌํจํ ๋ชจ๋
ธ๋ ํฌ)๋ก ์ ํํด ๋ณด๊ฒ ์ต๋๋ค.
์ฝ๋์ ๋ช ๊ฐ์ง ํน์ง์ ์๊ฐํฉ๋๋ค:
โ
ํ์ค PSR-1, PSR-4, PSR-12 ์ค์.
โ ๋ชจ๋ ์ฝ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ ์์์ ํจํค์ง๋ก ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉฐ, ๊ทธ ๋ชจ๋(ํ๋ฌ๊ทธ์ธ์ 100๊ฐ ์ด์, ์ ์ฒด ํ๋ก์ ํธ์ 200๊ฐ ์ด์)๊ฐ ๋์ผํ ๋ชจ๋ ธ๋ ํฌ์ ํธ์คํ ๋ฉ๋๋ค.
โ Composer๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์์กด์ฑ์ ๊ด๋ฆฌํฉ๋๋ค.
โ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์๋น์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด Symfony Dependency Injection์ ์ฌ์ฉํฉ๋๋ค. ์๋ก์ด ํ์ ๋ฆฌ์กธ๋ฒ, ํ๋ ๋ฆฌ์กธ๋ฒ, ๋๋ ํฐ๋ธ ๋ฆฌ์กธ๋ฒ๋ฅผ ๋ฑ๋กํ๋ ค๋ฉด ์ปจํ ์ด๋์ ์ ์๋น์ค๋ฅผ ๋ฑ๋กํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
โ ๋ชจ๋ ํด๋์ค๊ฐ ์๋น์ค์ด๋ฉฐ, Symfony Dependency Injection์ด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
โ ๊ธฐ๋ฐ์ด ๋๋ GraphQL ์๋ฒ๋ CMS์ ์ข ์๋์ง ์์ต๋๋ค. Gato GraphQL์ WordPress์ฉ ๊ณ์ฝ์ ๊ตฌํํ๊ณ ์ฝ๊ฐ์ ์ปค์คํ ๋ก์ง(์: ํด๋ผ์ด์ธํธ ์ ๊ณต)์ ์ถ๊ฐํฉ๋๋ค.
WordPress ์ ์ฉ ์ฝ๋๋ ์ ์ฒด ์ฝ๋์ ์ฝ 10%์ ๋ถ๊ณผํฉ๋๋ค. ์ด 10%๋ฅผ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ CMS(Laravel/Drupal ๋ฑ)์ฉ์ผ๋ก ๋ณต์ ํ๋ฉด ํด๋น ํ๊ฒฝ์ GraphQL ์๋ฒ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
โ CMS์ ์ข ์๋์ง ์๋ ๊ฒฐ๊ณผ๋ก, ๋ฆฌ์กธ๋ฒ๋ฅผ ์ฝ๋ฉํ๋ ๊ฒ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋น์ค๋ก ์ง์๋๋ ์ผ๋ฐ์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ์ฝ๋ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. WordPress ์ฝ๋ ๊ด์ ์์ ์๊ฐํ ํ์๊ฐ ์์ผ๋ฉฐ, ๊ทธ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ ์ผ์ด ๊ฑฐ์ ์์ต๋๋ค.
โ ๋ง์ฐฌ๊ฐ์ง๋ก, GraphQL ์คํค๋ง๋ WordPress ๋ฐ์ดํฐ ๋ชจ๋ธ์ 1:1 ๋ณต์ ๋ณธ์ด ์๋๋ฉฐ, WordPress๊ฐ ๋ฐ์ดํฐ ๋ ์ด์ด์์ ์ถ์ ํ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ฐํํ๊ณ ๊น๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
โ GraphQL์ N+1 ๋ฌธ์ ๋ ์ํคํ ์ฒ ์ค๊ณ์ ์ํด ๊ฐ๋ฐ์์๊ฒ ๋ถ๋ด์ ์ฃผ์ง ์๊ณ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
โ ์๋ฒ๋ ๋จ์ํ GraphQL ์๋ฒ๊ฐ ์๋๋๋ค: ์ค์ ๋ก๋ API ์๋ฒ๋ก, ๋จ์ผ ์์ค ์ค๋ธ ํธ๋ฃจ์ค์์ ๋ค๋ฅธ ํ์์ด๋ ์ฌ์(์: REST)์ผ๋ก ์๋ต์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. (์ด์ ๋ํด์๋ ๋ผ์ด๋ 11์์ ์์ธํ ์ค๋ช ํฉ๋๋ค.)
โ
vendor ๋๋ ํฐ๋ฆฌ๋ ์ปค๋ฐ๋์ง ์์ต๋๋ค. ๋์ ์์ค ์ฝ๋๋ ๋ฐฐํฌ ์ฝ๋(WordPress ์ฌ์ดํธ์ ์ค์นํ ์ต์ข
ํ๋ฌ๊ทธ์ธ)๋ก ๋ณํ๋์ด GitHub actions๋ฅผ ํตํด vendor ํด๋๊ฐ ํฌํจ๋ dist ์ ์ฅ์์ ๋ฐฐํฌ๋ฉ๋๋ค.
โ ๋ฐฐํฌ ์ฝ๋๋ฅผ ์์ฑํ ๋ PHP-Scoper๋ก ๋ฒ์๊ฐ ์ง์ ๋๋ฉฐ, PHP 7.4 ์ฝ๋๊ฐ ํฌํจ๋ ์์ค ์ฝ๋๋ PHP 7.1๋ก ํธ๋์คํ์ผ๋ฉ๋๋ค.
โ ๋ฒ์ ์ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์, ํ๋ฌ๊ทธ์ธ์ ๋ชจ๋ ์๋ํํฐ ์์กด์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค. ํ์ฌ Symfony์ DependencyInjection, Cache, Dotenv, Guzzle(์ธ๋ถ API ์ฐ๋์ฉ), The League์ Pipeline ๋ฑ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ํ์ฌ๋ฟ๋ง ์๋๋ผ ๋ฏธ๋๋ฅผ ์ํด์๋ ์ค์ํฉ๋๋ค: Packagist ์ ์ฅ์์ ๋ชจ๋ ์์กด์ฑ์ ์ฌ์ฉํ ์ ์๋ค๋ ํ์ ์ด ์์ผ๋ฏ๋ก ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ ํ์๊ฐ ์์ต๋๋ค.
โ ํ๋๋ ํ์ ์ ๊ตฌ๋ ๋์ด ์์ด GraphQL ์คํค๋ง๋ฅผ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
๋ผ์ด๋ ์น์: Gato GraphQL (ํฌ๊ฒ ์์ ๋ค๊ณ ๊ฐํ ๋ง์๋๋ฆด ์ ์๊ฒ ์ต๋๋ค).

๋ผ์ด๋ 6: ์คํค๋ง ํ์ฅ
GraphQL ์คํค๋ง์ ํ๋๋ฅผ ์ถ๊ฐํด ๋ด ์๋ค.
WPGraphQL์ ํํ ๋ฆฌ์ผ์ ๋ฐ๋ฆ ๋๋ค. ์ ์๋ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค. ๋ฐฐ์ด์ ์ ์ธํ๋ ํจ์๋ฅผ ์คํํ๊ธฐ ์ํด ์ก์ ํ ์ ์ ์ธํฉ๋๋ค. ํ๋์ ์ค๋ช ๊ณผ ํด๊ฒฐ์ ๋ฐฐ์ด ๋ด์์ ์ ๊ณต๋ฉ๋๋ค:
add_action( 'graphql_register_types', function() {
register_graphql_field( 'RootQuery', 'myNewField', [
'type' => 'String',
'args' => [
'myArg' => [
'type' => 'String',
'description' => __( 'Description for how the argument will impact the field resolver', 'your-textdomain' ),
],
],
'resolve' => function( $source, $args, $context, $info ) {
if ( isset( $args['myArg'] ) ) {
return 'The value of myArg is: ' . $args['myArg'];
}
return 'test';
},
]);
});์ด ์์ ๋ ๊ฐ๋ฅํ ํ ๋จ์ํฉ๋๋ค: ๋ฆฌ์กธ๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฌด๊ฒ๋ ํ์ง ์์ต๋๋ค. ๊ทธ๋ผ์๋ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฌด์์ ํ๋์ง ํ๋์ ์ดํดํ๋ ๋ฐ ์ด๋ ค์์ ๋๋๋๋ค. ๋น์ ๊ฑฐ๋ฆฌ๋ ๊ฒ์ด ์๋๋๋ค: ํธ์ง๊ธฐ์์ ๊ทธ ์ฝ๋์ ๋ชจ๋ ์์์ด ์ ์ ์ฃผ์๋ฅผ ๋นผ์๊ณ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ์๊ณ , ์ฝ๋๊ฐ ๊ทธ๋ค์ง ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด ๋ณด์ด์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ฉด์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ณ , ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ๋ฒ๊ทธ ์์ด ๋ง๋๋ ๊ฒ์ ๊ฐ๋ฐ์(์ฆ, ์ฌ๋ฌ๋ถ)์ ๋ชซ์ ๋๋ค; ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ ์ด ๋ฉด์์ ๋ณ๋ก ๋์์ด ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ ์ด ์คํ์ผ์ "ADD": Array-Driven Development๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ ๊ฐ ํฌ์ด๋ผ๊ณ ๋ ํ ์ ์์ต๋๋ค.
(WPGraphQL์ ๊ณตํํ๊ฒ ๋งํ์๋ฉด, ์ด๊ฒ์ ํ์ค ์ฝ๋ฉ ๊ดํ์ด๋ฉฐ ๊ธฐ๋ฐ ์์ง์ธ webonyx/graphql-php์์๋ ์ฑํํ ๋ฐฉ์์
๋๋ค.)
Gato GraphQL์์๋ ๋ชจ๋ ์ฝ๋๊ฐ SOLID์
๋๋ค. GraphQL ์คํค๋ง์ ํ๋๋ฅผ ๋ฑ๋กํ๋ ค๋ฉด FieldResolverInterface ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ (์ค์ ๋ก๋ ์ด๋ฏธ ๋ง์ ๋ฉ์๋๊ฐ ๊ตฌํ๋ AbstractSchemaFieldResolver๋ฅผ ํ์ฅํ๊ณ ), ์ปจํ
์ด๋์ ๋ฑ๋กํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ด ์ฝ๋๋ User ํ์
์ username, email, url ํ๋๋ฅผ ์ ๊ณตํฉ๋๋ค:
class UserFieldResolver extends AbstractSchemaFieldResolver
{
public static function getClassesToAttachTo(): array
{
return [
UserTypeResolver::class,
];
}
public static function getFieldNamesToResolve(): array
{
return [
'username',
'email',
'url',
];
}
public function getSchemaFieldDescription(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
$descriptions = [
'username' => $this->translationAPI->__("User's username handle", "users"),
'email' => $this->translationAPI->__("User's email", "users"),
'url' => $this->translationAPI->__("URL of the user's profile in the website", "users"),
];
return $descriptions[$fieldName];
}
public function getSchemaFieldType(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
$types = [
'username' => SchemaDefinition::TYPE_STRING,
'email' => SchemaDefinition::TYPE_EMAIL,
'url' => SchemaDefinition::TYPE_URL,
];
return $types[$fieldName];
}
public function resolveValue(TypeResolverInterface $typeResolver, object $user, string $fieldName, array $fieldArgs = [])
{
switch ($fieldName) {
case 'username':
return $this->usersAPI->getUserLogin($user);
case 'email':
return $this->usersAPI->getUserEmail($user);
case 'url':
return $this->usersAPI->getUserURL($user);
}
return null;
}
}์ ๋ ์ ์๋ฃจ์ ์ด WPGraphQL์ ๊ฒ๋ณด๋ค ๋ ์ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ์ ์ทจํฅ์ ๋ฌธ์ ์ ๋๋ค. Array-Driven Development๋ฅผ ๊ด์ฐฎ๊ฒ ์ฌ๊ธฐ๋ ๊ฐ๋ฐ์๋ ๋ง์ผ๋ฉฐ, ์ค์ ๋ก ์ปดํฉํธํ ์ฝ๋ ๋ฉ์ด๋ฆฌ์์ ๋ชจ๋ ๋ก์ง์ ๊ตฌํํ ์ ์์ด์ ์ ํธํ๋ ๋ถ๋ค๋ ์์ต๋๋ค.
๋ผ์ด๋ ๊ฒฐ๊ณผ: ๋ฌด์น๋ถ.

์ธํฐ๋ฏธ์
์ ๋ง ๋ฉ์ง ๋ฐค์ด๊ตฐ์, ์ฌ๋ฌ๋ถ.

๊ฒฝ๊ธฐ์ ์ค๊ฐ ์ง์ ์ ๋๋ฌํ์ผ๋, ํ์ฅ์ค ํด์์ ์ทจํ๊ณ ์ง๊ธ๊น์ง ๊ฒฝํํ ๊ฒ์ ๋ํด ์ฝ๋ฉํธํ ์ข์ ๊ธฐํ์ ๋๋ค.
(๊ทธ ์ฌ์ด์, ์คํฐ์์ ๊ด๊ณ ๋ฅผ ํ์ํด์ผ ํ ํ ๋ฐ์. ์์ฝ๊ฒ๋ ์์ง ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ํ์ฌ๊ฐ Gato GraphQL ๊ฐ๋ฐ์ ํ์ํ๊ณ ์ด๋ฐ ์ด๋ฒคํธ ๊ฐ์ ํ๋ผ์ ๋ฏธ๋์ด์์ ๋ ธ์ถ์ ์ํ์ ๋ค๋ฉด, ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ฃผ์ธ์.)

์ ๋ง ๋๋จํ ๊ฒฝ๊ธฐ์ ๋๋ค! WPGraphQL์ ์ฒ์๋ถํฐ ๋ถ๊ฝ ๊ฐ์ ๊ธฐ์ธ์์ต๋๋ค! ์์๋ถํฐ ์ต์์ ์ปจ๋์ ์ผ๋ก, Gato GraphQL์๊ฒ ๋งน๋ ฌํ ํ์น๋ฅผ ํผ๋ถ์๊ณ , Gato GraphQL์ ๊ฒจ์ฐ ๋ ๋ฐ๋ก ๋ฒํฐ๋ ์ํ์์ต๋๋ค. ์ฐ์ ํ๊ฒฉ์ ํ๊ฒฉ. Gato GraphQL์ ์ฒ์ง๊ฐ ๋๊ณ ์ถ์ง ์์์ต๋๋ค.
์์งํ ์ธ์ ํ๊ฑด๋, ์ฒ์ 2๋ผ์ด๋ ์ดํ์๋ ๊ฒฝ๊ธฐ๊ฐ ๊ณง ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ธ์ ๋ค์ด์ด ์ฌ์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ต๋๋ค. ํญ๋ณต์ ์๊ฑด์ด ๋์ ธ์ง๋ ๊ฒ์ ์์ํ์ต๋๋ค. ํ์ง๋ง Gato GraphQL์ ๋ฒํ ผ์ต๋๋ค. ๊ทธ๊ฒ๋งํผ์ ์ธ์ ํด์ผ ํฉ๋๋ค. ์ ๋ง ํ๋ค๋ฆฌ์ง ์๋ ์์ง, ์ฐธ์ผ๋ก ๋๋์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ ๋ณํ๊ฐ ์ผ์ด๋ฌ์ต๋๋ค. 3๋ผ์ด๋ ์ด๋ ์๊ฐ๋ถํฐ, Gato GraphQL์ ์ด๋์ ๊ฐ ์๋์ง๋ฅผ ๋์ด๋ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋, ๋ฐฉ์ด๋ง ํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๊ฒฉ ํ์น๋ฅผ ๋ ๋ฆฌ๊ธฐ ์์ํ๊ณ , ๊ทธ์ค ๋ง์ ๊ฒ๋ค์ด WPGraphQL์ ์ผ๊ตด์ ์ ์คํ์ต๋๋ค. WPGraphQL์ด ํ์ฒญ๊ฑฐ๋ฆฌ๋ ๊ฒ์ ๋ดค์ต๋๋ค! ํ ์ธ๊ณ ์ฑํผ์ธ์๊ฒ์ ์ด๋ฐ ๋ชจ์ต์ ๋ณธ ์ ์ด ์์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๋ชฉ๊ฒฉํ ๊ฒ์ ์ฐธ์ผ๋ก ๋๋ผ์ด ๋ณํ์์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ ์๋์ ์์ ๊ฐ์ ํ๋ค๊ณ ๋์, 4๋ผ์ด๋๋ถํฐ Gato GraphQL์ ์ผ๋ จ์ ์น๋ช ์ ์ธ ํ๊ฒฉ์ ๊ฐํ๊ธฐ๋ก ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ถฉ๊ฒฉ์ ์ด์์ต๋๋ค! ๋คํํ ๋ง์๊ณ ์๋ ๊ฒ์ ์ฐ๋ฆฌ์ ์ธ๊ณ ์ฑํผ์ธ WPGraphQL์ด์๊ณ , ๊ตฐ์ค์ ํํธ์ ๊ณต๊ฐ์ ํ์ ์ด ํ๊ฒฉ์ ๊ฒฌ๋๋ผ ์ ์์์ต๋๋ค. ์ ๋ง ๋๋จํ ์์ ์ ๋๋ค! ๋ค๋ฅธ ๋๊ตฌ๋ผ๋ ๊ทธ ์๋ฆฌ์์ ์ฐ๋ฌ์ก๊ฒ ์ง๋ง, ๊ทธ๋ ๋ฌ๋์ต๋๋ค. ์ฑํผ์ธ๋ต๊ฒ ํ๊ฒฉ์ ๊ฒฌ๋๋์ต๋๋ค.
ํ์ง๋ง ์ฑํผ์ธ์ผ๋ก์ ์ผ๋ง๋ ์ค๋ ๋ฒํธ ์ ์์๊น์? ์์ง ์๋ฌด๋ ๋ค์ด๋์ง ์์๊ณ , ์์ง ์๋ฌด๋ ์๊ฑด์ ๋์ง์ง ์์์ต๋๋ค. ๊ฒฝ๊ธฐ๋ ์ธ์ ๋ ์ง ๊ฒฐ์ ์ ์ธ ์ ํ์ ๋ง์ ์ ์์ต๋๋ค. ๋ ํ์ดํฐ๋ ์์ ์ด ์ํ๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ, ์๋์๊ฒ ๋ฌ๋ ค๋ค์ด ์น๋ฆฌํ๊ธฐ ์ํด ๋ชจ๋ ํ๊ณผ ์์ง๋ฅผ ๋คํด ๋ค์ ๋์ฌ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค.
์ ๋ง ๋๋จํ ๊ฒฝ๊ธฐ์ ๋๋ค!
๊ทธ๋ฆฌ๊ณ ์ด์ , ์ฌ๋ฌ๋ถ, ๋ ์ ์ฌ๊ฐ ๋ง์ผ๋ก ๋์์ต๋๋ค.

๋๋จธ์ง ๊ฒฝ๊ธฐ๋ฅผ ํฅํด!
ํต์ฌ ์ฌ์
GraphQL ์๋ฒ๋ "ํ์ํ ๋ฐ์ดํฐ๋ง, ๊ทธ ์ด์๋ ์ดํ๋ ์๋๊ฒ ๊ฒ์ํ๋ค"๋ ๋ช ์ ๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด ๋ง์ ์ฌํญ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
- ์ผ๋ง๋ ์์ ํ๊ฐ์? ๊ณต๊ฐ ์๋ํฌ์ธํธ์์ ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ ธ์ถํ์ง ์์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
- ์ผ๋ง๋ ๊ณ ์ฑ๋ฅ์ธ๊ฐ์? ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณตํด์ ๋ณด๋ผ ๋ ์๋ฒ ๋ถํ๋ฅผ ์ด๋ป๊ฒ ์ค์ด๋ฉด์ ๊ฐ๋ฅํ ํ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์๊น์?
- ์ผ๋ง๋ ๊ฐ๋จํ๊ฐ์? CMS๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ํด WordPress์ ์ผ๋ง๋ ์ ํตํฉ๋์ด ์๋์?
๊ทธ๋ฆฌ๊ณ ๋ ๋ง์ ์ง๋ฌธ๋ค์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ ๊ฐ ์ ํํ ์์ ์ํ๋ก, ๋ค์ 3๋ผ์ด๋์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๋ผ์ด๋ 7: Persisted queries
Persisted queries๋ GraphQL๊ณผ REST์ ์ฅ์ ์ ๊ฒฐํฉํฉ๋๋ค: GraphQL์ ์ฌ์ฉํ์ฌ ์์ฑ๋๋ฏ๋ก ๋ฐ์ดํฐ์ ์ธ๋/์ค๋ฒ ํ์นญ์ด ์์ง๋ง, ๊ณ ์ ํ URL์ด ์๋ ์๋ํฌ์ธํธ๋ก ์๋ฒ์ ๊ฒ์๋ฉ๋๋ค.
Persisted queries๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
โ ์์ ํฉ๋๋ค: ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ํตํด ๋ชจ๋ ๋ฐ์ดํฐ์ ์ก์ธ์คํ ์ ์๊ฒ ํ๋ ๋์ , ๊ณต๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ ์ ์์ต๋๋ค.
โ ๋น ๋ฆ ๋๋ค: ๊ณ ์ ํ URL๋ก ์ ๊ทผ๋๋ฏ๋ก, ํ์ค HTTP ์บ์ฑ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฐฑ์๋ ์ฌ์ด์ ๋ชจ๋ ๋ ์ด์ด(์๋ฒ, CDN, ๋ธ๋ผ์ฐ์ )์์ ์บ์ํ ์ ์์ต๋๋ค.
WPGraphQL์ ๋ค์ ๋ ๊ฐ์ง ํ์ฅ ๊ธฐ๋ฅ์ ํตํด persisted queries๋ฅผ ์ง์ํฉ๋๋ค:
๋ํ Jason Bahl(WPGraphQL ์ ์์)์ ์ต๊ทผ ๊ฐ๊น์ด ๋ฏธ๋์ WPGraphQL์ persisted queries ์ง์์ ์ถ๊ฐํ ๊ฒ์ด๋ผ๊ณ ๋ฐํํ์ต๋๋ค.
์ด๋ฏธ 2๊ฐ์ ํ์ฅ ๊ธฐ๋ฅ์ด ์๋๋ฐ ๋ฌด์์ ์๊ฐํ๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๊ทธ๊ฒ๋ค๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅผ๊น์? ์ด์ฉ๋ฉด ์๋ํํฐ์ ์์กดํ์ง ์๊ณ ํ๋ฌ๊ทธ์ธ ์ ์ฒด์ ๋ณด์ ์กฐ์น๋ฅผ ๊ฐํํ๊ธฐ ์ํด ํ๋ฌ๊ทธ์ธ ์ฝ์ด์ ์ผ๋ถ๋ก ๋ง๋ค๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
์๋๋ฉด Gato GraphQL์ ๊ตฌํ์ ๋ณด๊ณ , ์์ ์ฝ๋ ๋์ ๋น์ฃผ์ผ ์๋ํฐ๋ก ์กฐ์ํ๋ ์ ์ฌํ ๊ฒฝํ์ ์ ๊ณตํ๊ณ ์ถ์ ์๋ ์์๊น์?
์ด๊ฒ์ด Gato GraphQL๋ก ์ด์ด์ง๋๋ค. Persisted queries๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ๊ทธ๊ฒ์ ์ ๊ณต์ ํต์ฌ ๋ถ๋ถ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ์ต๋๋ค:
โ ํ๋ฌ๊ทธ์ธ์ ๋จ์ผ ์๋ํฌ์ธํธ ๋นํ์ฑํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์ฌ์ฉ์๋ persisted queries๋ฅผ ํตํด์๋ง ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ฐํ๋๋ก ๊ถ์ฅ๋ฉ๋๋ค.
(๋์กฐ์ ์ผ๋ก, WPGraphQL์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํธ๋ก์คํ์ ๋ง ๋นํ์ฑํํ๋ฉฐ, ์ค์ ์๋ํฌ์ธํธ๋ ๋นํ์ฑํํ์ง ์์ต๋๋ค. ์ฆ, ๊ณต๊ฒฉ์๋ ์ฌ์ ํ ๊ฐ์ธ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ ์ ์์ต๋๋ค; ์ฌ์ ์ ์ด๋ค ๊ฐ์ธ ๋ฐ์ดํฐ๊ฐ ์๋์ง ์ ์ ์๊ฒ ํด์ ์์ ์ ์ด๋ ต๊ฒ ๋ง๋ค ๋ฟ์ ๋๋ค.)
โ WordPress ์๋ํฐ์ ๊น๊ฒ ํตํฉ๋์ด ์์ด, persisted query๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ ๋ ธ๋ ฅ์ผ๋ก ๊ฐ๋ฅํ๋ฉฐ, ํ๋ก๊ทธ๋๋จธ๋ฟ๋ง ์๋๋ผ ๋๊ตฌ๋ ํ ์ ์์ต๋๋ค.
โ Persisted queries๋ ์ ์ ์ด์ง ์์ต๋๋ค: GraphQL ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฐ์ ์๋ํฌ์ธํธ๋ฅผ ์คํํ ๋ URL ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ ๊ณต๋ ์ ์์ต๋๋ค.
์ ํ๋ฌ๊ทธ์ธ์์ persisted query๋ฅผ ๋ง๋ค๊ณ ์คํํ๋ ๊ฒฝํ์ ํ์ธํด ๋ณด์ธ์:
๋ผ์ด๋ ์น์: Gato GraphQL.
๋ผ์ด๋ 8: ์บ์ฑ
GraphQL์๋ ํฐ ๋ฌธ์ ์ ์ด ์์ต๋๋ค: ์ฝ๊ฒ ์บ์ํ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋จ์ผ ์๋ํฌ์ธํธ์ POST ์์
์ ๋ณด๋ด๋ ๊ฒ์ ์์กดํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋จ์ผ ์๋ํฌ์ธํธ๊ฐ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ณ , ์ฟผ๋ฆฌ๊ฐ URL ํ๋ผ๋ฏธํฐ ๋์ ์์ฒญ์ ๋ณธ๋ฌธ์ ํฌํจ๋์ด ์ ์ก๋๋ฏ๋ก ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ์บ์ํ ์ ์์ต๋๋ค.
๋ง์ GraphQL ์๋ฒ๊ฐ ์ ๊ณตํ๋ ํ์ค ์๋ฃจ์ ์ ์บ์ฑ์ ํด๋ผ์ด์ธํธ๋ก ์ฎ๊ธฐ๊ณ , ์๋ํฌ์ธํธ์ URL ๋์ ๊ฐ์ฒด์ ID๋ฅผ ์บ์ํ ์ํฐํฐ์ ์๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Apollo ํด๋ผ์ด์ธํธ์ ๋๋ค.
WPGraphQL์ ์บ์ฑ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ต์ ์ ๋ํ WPGraphQL ์ ์ฅ์์ ํ ๋ก ์ด ์์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋, ๊ทธ ๋๋ถ๋ถ์ ์ธ๋ถ ๋๊ตฌ(Apollo ํด๋ผ์ด์ธํธ ๋๋ WordPress Object Cache ๋ฑ)์ด๋ฉฐ, ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ถ๊ฐ์ ์ธ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ๊ณ ๋ณต์ก์ฑ์ ๋์ด๋ฉฐ ์๋๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
(์ด๋ฌํ ์ด์ ๋ค์ด WPGraphQL์ persisted queries๋ฅผ ๋ค์ดํฐ๋ธ๋ก ๊ตฌํํ๊ธฐ๋ก ํ ๊ฒฐ์ ์ ๋ฐฐ๊ฒฝ ์ค ์ผ๋ถ์ผ ๊ฒ์ ๋๋ค.)
์๋ฅผ ๋ค์ด, Apollo ํด๋ผ์ด์ธํธ๋ ํด๋ผ์ด์ธํธ์์ ์คํ๋ฉ๋๋ค. ์ ์ฌ์ ํด๋ํฐ์ผ๋ก ์น์ฌ์ดํธ์ ์ ๊ทผํ ๊ฒฝ์ฐ, ๊ทธ ์ถ๊ฐ์ ์ธ JavaScript ์ฝ๋๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ๊ฒ์ ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, WordPress๋ฅผ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์๋ PHP์๋ ๋ฅ์ํ ์ ์์ง๋ง JavaScript์๋ ๊ทธ๋ค์ง ๋ฅ์ํ์ง ์์ ์ ์์ต๋๋ค. ์ด์ API๋ฅผ ์บ์ฑํ๋ ค๋ฉด JavaScript ๋ ์ด์ด๋ ์ ๊ฒฝ ์จ์ผ ํฉ๋๋ค.
Gato GraphQL์ ์ด ์ฃผ์ ์ ๋ํด ๋ ํ๋ช ํ๊ฒ ์ ๊ทผํ์ต๋๋ค. Persisted queries๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, ์ฟผ๋ฆฌ๊ฐ ์์ฒด ์๋ํฌ์ธํธ์์ ์คํ๋จ์ ์๋ฏธํ๋ฉฐ, HTTP ์บ์ฑ์ ํตํด ์ด ์๋ํฌ์ธํธ URL์ ์บ์ํ ์ ์์ต๋๋ค.
HTTP ์บ์ฑ ํค๋์ max-age ๊ฐ์ ์ฟผ๋ฆฌ์ ๋ชจ๋ ํ๋์ ๋ํ ๋ชจ๋ max-age ๊ฐ์ผ๋ก๋ถํฐ ์๋์ผ๋ก ๊ณ์ฐ๋๋ฉฐ, ์ด ์ ๋ณด๋ ํ๋๋ณ๋ก WordPress ์๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก API๋ ์ฌ๋ฌ ๋ ์ด์ด(ํด๋ผ์ด์ธํธ, CDN, ์๋ฒ)์์ ์บ์ํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ํ๋ฌ๊ทธ์ธ ๋ด์์ ๋ค์ดํฐ๋ธ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
API ์๋ํฌ์ธํธ๊ฐ ์บ์๋๋ ๋ชจ์ต์ ๋ณด์ฌ์ฃผ๋ ๋ค์ ๋์์์ ํ์ธํด ๋ณด์ธ์:
๋ผ์ด๋ ์น์: Gato GraphQL.
๋ผ์ด๋ 9: Gutenberg์์ ํตํฉ
ํ๋ Gutenberg๋ WordPress์ ๋ฏธ๋๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ํ์ต๋๋ค. ์ด์ ๋ ๊ทธ๋ ์ง ์์ต๋๋ค: Gutenberg๋ ์ด์ WordPress์ ํ์ฌ(WordPress ์๋ํฐ๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค)์ด๋ฉฐ, Full Site Editing์ด ์๋ก์ด ๋ฏธ๋๊ฐ ๋์์ต๋๋ค.
๋งํ ํ์๋ ์์ด, API๋ WordPress ์๋ํฐ์ ์ข์ ํตํฉ์ด ํ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ธ๋ก์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ๊ฒ์ํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, WordPress ์๋ํฐ ์์ฒด์ ๊ธฐ๋ฅ์ ๊ฐํํ๊ธฐ ์ํ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, GraphQL ๊ตฌ๋ ์ด ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํธ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ํ์ ํธ์ง๊ณผ ์๋ฆผ ๊ธฐ๋ฅ์ ๊ฐํํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
WPGraphQL์ WPGraphQL Gutenberg ํ์ฅ ๊ธฐ๋ฅ์ ํตํด ๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค. ์ด ํ์ฅ ๊ธฐ๋ฅ์ ๊ฐ ๋ธ๋ก์ ๋งคํํ๋ ์๋ก์ด ํ์
์ ์์ฑํ๋ฏ๋ก, CoreParagraphBlock, CoreQuoteBlock ๋ฑ์ด ์๊น๋๋ค.
Gato GraphQL์ ๊ณง ๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค(์์
์ค). ๊ทธ๋ฌ๋ ๋ธ๋ก๋ง๋ค ์๋ก์ด ํ์
์ ์์ฑํ๋ ๋์ , ๋ชจ๋ ๋ธ๋ก์ ๋ํ๋ด๋ ๋จ์ผ Block ํ์
์ ๊ฐ๊ฒ ๋๋ฉฐ, ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํน์ ๋ธ๋ก์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋จ๋ฝ ๋ธ๋ก ๋ด์ ์ฝํ
์ธ ๋ฅผ ๋ฒ์ญํ๋ ๋ฐฉ๋ฒ์ ํ์ธํด ๋ณด์ธ์(@strTranslate ๋๋ ํฐ๋ธ ์ฌ์ฉ, Google Translate API์ ์ฐ๊ฒฐ):
query TranslateStringsInBlocks {
post(by: { id: 1657 }) {
title
paragraphBlocks: blockDataItems(
filterBy: { include: "core/paragraph" }
)
translatedParagraphBlocks: blockDataItems(
filterBy: { include: "core/paragraph" }
)
@underJSONObjectProperty(by: { path: "attributes.content" })
@underEachArrayItem
@strTranslate(from: "en", to: "fr")
}
}๋ผ์ด๋ ๊ฒฐ๊ณผ: ๋ฌด์น๋ถ.
๋ฒ์ ํ์ฅ
"๋์๊ฒ๋ ๊ฟ์ด ์์ต๋๋ค."
Gutenberg ๋ธ๋ก์ WordPress์์ ์ฝํ ์ธ ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋จ์ผ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์ด, CMS ์ฝ๋ ๊ฐ๋ฐ๊ณผ ์ฌ์ฉ์์๊ฒ ํ์ํ ํ์ต์ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค.
์ฝํ ์ธ ์์ฑ์ ์ํด ๋์ ๋์์ง๋ง, ๋ธ๋ก์ ์์ ฏ, ๋ฉ๋ด, ๊ทธ๋ฆฌ๊ณ ๊ณง Full Site Editing์ ํตํ ํ ๋ง ๋ฑ CMS์ ๋ค๋ฅธ ๋ชจ๋ ์์ญ์ ๊พธ์คํ ์ฐจ์งํด ๊ฐ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋์๋ ๋ค๊ตญ์ด ๊ธฐ๋ฅ๊ณผ ํ์ ํธ์ง(๋ธ๋ก์ ์๊ฐํ ๋ ๋ ์ฌ๋ฆฌ์ง ๋ชปํ ์๋ ์๋ ๊ธฐ๋ฅ)๋ ์ง์ํ๊ฒ ๋ ๊ฒ์ด๋ฉฐ, ๊ทธ ์ธ ๋ฌด์์ด ๋ ์๊ธธ์ง ๋ชจ๋ฆ ๋๋ค.
GraphQL์ ๋ํด์๋ ๊ฐ์ ๊ด์ ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค: ๋ฐ์ดํฐ์ ์ํธ์์ฉํ๊ธฐ ์ํ ๋จ์ผ ์ธํฐํ์ด์ค๋ก. ์ฆ, ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๊ฒ์ํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ํธ์ง์ ํฌํจํ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ๋ชจ๋ ์ํธ์์ฉ์ด ๋์์ ๋๋ค.
WordPress๋ ์ง์ ์ผ๋ก ์น์ OS๊ฐ ๋ ์ ์๋ ๋ ๋ณด์ ์ธ ๊ธฐํ๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค: Gutenberg๋ก ๊ตฌ๋๋๋ ์์คํ ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ด๋ค ์ข ๋ฅ์ ์ฝํ ์ธ (ํ ์คํธ, ์ด๋ฏธ์ง, ๋น๋์ค, ์ค๋์ค ๋ฑ)๋ ์ ๋ ฅํ๊ณ , ์์ฒด ๋๊ตฌ๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค๋ฅผ ํตํด ์ฒ๋ฆฌํ๊ณ , WordPress ์ฌ์ดํธ๋ ๋ค๋ฅธ ๊ณณ ๋ฑ ์ต์ข ๋ชฉ์ ์ง์ ๊ฒ์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด ๊ฐ๋ ฅํ ๊ฟ ๋ค์๋, ์ฐ๋ฆฌ๊ฐ ๋ถ์ฌํ๋ ์ด๋ค ์๊ฑด๋ ์ถฉ์กฑํ ์ ์๋ ์ง์ ์ผ๋ก ๊ฐ๋ ฅํ API๊ฐ ์์ด์ผ ํฉ๋๋ค. GraphQL์ ๊ธฐ๋ฐํ๋ฉด์๋ ๊ทธ ํ๊ณ๋ฅผ ๋์ด์๋๋ก ์ค๊ณ๋ API์ ๋๋ค.
๋ผ์ด๋ 10: ์ปค์คํ ๋๋ ํฐ๋ธ ์ง์

WPGraphQL์ ๋จ ํ๋์ ๋๋ ํฐ๋ธ๋ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ง์ํ์ง ์๋๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค(์์ง์ธ webonyx/graphql-php๋ ์ง์ํฉ๋๋ค), ์ปค์คํ
๋๋ ํฐ๋ธ์ ๊ตฌํ์ ์ ๊ณตํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
"๊ทธ๋์์?" ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. "๋๋ ํฐ๋ธ๊ฐ ๋ฌด์์ ํ์ํ๊ฐ์? ๋๊ตฐ๊ฐ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์์ ํด์ผ ํ๋ค๋ฉด ์์ ์ ํด๋ผ์ด์ธํธ์์ ํ๋ฉด ๋ฉ๋๋ค!"

์ด๊ฒ์ ์๊ฒฌ์ ๋ฌธ์ ์ด๋ฉฐ, ์ณ๊ณ ๊ทธ๋ฆ์ด ์์ต๋๋ค. ํ์ง๋ง ํ ๊ฐ์ง ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค: ๋๋ ํฐ๋ธ๋ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ผ๋ก, GraphQL์ REST์ ๊ตฌ๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฌ์ฉํ์ง ์๊ณ ์๋ค๋ฉด, ์๋ง๋ API๋ฅผ ์ต๋ํ ํ์ฉํ๊ณ ์์ง ์์ ๊ฒ์ ๋๋ค.
๋๋ ํฐ๋ธ๋ ์ฌ์์ ์ํด ๊ท์ ๋์ง ์์ผ๋ฏ๋ก, GraphQL ์๋ฒ๋ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ผ๋ฉฐ, ํ์ํ ๋งํผ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋์ @stream๊ณผ @defer์ฒ๋ผ GraphQL์ ๋ง์ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋จผ์ ๋๋ ํฐ๋ธ๋ก ๋์
๋ฉ๋๋ค.
Gato GraphQL์ ๋๋ ํฐ๋ธ๋ฅผ ๊ฒฝ์ธ์ฌ์ ๊ฐ์ง๊ณ ๋ค๋ฃน๋๋ค. ํ ๋ฒ๋ง ์คํ๋์ด ์ ์ฉ๋ ๋ชจ๋ ํ๋์ ๋ํด ๋ชจ๋ ์ํฐํฐ์ ๋ฐ์ดํฐ๋ก ์คํ๋ฉ๋๋ค(์ด๊ฒ์ด @strTranslate ๋๋ ํฐ๋ธ๊ฐ Google Translate API์์ ๊ฒฐ๊ณผ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ ์ด์ ์
๋๋ค). ๋ํ GraphQL ์์ง ์์ฒด๊ฐ ๋๋ ํฐ๋ธ ํ์ดํ๋ผ์ธ์ ๊ธฐ๋ฐํฉ๋๋ค.
์, ํ์ง๋ง ์ด ๋ชจ๋ ํ์ ์ฌ์ฉ์์๊ฒ ์ด์ฉ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด ๋๋ ต์ง ์์ผ์ ๊ฐ์? ๊ทธ๊ฒ์ ํ๋นํ ์ฐ๋ ค์ ๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ผ ์๋ํฌ์ธํธ์ ๋ํ ์ ๊ทผ์ ์ ๊ฑฐํ๊ณ , persisted queries๋ฅผ ํตํด์๋ง ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋๋ก ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค. ๊ทธ ๊ฒฝ์ฐ, ๋๋ ํฐ๋ธ์ ๋ํ ์ ๊ทผ ๊ถํ์ ๊ฐ์ง ์ฌ๋์ (์ฌ์ดํธ ๊ด๋ฆฌ์์ธ) ์ฌ๋ฌ๋ถ๋ฟ์ ๋๋ค.
๋ฐ๋ผ์ ์ฌ๋ฌ๋ถ์ด ์ด์ ์ ์ป๊ฑฐ๋, ์๋ฌด๊ฒ๋ ์ผ์ด๋์ง ์๊ฑฐ๋ ๋ ์ค ํ๋์ ๋๋ค.
๋๋ ํฐ๋ธ๋ฅผ ์ข์ํ๋ค๋ฉด, Gato GraphQL์ ์ฌ๋ํ๊ฒ ๋ ๊ฒ์ ๋๋ค! โค๏ธ
ํ์ง๋ง ํํธ์ผ๋ก, ์ข์ํ์ง ์๋๋ค๋ฉด ์๋ฌด๊ฒ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
๋ผ์ด๋ ์น์: Gato GraphQL.
("๋์๋๋ ๋๋ ํฐ๋ธ๋ ํ์ ์๋ค"๊ณ ์๊ฐํ์ ๋ค๋ฉด, ์ ์๊ฒ ํ๋ด์ง ๋ง์ธ์... ์ ๋ ๊ทธ์ ์ ์ผ์ ํ๊ณ ์์ ๋ฟ์ ๋๋ค.)
๋ผ์ด๋ 11: REST ์ง์
"๋ญ๋ผ๊ณ ์? REST์? ๋ฌด์จ REST์? ์ฌ๊ธฐ์ GraphQL ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ์๋ ๊ฑฐ ์๋๊ฐ์? ์ REST ์ด์ผ๊ธฐ๋ฅผ ํ๋ ๊ฑด๊ฐ์? ์ ์ ์ถ์ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์ถ์ผ์ ๊ฑด๊ฐ์?"

๋ง์์, ์ฒ์์๋ ์ด ์ฃผ์ ๊ฐ ์ด์ํ๊ฒ ๋ณด์ ๋๋ค. ํ์ง๋ง ๋งค์ฐ ๋จ์ํ ์ด์ ๋ก ์ด ๋น๊ต์ ์ถ๊ฐํ์ต๋๋ค: Matt Mullenweg๊ฐ WordPress ์ฝ์ด์ ์ ์ฌ์ ์ผ๋ก ํฌํจํ๊ธฐ ์ํด GraphQL์ ๊ฒํ ํ๊ณ ์๋ค๊ณ ๋งํ๊ณ , ๊ธฐ์ฌ์๋ค์ด ๊ฑฑ์ ํ ๊ฒ์ ๋ ๊ฐ์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ๋ช ๋ฐฑํ ์ง๋ฌธ์ผ๋ก ์ด์ด์ง๋๋ค: GraphQL ์๋ฒ๊ฐ REST๋ ์ฒ๋ฆฌํ ์ ์์๊น์?
๋๋ต์ WPGraphQL์ ๋ํด์๋ "๋ถ๋ถ์ ์ผ๋ก ์", Gato GraphQL์ ๋ํด์๋ "์์ ํ ์"์ ๋๋ค.
WPGraphQL์ ๊ดํด์. REST ์๋ํฌ์ธํธ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ, ํด๊ฒฐ๋ ๋, GraphQL ์์ง์ผ๋ก์ ๋ด๋ถ ํธ์ถ๋ก, ๋๋ ๋์ผํ ์น์๋ฒ์ ๋ํด ์คํ๋๋ ์ธ๋ถ POST ์์
์ผ๋ก, ํ์ํ ํ๋๋ฅผ ํฌํจํ๋ GraphQL ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
ํ์ง๋ง ๊ทธ๊ฒ๋ง์ผ๋ก๋ WP REST API๋ฅผ ๋ง์กฑ์ํค๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด JSON ์คํค๋ง๋ ์์ด์ ๊ทธ๊ฒ ์์ด๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Gato GraphQL์ ๊ดํด์. ์ด์ด ์ข์๋ค๊ณ ์ธ์ ํด์ผ ํฉ๋๋ค. ๊ธฐ๋ฐ ์์ง(PoP์ด๋ผ๋ ์๋ฒ ์ฌ์ด๋ ์ปดํฌ๋ํธ ๋ชจ๋ธ)์ ์์ ์ 2013๋ ๊ฒฝ์ ์์๋์์ต๋๋ค. ์ฆ, GraphQL์ด๋ผ๋ ๊ฒ์ ์๊ธฐ ๋ช ๋ ์ ์ด์๊ณ , ์ด ํ๋ก์ ํธ๋ ์์ฒด์ ์ธ ์์ด๋์ด๋ก ๋ฐ์ ํ์ต๋๋ค(์ด ์ ์ ๋นํฐ์ง ๊ธ์ ๋ฌธ์ํํ์ต๋๋ค).
๊ทธ๋ฆฌ๊ณ ์ฝ 1.5๋ ์ ์ CMS ๋น์ข ์์ ์ธ GraphQL ์๋ฒ(Gato GraphQL์ด ์ ์๋) ์ฝ๋ฉ์ ์์ํ์ ๋, PoP๋ฅผ ์ํด ๊ฐ๋ฐ๋ ์์ด๋์ด์ GraphQL์ด ํ๋ฆฝํ ๊ธฐ๋ฐ์ ํฉ์ณ, GraphQL ์ฌ์์ ์์ ํ ์ง์ํ๋ฉด์๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์ธํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ ์์คํ ์ ๋ง๋ค์์ต๋๋ค.
์ด ์ ์์ PoP๊ฐ ์ฌ์ฉํ๋ ์คํค๋ง๋ API ๋น์ข
์์ ์ด๋ฉฐ GraphQL์ ๊ฒ์ ์ํผ์
์
๋๋ค. PoP ์คํค๋ง๋ /api/graphql/?query=fullSchema์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์, GraphQL ์๋ฒ ๋ ์ด์ด๋ GraphQL ์ฌ์์ ๋ฐ๋ผ PoP ์คํค๋ง๋ฅผ ํฌ๋งทํ์ฌ GraphQL ์คํค๋ง๋ฅผ ์์ฑํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก WP REST API๊ฐ ์๊ตฌํ๋ JSON ์คํค๋ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ด JSON ์คํค๋ง ์์ฑ์ ์์ง ์๋ฃ๋์ง ์์์ง๋ง, ๊ฐ๋ฅํฉ๋๋ค.
ํ์ฌ ์ด๋ฏธ ์๋ฃ๋ ๊ฒ์ ์ฟผ๋ฆฌ์ ์๋ต์ ์ฌ๋ฌ ํ์์ผ๋ก ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด GraphQL ์ฟผ๋ฆฌ:
{
posts {
id
title
date
author {
name
}
}
}์ด REST ์๋ํฌ์ธํธ๋ฅผ ํตํด์๋ ํด๊ฒฐ๋ฉ๋๋ค: /posts/api/rest/?query=id|title|date|author.name.
๊ฑฐ๊ธฐ์ ๋ฉ์ถ ํ์๊ฐ ์์ต๋๋ค. XML ๋ฑ ๋ค๋ฅธ ํ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์์ฑํด์ผ ํ๋์? ๋ฌธ์ ์์ต๋๋ค: /api/?query=posts.id|title|date|author.name&datastructure=xml.
(์ด๊ฒ์ ์คํค๋ง์ ๊ธฐ๋ฐํ WordPress์ ์ ๊ฐ์ ธ์ค๊ธฐ/๋ด๋ณด๋ด๊ธฐ ๋๊ตฌ ์ ์ ๊ตฌํ์ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ์ ๊ฐ ์์ ๋งํ ๊ฒ์ ์กฐ๊ธ ๋ ๋ช ํํ๊ฒ ํฉ๋๋ค: ๋จ์ผ ์ธํฐํ์ด์ค๊ฐ CMS ๋ด์ ๋ชจ๋ ๋ฐ์ดํฐ ์ํธ์์ฉ๋ฟ๋ง ์๋๋ผ, CMS์ ์ธ๋ถ API์์ ์ํธ์์ฉ๋ ๊ตฌ๋ํ ์ ์์ต๋๋ค.)
๋ผ์ด๋ ์น์: Gato GraphQL.
๋ผ์ด๋ 12: ์๋ก์ด ๊ธฐ๋ฅ ์ง์
GraphQL ์ฌ์์ ์ต์ข ์ ์ธ๊ฐ์? ๋๋ต์ ์๋์ค์ ๋๋ค: ์ฌ์์ ๊ณ์ ์งํํ๊ณ ์์ต๋๋ค. ์ง๊ธ ์ด ์๊ฐ, 100๊ฐ์ ์คํ ์ด์๊ฐ ์์ผ๋ฉฐ, ๊ทธ ์ค ๋ง์ ๊ฒ๋ค์ด ๋ฏธ๋ ์ด๋ ์์ ์ ๊ณต์ํ๋ ์ ์์ ๋ด๊ณ ์์ต๋๋ค.
์, ๊ทธ 100๊ฐ์ ์ด์ ์ค์ ์ค๋ ์ฐ๋ฆฌ๊ฐ ํํ์ ๋ฐ์ ์ ์๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋ถ๋ช ํ ์๊ฒ ์ฃ ? ๊ทธ๋ ๋ค๋ฉด ์ ๊ธฐ๋ค๋ฆฌ๋์?
๊ทธ๊ฒ์ด ๋ฐ๋ก ์ ์ ์ฌ๊ณ ๋ฐฉ์์ ๋๋ค.

"ํ์ง๋ง GraphQL ์ฌ์์ ์๋ ๊ฒ์ GraphQL ์๋ฒ์ ์ถ๊ฐํด์๋ ์ ๋ฉ๋๋ค, ์ฌ์ฉ์๊ฐ ํผ๋์ค๋ฌ์ํ ๊ฒ๋๋ค!"
์ข์ ์ง์ ์ ๋๋ค. ํ์ง๋ง ์๋ก์ด ๊ธฐ๋ฅ์ ์ตํธ์ธ์ผ๋ก๋ง ์ด์ฉ ๊ฐ๋ฅํ๊ฒ ํ๋ฉด, ์ฌ์ฉ์๋ ๋ฐ๋์ ๊ทธ๊ฒ์ ์ธ์ํ๊ฒ ๋์ด ๋ฌธ์ ๋ ์คํด๊ฐ ์๊ธฐ์ง ์์ ๊ฒ์ ๋๋ค.
๋ค์ ๋งํ์ง๋ง, ๊ทธ๊ฒ์ด ์ ์ ์ฌ๊ณ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์๊ฒฌ์ ๋ฌธ์ ์ด๋ฏ๋ก, ๋ค๋ฅธ ๋ชจ๋ GraphQL ์๋ฒ๊ฐ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๊ทธ๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค.
WPGraphQL์ ๊ทธ๋ ๊ฒ ์ด์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ด๋ ์ฌ์์์ ์น์ธ๋ ๊ฒ์ ๋์ด์๋ ๋จ์ผ ๊ธฐ๋ฅ์ ๋ณธ ์ ์ด ์์ต๋๋ค.
Gato GraphQL์ ๋ํด์๋ ์ฌ์์ ์ด์ ๋ชฉ๋ก์ ์ ๊ธฐ์ ์ผ๋ก ํ์ด๋ณด๊ณ , ์ ์๋ฒ์์ ํฐ ๋ ธ๋ ฅ ์์ด ์ถฉ์กฑํ ์ ์๋ ๋ฉ์ง ๊ธฐ๋ฅ์ ์ฐพ์ผ๋ฉด ๊ตฌํํฉ๋๋ค. (์ค์ ๋ก ์ด๊ฒ์ ์ ์ ์ทจ๋ฏธ ์ค ํ๋์ ๋๋ค.)
์ด๊ฒ๋ค์ ์ ๊ฐ ์ง๊ธ๊น์ง ๊ตฌํํ "์์ ๋ด๋ค๋ณด๋" ๊ธฐ๋ฅ๋ค์ ๋๋ค:
โ
๋ค์ค ์ฟผ๋ฆฌ ์คํ
โ
์คํค๋ง ๋ค์์คํ์ด์ฑ
โ
์ค์ฒฉ ๋ฎคํ
์ด์
โ
์ปดํฌ์ ๋ธ ๋๋ ํฐ๋ธ
โ
์ฌ์ ํผ๋๋ฐฑ
โ
ํ๋ ๋ฐ ๋๋ ํฐ๋ธ ๊ธฐ๋ฐ ๋ฒ์ ๊ด๋ฆฌ
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ์ถ๊ฐํ ๊ณํ์ ๋๋ค:
โณ๏ธ Subscriptions(์ด๊ฒ์ ์ด๋ฏธ ์ฌ์์ ์ผ๋ถ์
๋๋ค)
โณ๏ธ @stream๊ณผ @defer ๋๋ ํฐ๋ธ
โณ๏ธ ํ๋ซ ์ฒด์ธ ๋ฌธ๋ฒ
๋ผ์ด๋ ์น์: Gato GraphQL.
ํ์ !
์ ์ฌ ์๋ ์ฌ๋ฌ๋ถ.

์ ๋ง ์์ ์ ์๋ ๋ฐค์ด์์ต๋๋ค! ์ ๋ง ๋๋จํ ๊ฒฝ๊ธฐ๋ฅผ ๊ฒฝํํ์ต๋๋ค! ๋ ํค๋น๊ธ ์ ์๊ฐ ๊ฟ์ ์ํด ์ต์ ์ ๋คํ์ต๋๋ค.
๋ ์ ์ ๋ชจ๋ ์ซ๊ณ ์๋ ๊ฟ์ด์ง๋ง, ์ก์ ์ ์๋ ๊ฒ์ ํ ๋ช ๋ฟ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ , ๊ทธ ์ฌ๋์ด ๋๊ตฌ์ธ์ง ์๊ฒ ๋ฉ๋๋ค. ์ด์ , ์ง์ค์ ์๊ฐ์ ๋๋ค!
"WordPress์ GraphQL" ์ธ๊ณ ์ฑํผ์ธ์ ๋๊ฐ ๋ ๊น์?
๋๋ฆฌ ์ฐฌ์ฌ๋ฅผ ๋ฐ๊ณ , ๋์ค์๊ฒ ์ฌ๋๋ฐ์ผ๋ฉฐ, ์ ๋ช ๋งค์ฒด์ ์๊ฐ๋ ํ ์ฑํผ์ธ WPGraphQL์ผ๊น์?
์๋๋ฉด ๋ฐํญ์ ์ด๊ณ , ์ฉ์๋ฅผ ๊ตฌํ์ง ์๊ณ ๋ฐ์ ๋ฐ์ผ๋ฉฐ, ์ด๋๋ฐ์ง ์๊ณ ํํฐ์ ๋ํ๋ ๋์ ์ Gato GraphQL์ผ๊น์?

์ฌํ์ ํ์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ผ๋ง๋ ๊ธด์ฅ๋๋์ง! ์ค ํ๋๋, ์ด ์๊ฐ์ ์ ๋ง์์ด ๊ฒฌ๋๋ผ ์ ์๊ฒ ํด ์ฃผ์ธ์!
๐ฅ ๊ทธ๋ฆฌ๊ณ ๐ฅ ์น์๋ ๐ฅ ์ด์ด์ด์ด์ด์ด์ด์ด์ด์ด์ด์ด ๐ฅ ...
๋ฌด์น๋ถ์ ๋๋ค!
๋ ํ์ดํฐ, ๋ ํค๋น๊ธ, ๋ฌด์น๋ถ์ ๋๋ค!

์ ๋ง ๋ฉ์ง ์๊ฐ์ ๋๋ค! ๋ ์ ์๊ฐ ์๋ก ๊ปด์์ผ๋ฉฐ, ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ WordPress ์ปค๋ฎค๋ํฐ๋ผ๋ ํฐ ๊ฐ์กฑ ์์์ ์น๊ตฌ์์ ๋ณด์ฌ์ค๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌด์น๋ถ์ ์ด์ ๋ ๋ฌด์์ผ๊น์? ์ฌํ์ด ์ค๋ช ํฉ๋๋ค:
๐ WPGraphQL์ด ๋ ์ธ๊ธฐ ์์ผ๋ฉฐ, ๊ทธ ์ฌ์ฉ์ด ๋ ๋๋ฆฌ ํผ์ ธ ์์ต๋๋ค.
๐ Gato GraphQL์ ๋ ๋์ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ถ๊ณ ์์ผ๋ฉฐ, ์ฅ๊ธฐ์ ์ผ๋ก WordPress๋ฅผ ๋ ์ ์ง์ํ ์ ์๋ ์ ์ฌ๋ ฅ์ด ์์ต๋๋ค.
์ ์ฌ ์๋ ์ฌ๋ฌ๋ถ, ์ฌํ์ ํ์ ์ ๋ค์์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ํธ๋กํผ์๋ ๋ ๊ฐ์ ๊ธ๋ฌ๋ธ๊ฐ ์์ต๋๋ค: ๊ฐ ์ ์์๊ฒ ํ๋์ฉ.

ํ์ง๋ง ์ฌ๋ฌ๋ถ์ ํ์ ์ ๋ฌด์์ธ๊ฐ์?
ํค๋๋ฆฌ์ค ํ์๋ฅผ ์ํด WPGraphQL์ ๋ฌด์กฐ๊ฑด ๊ณ์ ์ฌ์ฉํ ๊ฑด๊ฐ์?
์๋๋ฉด Gato GraphQL์ด ์์ฒญํ๋ ๊ธฐํ๋ฅผ ์ค์, ํ๋ฌ๊ทธ์ธ์ ๋ค์ด๋ก๋ํ๊ณ ์๋ํด ๋ณผ ๊ฑด๊ฐ์?
์ ์ฌ ์๋ ์ฌ๋ฌ๋ถ. ์ค๋ ๋ฐค์ ์ด๊ฒ์ผ๋ก ๋ง์นฉ๋๋ค.
๊ฒฝ๊ธฐ๋ฅผ ์ฆ๊ธฐ์ จ๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ฑํผ์ธ์ ์๋ก์ด ๋๊ฒฐ์ด ๊ณง ์ด๋ฃจ์ด์ง๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋ ํ ๊ณ์ธ์.
2024๋ 05์ 01์ผ ์ ๋ฐ์ดํธ: Gato GraphQL vs WPGraphQL ๋น๊ต์์ ๋ ์์ธํ ์์๋ณด์ธ์.