๋ธ”๋กœ๊ทธ

๐ŸฅŠ Gato GraphQL vs WPGraphQL: ๋Œ€๊ฒฐ!

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

2024๋…„ 05์›” 01์ผ ์—…๋ฐ์ดํŠธ: Gato GraphQL vs WPGraphQL ๋น„๊ต๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

์‹ ์‚ฌ ์ˆ™๋…€ ์—ฌ๋Ÿฌ๋ถ„.

๊ฒฝ๊ธฐ ๋ฐœํ‘œ

์„ธ๊ธฐ์˜ ๋Œ€๊ฒฐ์ด ํŽผ์ณ์ง€๋Š” MGM ๊ทธ๋žœ๋“œ ๊ฐ€๋“  ์•„๋ ˆ๋‚˜์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์˜ค๋Š˜ ๋ฐค, ์šฐ๋ฆฌ๋Š” ์—ญ์‚ฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ‘๋‹ˆ๋‹ค. ๋‘ ์ Š์€ ํŒŒ์ดํ„ฐ๊ฐ€ ๋ง ์œ„์—์„œ ๋งž๋‹ฅ๋œจ๋ ค, ์ดํ† ๋ก ์—ด์‹ฌํžˆ ์‹ธ์›Œ์˜จ ๊ทธ ์ƒ์„ ๋†“๊ณ  ๊ฒจ๋ฃน๋‹ˆ๋‹ค:

"WordPress์˜ GraphQL" ์„ธ๊ณ„ ์ฑ”ํ”ผ์–ธ ๐Ÿ† ์˜ ํƒ€์ดํ‹€์„ ์ฐจ์ง€ํ•˜๊ธฐ ์œ„ํ•ด

์˜ค๋ฅธ์ชฝ ์ฝ”๋„ˆ์—๋Š” ํ˜„ ์ฑ”ํ”ผ์–ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฒจ์šฐ 4์‚ด์ด์ง€๋งŒ ์ด๋ฏธ ํ’๋ถ€ํ•œ ๊ฒฝํ—˜์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฉฐ, ์ตœ๊ทผ ๋ฒ„์ „ 1.0์— ๋„๋‹ฌํ•˜์—ฌ wp.org ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๊ฒŒ์‹œ๋˜์—ˆ๊ณ , ๋Œ€์ค‘๋“ค์—๊ฒŒ ๋งค์šฐ ์ธ๊ธฐ๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

๐Ÿฅ ๋œจ๊ฑฐ์šด ๐Ÿฅ ๋ฐ•์ˆ˜๋กœ ๐Ÿฅ ๋งž์ดํ•ด ๐Ÿฅ ์ฃผ์„ธ์š”์˜ค์˜ค์˜ค ๐Ÿฅ ...... WPGraphQL!

ํ˜„ ์ฑ”ํ”ผ์–ธ, WPGraphQL

์™ผ์ชฝ ์ฝ”๋„ˆ์—๋Š” ๋„์ „์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์ƒ์— ๋‚˜์˜จ ์ง€ ๊ฒจ์šฐ ํ•œ ๋‹ฌ์ด ๋˜์—ˆ์ง€๋งŒ ์—๋„ˆ์ง€ ๋„˜์น˜๊ณ  ์•ผ์‹ฌ ์ฐจ๋ฉฐ, ์ฒซ๋‚ ๋ถ€ํ„ฐ ์ž์‹ ์˜ ๊ฐ•์ ์„ ๋ฝ๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์˜ ๋Œ€๊ฒฐ์„ ์š”์ฒญํ•œ ๊ฒƒ๋„ ๋ฐ”๋กœ ๊ทธ์˜€์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋ฐค์ด ๊ทธ์˜ ๊ธฐํšŒ์ด๋ฉฐ, ์ „ ์„ธ๊ณ„๊ฐ€ ์ฃผ๋ชฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿฅ ๋œจ๊ฑฐ์šด ๐Ÿฅ ๋ฐ•์ˆ˜๋กœ ๐Ÿฅ ๋งž์ดํ•ด ๐Ÿฅ ์ฃผ์„ธ์š”์˜ค์˜ค์˜ค ๐Ÿฅ ...... Gato GraphQL!

๋„์ „์ž, 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.

ํžˆํŠธ! WPGraphQL์˜ ํŽ€์น˜๊ฐ€ Gato GraphQL์— ์ ์ค‘ํ•˜๋‹ค

๋ผ์šด๋“œ 2: ํ™•์žฅ ๊ธฐ๋Šฅ์˜ ์ด์šฉ ๊ฐ€๋Šฅ์„ฑ

ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด Gato GraphQL์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WPGraphQL์—๋Š” ACF, WooCommerce, Yoast ๋“ฑ์˜ ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Gato GraphQL์—๋Š” ์•„์ง ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉฐ, ๋ฒ„์ „ 1.0 ์ถœ์‹œ ์ „์—๋Š” ๋งŽ์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Gato GraphQL์€ ์•„ํ‚คํ…์ฒ˜์—์„œ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํฌ๊ฒŒ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘์•™ "Modules" ํŽ˜์ด์ง€์—์„œ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ๊ด€๋ฆฌ(ํ™œ์„ฑํ™”, ๋น„ํ™œ์„ฑํ™”, ์„ค์ •, ๋ฌธ์„œ ํ™•์ธ)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Gato GraphQL์˜ Modules ํŽ˜์ด์ง€

์ฆ‰, WPGraphQL์—๋Š” ์ด๋ฏธ ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์žˆ๊ณ , Gato GraphQL์€ ๊ทธ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

๋ผ์šด๋“œ ์Šน์ž: WPGraphQL.

WPGraphQL์ด ๋‹ค์‹œ ํžˆํŠธ!

๋ผ์šด๋“œ 3: ๋Œ€์ƒ ์‚ฌ์šฉ์ž

WPGraphQL์€ ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค: WordPress ์‚ฌ์ดํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋ ค๋ฉด ์ฝ”๋“œ ์–ด๋”˜๊ฐ€(์ฃผ๋กœ JavaScript ํ•จ์ˆ˜ ๋‚ด)์— GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ถฉ๋ถ„ํžˆ ๋Šฅ์ˆ™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Gato GraphQL์€ ๋น„๊ธฐ์ˆ ์ž๋ฅผ ํฌํ•จํ•œ ๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” WordPress ์ฒ ํ•™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด, WordPress ์—๋””ํ„ฐ๋ฅผ ํ†ตํ•ด GraphQL ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ, WordPress ์‚ฌ์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ API๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋งŒํผ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๋˜ํ•œ Gato GraphQL์€ GraphQL ์„œ๋น„์Šค์™€ ์‹œ๊ฐ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ œ๊ณต์— ๋” ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ๋‘ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋‘ GraphiQL ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Gato GraphQL๋งŒ์ด ์Šคํ‚ค๋งˆ๋ฅผ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•˜๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” Voyager ํด๋ผ์ด์–ธํŠธ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

GraphQL ์Šคํ‚ค๋งˆ ์‹œ๊ฐํ™”

๋ผ์šด๋“œ ์Šน์ž: Gato GraphQL.

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.

Gato GraphQL์ด ํ”์ ์„ ๋‚จ๊ธฐ๋‹ค!

๋ผ์šด๋“œ 5: ์ฝ”๋”ฉ ๊ด€ํ–‰

๋จผ์ € WPGraphQL๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. wp-graphql/wp-graphql ์ €์žฅ์†Œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์ œ ๋ˆˆ์— ๋‘๋“œ๋Ÿฌ์ง€๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

์ €์žฅ์†Œ์— ์ €์žฅ๋œ vendor ํด๋”

ํ™•๋Œ€ํ•˜๋ฉด:

vendor ํด๋”์˜ ๋‚ด์šฉ

์ฃ„์†กํ•˜์ง€๋งŒ, ์ด์— ๋Œ€ํ•ด ์ œ๊ฐ€ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค:

์ธ์ƒ์—์„œ ๋งŽ์€ ๊ฒƒ์„ ์šฉ์„œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๊ฒƒ๋งŒํผ์€ ์šฉ์„œํ•  ์ˆ˜ ์—†๋‹ค

Composer์˜ vendor ํด๋”๋ฅผ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ๊ด€ํ–‰์ด๋ฉฐ, Composer๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ด๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค(GitHub actions์— ๊ธฐ๋ฐ˜ํ•œ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค), ๊ทธ๋ž˜์„œ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋˜์–ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ผ์šด๋“œ์—์„œ๋Š” WPGraphQL์ด ์Šค์Šค๋กœ๋ฅผ ์น˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค!

์•„์•ผ!

๊ณ„์†ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. WPGraphQL ๊ฐœ๋ฐœ์—๋Š” ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•œ ํ›…(์•ก์…˜ ๋ฐ ํ•„ํ„ฐ) ์ปฌ๋ ‰์…˜์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. WPGraphQL์˜ ๊ฐœ๋ฐœ์ž ์ฐธ์กฐ๋ฅผ ๋ณด๋ฉด ๊ทธ ๊ทœ๋ชจ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ก์…˜ ๋ชฉ๋ก์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ 50%๊นŒ์ง€ ์ถ•์†Œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค:

WPGraphQL ํ™•์žฅ์„ ์œ„ํ•œ ์•ก์…˜ ํ›…

ํ•„ํ„ฐ ๋ชฉ๋ก์˜ ๊ฒฝ์šฐ, 30%(Firefox๊ฐ€ ์ง€์›ํ•˜๋Š” ์ตœ์†Ÿ๊ฐ’)๊นŒ์ง€ ์ถ•์†Œํ•ด๋„ ์ „์ฒด ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค:

WPGraphQL ํ™•์žฅ์„ ์œ„ํ•œ ํ•„ํ„ฐ ํ›…


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 (ํฌ๊ฒŒ ์•ž์„ ๋‹ค๊ณ  ๊ฐํžˆ ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค).

๊ฒฉ๋ ฌํ•œ ๋ผ์šด๋“œ ํ›„, WPGraphQL์€ ์ž ์‹œ ํœด์‹์ด ํ•„์š”ํ•˜๋‹ค

๋ผ์šด๋“œ 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: ์ปค์Šคํ…€ ๋””๋ ‰ํ‹ฐ๋ธŒ ์ง€์›

๋ผ์šด๋“œ 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๋ฅผ ๋” ์ž˜ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ ์‚ฌ ์ˆ™๋…€ ์—ฌ๋Ÿฌ๋ถ„, ์‹ฌํŒ์˜ ํŒ์ •์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ํŠธ๋กœํ”ผ์—๋Š” ๋‘ ๊ฐœ์˜ ๊ธ€๋Ÿฌ๋ธŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ๊ฐ ์„ ์ˆ˜์—๊ฒŒ ํ•˜๋‚˜์”ฉ.

"WordPress์˜ GraphQL" ํŠธ๋กœํ”ผ

ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์˜ ํŒ์ •์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

ํ—ค๋“œ๋ฆฌ์Šค ํ•„์š”๋ฅผ ์œ„ํ•ด WPGraphQL์„ ๋ฌด์กฐ๊ฑด ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฑด๊ฐ€์š”?

์•„๋‹ˆ๋ฉด Gato GraphQL์ด ์š”์ฒญํ•˜๋Š” ๊ธฐํšŒ๋ฅผ ์ค˜์„œ, ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹œ๋„ํ•ด ๋ณผ ๊ฑด๊ฐ€์š”?


์‹ ์‚ฌ ์ˆ™๋…€ ์—ฌ๋Ÿฌ๋ถ„. ์˜ค๋Š˜ ๋ฐค์€ ์ด๊ฒƒ์œผ๋กœ ๋งˆ์นฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ธฐ๋ฅผ ์ฆ๊ธฐ์…จ๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‘ ์ฑ”ํ”ผ์–ธ์˜ ์ƒˆ๋กœ์šด ๋Œ€๊ฒฐ์ด ๊ณง ์ด๋ฃจ์–ด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ˆ๋…•ํžˆ ๊ณ„์„ธ์š”.

2024๋…„ 05์›” 01์ผ ์—…๋ฐ์ดํŠธ: Gato GraphQL vs WPGraphQL ๋น„๊ต์—์„œ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.


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

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