๋ธ”๋กœ๊ทธ

๐Ÿ’๐Ÿฝโ€โ™‚๏ธ CMS ๋ถˆ๊ฐ€์ง€๋ก ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Gato GraphQL์ด ์•ฝ 90๊ฐœ์˜ ํŒจํ‚ค์ง€๋กœ ๋ถ„ํ• ๋œ ์ด์œ ์™€ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ 

Leonardo Losoviz
์ž‘์„ฑ์ž: Leonardo Losoviz ยท

์ง€๋‚œ ์ฃผ์— ๐Ÿ’๐Ÿปโ€โ™€๏ธ Gato GraphQL์ด ์™œ ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ํ•„์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋Š”์ง€ ๋ผ๋Š” ๊ธ€์„ ๊ฒŒ์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. Gato GraphQL์˜ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” GatoGraphQL/GatoGraphQL ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์„ Reddit์— ๊ณต์œ ํ–ˆ๋”๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋Œ“๊ธ€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

OP์˜ ๊ธ€๊ณผ ๊ฑฐ๊ธฐ์„œ ๋งํฌ๋œ ๊ธ€๋“ค์„ ์ฝ์œผ๋ฉด, ๋งˆ์น˜ ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ์Šฌ๋ผ์ด์Šค ๋นต ์ดํ›„ ์ตœ๊ณ ์˜ ๋ฐœ๋ช…์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ฝํž™๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜์—ฌ ์ข€ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋จผ์ €, ๊ด€๋ จ๋œ ๋‘ ๊ฐ€์ง€ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์‹ค์ œ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ํŒจํ‚ค์ง€์˜ ์ˆ˜์™€, ๊ธฐ๋ฐ˜์ด ๋˜๋Š” GraphQL ์„œ๋ฒ„๊ฐ€ CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ํŒจํ‚ค์ง€์˜ ์ˆ˜

200๊ฐœ ์ด์ƒ์˜ PHP ํŒจํ‚ค์ง€๋ฅผ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๋ชจ๋…ธ๋ ˆํฌ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๊ด€ํ•ด์„œ๋Š” ์‹ค์ œ๋กœ ๊ทธ๋ณด๋‹ค ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

GatoGraphQL/GatoGraphQL ๋ชจ๋…ธ๋ ˆํฌ๋Š” 5๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  1. PoP: ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (React์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ฐฑ์—”๋“œ์šฉ)
  2. GraphQL by PoP: PHP๋ฅผ ์œ„ํ•œ CMS ๋ถˆ๊ฐ€์ง€๋ก ์  GraphQL ์„œ๋ฒ„
  3. Gato GraphQL
  4. ์‚ฌ์ดํŠธ ๋นŒ๋” (WIP)
  5. Wassup: ์‚ฌ์ดํŠธ ๋นŒ๋” ๊ธฐ๋ฐ˜์˜ ์›น์‚ฌ์ดํŠธ ํ…Œ๋งˆ (WIP)

์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋“ค์„ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ํ˜ธ์ŠคํŒ…ํ•˜๋ฉด ์ƒํ˜ธ ์˜์กด์„ฑ ๋•Œ๋ฌธ์— ์ž‘์—…์ด ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค:

  • GraphQL by PoP๋Š” PoP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค
  • Gato GraphQL์€ GraphQL by PoP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค
  • ์‚ฌ์ดํŠธ ๋นŒ๋”๋Š” ์ปดํฌ๋„ŒํŠธ ๋ชจ๋ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (Gatsby๊ฐ€ GraphQL์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ)
  • Wassup์€ ์‚ฌ์ดํŠธ ๋นŒ๋”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค

5๊ฐœ ํ”„๋กœ์ ํŠธ ๋ชจ๋‘์˜ ์ฝ”๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ, GatoGraphQL/GatoGraphQL์€ 200๊ฐœ ์ด์ƒ์˜ PHP ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Gato GraphQL์— ๊ด€ํ•ด์„œ๋Š” "๋‹จ์ง€" 91๊ฐœ์˜ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ฐ˜์ด ๋˜๋Š” GraphQL ์„œ๋ฒ„์ธ GraphQL by PoP๋Š” "๋‹จ์ง€" 98๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

(Gato GraphQL ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ธฐ๋ฐ˜ GraphQL ์„œ๋ฒ„๋ณด๋‹ค ์ ์€ ํŒจํ‚ค์ง€๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ด์œ ๋Š”, Google Translate @strTranslate ๋””๋ ‰ํ‹ฐ๋ธŒ์™€ ๊ฐ™์€ ์ผ๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ์•„์ง ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

GraphQL by PoP๋Š” ์–ด๋–ป๊ฒŒ CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์ธ๊ฐ€์š”? webonyx์™€์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

GraphQL by PoP๋Š” CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์ด๋ผ๊ณ  ๋งํ•ด์™”์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌด์Šจ ์˜๋ฏธ์ธ๊ฐ€์š”?

๊ทธ๋Ÿฐ๋ฐ webonyx/graphql-php๋„ CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‘ ๊ฐ€์ง€๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ์š”?

webonyx/graphql-php๊ฐ€ CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์ธ ๊ฒƒ์€, Composer๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ๋˜๋Š” ํŒจํ‚ค์ง€๋กœ์„œ "๋ฐ”๋‹๋ผ" PHP ์ฝ”๋“œ๋งŒ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ž์ฒด๋กœ๋Š” ์™„์ „ํ•œ GraphQL ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ฉฐ, PHP์—์„œ GraphQL ์‚ฌ์–‘์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ, PHP์˜ ์–ด๋–ค GraphQL ์„œ๋ฒ„์— ๋‚ด์žฅ๋˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Lighthouse๋‚˜ WPGraphQL๊ณผ ๊ฐ™์ด GraphQL์„ ๊ตฌํ˜„ํ•˜๋Š” ์„œ๋ฒ„๋“ค์€ CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Lighthouse๋ฅผ WordPress์—์„œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, WPGraphQL์„ Laravel์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์˜๋ฏธ์—์„œ GraphQL by PoP๋Š” CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์ž…๋‹ˆ๋‹ค: Laravel, WordPress, ๋˜๋Š” ๊ธฐํƒ€ ์–ด๋–ค CMS๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฑฐ์˜ ์ค€๋น„๋œ "์ค€์™„์„ฑํ˜•" GraphQL ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. (๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด, ์ดํ›„๋ถ€ํ„ฐ "CMS"๋Š” "CMS ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.)

ํŠน์ • CMS๋ฅผ ์œ„ํ•ด ์™„์„ฑํ•˜๋ ค๋ฉด, ํ•ด๋‹น GraphQL ์„œ๋ฒ„์—๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ๊ทธ CMS์— ๋งž๋Š” ์ปค์Šคํ…€ ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋Œ“๊ธ€์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์™œ ๊ฐ ํŒจํ‚ค์ง€๋ฅผ ๋…๋ฆฝ๋œ ์ €์žฅ์†Œ์— ๋‘์–ด์•ผ ํ–ˆ๋‚˜์š”?

Packagist (Composer์˜ PHP ํŒจํ‚ค์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ)๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œ/๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์ €์žฅ์†Œ URL ์ œ๊ณต์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

(์ฐธ๊ณ ๋กœ, ์—ญ์‹œ ์ง€๋‚œ ์ฃผ์— ๊ฒŒ์žฌํ•œ ์ €์˜ ๊ธ€ Hosting all your PHP packages together in a monorepo์—์„œ๋„ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

์™œ CMS ๋ถˆ๊ฐ€์ง€๋ก ์„ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ๊ฐ์˜ ์ž‘์€ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋‚˜์š”?

๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

CMS๊ฐ€ ์ž์ฒด ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ

100% ๋™์ผํ•œ PHP ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋””์„œ๋‚˜ ์ž‘๋™ํ•˜๋Š” GraphQL ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ”๋“œ์˜ ์ผ๋ถ€๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์˜ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด, WordPress๋Š” ํ•„ํ„ฐ ํ›…์— ์˜์กดํ•˜๊ณ , Symfony๋Š” EventDispatcher ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Laravel์—๋Š” ์ž์ฒด์ ์ธ ์ด๋ฒคํŠธ์™€ ๋ฆฌ์Šค๋„ˆ ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ PHP ์ฝ”๋“œ๋„ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฝ”๋“œ๋ฅผ ์„ธ๋ถ„ํ™”๋œ ํŒจํ‚ค์ง€๋กœ ๋ถ„ํ• ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ์™€ ๋ฆฌ์Šค๋„ˆ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€๋กœ ํฌํ•จํ•˜๋Š” ๋Œ€์‹ , ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ฃผ์ž…๋˜๋ฉฐ, ์ด ํŒจํ‚ค์ง€์—๋Š” CMS๋ณ„ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด, ๋ชจ๋“  ๊ธฐ๋Šฅ์„ 2๊ฐœ์˜ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • CMS ๋ถˆ๊ฐ€์ง€๋ก ์  ํŒจํ‚ค์ง€: ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•˜๋ฉฐ "๋ฐ”๋‹๋ผ" PHP ์ฝ”๋“œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€์—๋Š” CMS๋ณ„ ํŒจํ‚ค์ง€๊ฐ€ ์ถฉ์กฑํ•ด์•ผ ํ•  ๊ณ„์•ฝ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค
  • CMS๋ณ„ ํŒจํ‚ค์ง€: ํ•ด๋‹น CMS์— ๋Œ€ํ•œ ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด, GraphQL by PoP์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์•ฝ์„ ํฌํ•จํ•˜๋Š” hooks ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

interface HooksAPIInterface
{
  public function addFilter(string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1): void;
  public function removeFilter(string $tag, callable $function_to_remove, int $priority = 10): bool;
  public function applyFilters(string $tag, mixed $value, mixed ...$args): mixed;
  public function addAction(string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1): void;
  public function removeAction(string $tag, callable $function_to_remove, int $priority = 10): bool;
  public function doAction(string $tag, mixed ...$args): void;
}

๊ทธ๋ฆฌ๊ณ  ํŒจํ‚ค์ง€ hooks-wp๋Š” WordPress์— ๋Œ€ํ•œ ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค:

class HooksAPI implements HooksAPIInterface
{
  public function addFilter(string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1): void
  {
    \add_filter($tag, $function_to_add, $priority, $accepted_args);
  }
  public function removeFilter(string $tag, callable $function_to_remove, int $priority = 10): bool
  {
    return \remove_filter($tag, $function_to_remove, $priority);
  }
  public function applyFilters(string $tag, mixed $value, mixed ...$args): mixed
  {
    return \apply_filters($tag, $value, ...$args);
  }
  public function addAction(string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1): void
  {
    \add_action($tag, $function_to_add, $priority, $accepted_args);
  }
  public function removeAction(string $tag, callable $function_to_remove, int $priority = 10): bool
  {
    return \remove_action($tag, $function_to_remove, $priority);
  }
  public function doAction(string $tag, mixed ...$args): void
  {
    \do_action($tag, ...$args);
  }
}

์ด์ œ ํ›…์˜ ๊ฐœ๋…์€ WordPress์—์„œ ์œ ๋ž˜ํ–ˆ์ง€๋งŒ, ๋‹ค๋ฅธ CMS์—์„œ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ: ์ด๋ฒคํŠธ์™€ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›…์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ). ๋”ฐ๋ผ์„œ hooks-wp๋ฅผ hooks-laravel, hooks-symfony, hooks-drupal, hooks-octobercms, ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ๊ฐ CMS๋ณ„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CMS๊ฐ€ ์ง€์›ํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ

๋ชจ๋“  CMS๊ฐ€ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, WordPress๋Š” meta_value ํ•ญ๋ชฉ์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, OctoberCMS๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ GraphQL by PoP์—๋Š” metaquery ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (WordPress๋ฅผ ์œ„ํ•ด metaquery-wp๋ฅผ ํ†ตํ•ด ์ถฉ์กฑ๋ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋ฉด WordPress๋ฅผ ์œ„ํ•ด ๊ตฌํ˜„๋œ GraphQL ์„œ๋ฒ„๋Š” ์ด ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜๊ฒ ์ง€๋งŒ, OctoberCMS๋ฅผ ์œ„ํ•œ ๊ฒƒ์€ ํฌํ•จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ์ 

ํŒจํ‚ค์ง€๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ถ„ํ• ํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ CMS๋ณ„ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌํ•˜๊ธฐ

CMS์˜ ํŠน์„ฑ (์ฝ”๋”ฉ ๋ฐฉ์‹, ๊ธฐ๋Šฅ, ์ œํ•œ ์‚ฌํ•ญ ๋“ฑ)์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹ , ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ CMS ๋ถˆ๊ฐ€์ง€๋ก ์  ํŒจํ‚ค์ง€ posts์˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ getPosts ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ๋ฐ˜ CMS์— ์˜ํ•œ ๊ตฌํ˜„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ฒŒ์‹œ๋ฌผ์€ ํ•ญ์ƒ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ์™€์ง‘๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์  ๋ถ€์ฑ„๋ฅผ ์šฐํšŒํ•˜๊ณ  ์ตœ์‹  ํ‘œ์ค€ ์‚ฌ์šฉํ•˜๊ธฐ

์œ„์˜ ์˜ˆ๋ฅผ ์ด์–ด์„œ, PSR-4 ๊ทœ์•ฝ์„ ๋”ฐ๋ฅด๋Š” getPosts ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. WordPress์—์„œ ์ •์˜ํ•œ get_posts๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹ ์— ๋ง์ด์ฃ .

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ถ€์ •ํ™•ํ•œ get_post ๋Œ€์‹  getCustomPost๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ปค์Šคํ…€ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด๊ฒƒ์€ WordPress์˜ ๊ธฐ์ˆ ์  ๋ถ€์ฑ„์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค).

์Šค์ฝ”ํ”„ ์ ์šฉ์ด ์‰ฝ๋‹ค

WordPress ํ”Œ๋Ÿฌ๊ทธ์ธ์— PHP-Scoper๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ฝ”ํ”„๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋„ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

CMS๋ณ„ ์ฝ”๋“œ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜๋ฉด, ์ผ๋ถ€ ํŒจํ‚ค์ง€ (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” ๊ฒƒ)์—๋งŒ PHP-Scoper๋ฅผ ์ ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ (WordPress ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ)์—๋Š” ์ ์šฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ „๋žต์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, PHP-Scoper์™€ ์œ ์‚ฌํ•˜๊ฒŒ, ์ผ๋ถ€ CMS๋ณ„ ์ฝ”๋“œ (WordPress ๋“ฑ)์— ์ ์šฉํ•˜๋ฉด ์‹คํŒจํ•˜๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ํฌํ•จํ•˜๋Š” ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

ํŒจํ‚ค์ง€๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋งŒ ํฌํ•จํ•˜๋Š” ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐœ์ธ ๋ธ”๋กœ๊ทธ๋Š” posts, tags, categories๋งŒ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, users๋‚˜ user-login ๊ธฐ๋Šฅ์„ ๋‹ค๋ฃฐ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ, ์ €๋Š” ๊ณง ์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค: ํ˜„์žฌ "Private GraphQL API"๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž์ฒด ์™„๊ฒฐํ˜• GraphQL ์—”์ง„์œผ๋กœ, WordPress ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž์‹ ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋ฒˆ๋“ค๋กœ ํฌํ•จํ•˜์—ฌ Gutenberg ๋ธ”๋ก์— GraphQL API๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Gato GraphQL ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€ (UI, ํด๋ผ์ด์–ธํŠธ, ์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ, HTTP ์บ์‹ฑ, ์˜์† ์ฟผ๋ฆฌ ๋“ฑ์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๋“ค)๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด "Private GraphQL API"๋ฅผ ์†์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์Šค์ฝ”ํ”„ ์ ์šฉ์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— (์œ„์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ), ํ•„์š”ํ•œ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, Private GraphQL API๋Š” ์ถฉ๋Œ ์—†์ด ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (2๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ Private GraphQL API๋ฅผ ๋ฒˆ๋“ค๋กœ ํฌํ•จํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ).

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋‹จ์ 

๋‘๋งํ•  ๊ฒƒ๋„ ์—†์ด, ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์™„๋ฒฝ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•ด์ง„๋‹ค

์ผ๋ฐ˜์ ์œผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด WordPress์—์„œ ์‹คํ–‰๋œ๋‹ค๋ฉด, ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํžˆ get_posts๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฝ์Šต๋‹ˆ๋‹ค.

CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์ƒํ™ฉ์ด ์ƒ๋‹นํžˆ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • posts์™€ posts-wp ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  • posts ํŒจํ‚ค์ง€์— getPosts ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ณ„์•ฝ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  • posts-wp ํŒจํ‚ค์ง€์—์„œ get_posts๋ฅผ ํ†ตํ•ด ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค
  • ๊ธฐ๋Šฅ์„ ํ•ญ์ƒ ๊ณ„์•ฝ์„ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๊ณ  ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค

(์ƒ๋‹นํžˆ ๋†’์€ ํ™•๋ฅ ๋กœ) ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•˜๋‹ค

CMS ๋ถˆ๊ฐ€์ง€๋ก ์  ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ๊ณ„์•ฝ๊ณผ CMS๋ณ„ ํŒจํ‚ค์ง€์˜ ๊ตฌํ˜„์„ ๋ฐ”์ธ๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” Symfony์˜ DependencyInjection ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋งค์šฐ ์ข‹์•„ํ•˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•„์š”๋กœ ํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ, ๊ทธ๋งŒํผ ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

(๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ๋กœ) ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค

Gato GraphQL์€ ๊ฒฐ๊ตญ 91๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๊ฐ๊ฐ์„ ๋…๋ฆฝ๋œ ์ €์žฅ์†Œ์— ํ˜ธ์ŠคํŒ…ํ•˜์—ฌ PR์„ ๋งŒ๋“ค๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋…ธ๋ ˆํฌ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด: ์ €๋Š” ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์ฒด์ ์ธ ๋…ธ๋ ฅ๋„ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ๋งํฌ

์ €๋Š” WordPress ์›น์‚ฌ์ดํŠธ๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ CMS ๋ถˆ๊ฐ€์ง€๋ก ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋™๊ธฐ์™€ ์ „๋žต์— ๋Œ€ํ•ด ์ด์ „์— ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. Gato GraphQL์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์ ์šฉํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ด ๋™์ผํ•œ ์ „๋žต์ž…๋‹ˆ๋‹ค:

๋ถ€๋ก: ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” 91๊ฐœ ํŒจํ‚ค์ง€ ๋ชฉ๋ก

Gato GraphQL์—๋Š” ๋‹ค์Œ 91๊ฐœ์˜ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—”์ง„ ๊ธฐ๋Šฅ:

getpop/access-control
getpop/cache-control
getpop/component-model
getpop/definitions
getpop/engine
getpop/engine-wp
getpop/field-query
getpop/guzzle-helpers
getpop/hooks
getpop/hooks-wp
getpop/loosecontracts
getpop/mandatory-directives-by-configuration
getpop/modulerouting
getpop/query-parsing
getpop/root
getpop/routing
getpop/routing-wp
getpop/translation
getpop/translation-wp
graphql-api/markdown-convertor

API ๊ธฐ๋Šฅ:

getpop/api
getpop/api-clients
getpop/api-endpoints
getpop/api-endpoints-for-wp
getpop/api-graphql
getpop/api-mirrorquery

GraphQL ์„œ๋ฒ„ ๊ธฐ๋Šฅ:

graphql-by-pop/graphql-clients-for-wp
graphql-by-pop/graphql-endpoint-for-wp
graphql-by-pop/graphql-parser
graphql-by-pop/graphql-query
graphql-by-pop/graphql-request
graphql-by-pop/graphql-server

๋ฐ์ดํ„ฐ ๋ชจ๋ธ:

pop-schema/basic-directives
pop-schema/categories
pop-schema/categories-wp
pop-schema/comment-mutations
pop-schema/comment-mutations-wp
pop-schema/commentmeta
pop-schema/commentmeta-wp
pop-schema/comments
pop-schema/comments-wp
pop-schema/custompost-mutations
pop-schema/custompost-mutations-wp
pop-schema/custompostmedia
pop-schema/custompostmedia-mutations
pop-schema/custompostmedia-mutations-wp
pop-schema/custompostmedia-wp
pop-schema/custompostmeta
pop-schema/custompostmeta-wp
pop-schema/customposts
pop-schema/customposts-wp
pop-schema/generic-customposts
pop-schema/media
pop-schema/media-wp
pop-schema/menus
pop-schema/menus-wp
pop-schema/meta
pop-schema/metaquery
pop-schema/metaquery-wp
pop-schema/pages
pop-schema/pages-wp
pop-schema/post-categories
pop-schema/post-categories-wp
pop-schema/post-mutations
pop-schema/post-tags
pop-schema/post-tags-wp
pop-schema/posts
pop-schema/posts-wp
pop-schema/queriedobject
pop-schema/queriedobject-wp
pop-schema/schema-commons
pop-schema/tags
pop-schema/tags-wp
pop-schema/taxonomies
pop-schema/taxonomies-wp
pop-schema/taxonomymeta
pop-schema/taxonomymeta-wp
pop-schema/taxonomyquery
pop-schema/taxonomyquery-wp
pop-schema/user-roles
pop-schema/user-roles-access-control
pop-schema/user-roles-wp
pop-schema/user-state
pop-schema/user-state-access-control
pop-schema/user-state-mutations
pop-schema/user-state-mutations-wp
pop-schema/user-state-wp
pop-schema/usermeta
pop-schema/usermeta-wp
pop-schema/users
pop-schema/users-wp

๋‰ด์Šค๋ ˆํ„ฐ ๊ตฌ๋…ํ•˜๊ธฐ

Gato GraphQL์˜ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๋ฅผ ๋†“์น˜์ง€ ๋งˆ์„ธ์š”.