๋ทํ ๊ฐ์ ์ฟผ๋ฆฌ ์ธ์ด, GraphQL ํบ์๋ณด๊ธฐ
๋ทํ ๊ฐ์ ์ฟผ๋ฆฌ ์ธ์ด, GraphQL ํบ์๋ณด๊ธฐ ๊ด๋ จ
์ง๋ 2024๋ 10์ 10์ผ, ๋ฏธ๊ตญ ์ํ๋์์ค์ฝ์์ GraphQLConf 2024๊ฐ ์ด๋ ธ์ต๋๋ค. ์ด ์ฝํผ๋ฐ์ค๋ GraphQL ์ฌ๋จ(GraphQL Foundation)์ด ์ฃผ์ตํ๋ ๊ณต์ ํ์ฌ๋ก, ์ ์ธ๊ณ์ GraphQL ๊ฐ๋ฐ์๋ค์ด ํ์๋ฆฌ์ ๋ชจ์ฌ ์ ๋ณด๋ฅผ ๊ต๋ฅํ๊ณ ๋ ์๋ก์ด ์คํ์ ์ฑํํ๋ ์๋ฆฌ์ด๊ธฐ๋ ํ์ต๋๋ค.
GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ํน์ ๋ฐ์ดํฐ๋ง ์์ฒญํ ์ ์๋๋ก ํ์ฌ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ์ ์ฐํ ๋ฐ์ดํฐ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ API ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค.
์ธ์ด์ ๋ฐ์ ๊ณผ ํจ๊ป ์ ์ ๋ ๋ง์ ๊ธฐ์ ์์ ํด๋ผ์ด์ธํธ-์๋ฒ ํต์ ์๋จ์ผ๋ก GraphQL์ ์ฑํํ๋ ์ฌ๋ก๊ฐ ๋์ด๋๊ณ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก ํ์ด์ค๋ถ(Facebook), ๊นํ๋ธ(GitHub), ๊ทธ๋ฆฌ๊ณ ํํฐ๋ ์คํธ(Pinterest) ๊ฐ์ ์๋น์ค๋ค์ด GraphQL์ ์ฑํํ๊ณ ์๋ค๊ณ ํฉ๋๋ค. ๋ํ ์๋น์ค๋ค๋ฟ๋ง์ด ์๋๋๋ค. ๊ธ์ ์ฐ๋ ํ์ฌ ๊ธฐ์ค(24๋ 10์), ๊นํ๋ธ์์ โGraphQLโ์ด๋ ํค์๋๋ฅผ ํฌํจํ ๊ณต๊ฐ ๋ ํฌ์งํ ๋ฆฌ๊ฐ 29,865๊ฐ์ ๋ฌํ ์ ๋์ฃ .
์ด๋ฒ ๊ธ์์๋ ์ด ์ฟผ๋ฆฌ ์ธ์ด์ ํน์ง์ ์ดํด๋ณด๋ฉฐ, ์ ์ดํ ๋ก ๋ง์ ๊ด์ฌ์ ๋ฐ๋์ง ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
GraphQL์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
โMATER ARTIUM NECESSITASโ
William Horman, 1519
โํ์๋ ๋ฐ๋ช ์ ์ด๋จธ๋โ๋ผ๋ ๋ง์ด ์์ต๋๋ค.
GraphQL์ ๋ง๋ ์ฃผ์ฒด๋ ๋ฉํ(Meta, ๋น์ Facebook)์ ๋๋ค. ์ด๋ค์ ์ GraphQL์ด๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํต์ ๋ฐฉ์์ ๋ง๋ค์ด์ผ ํ์๊น์?
2004๋ , ์ฒซ ์ถ์ ์ดํ ํ์ด์ค๋ถ์ ์์ฒญ๋ ์ธ๊ธฐ๋ฅผ ๋๋ฆฌ๋ฉฐ ๋ช ๋ ๋ง์ ์๋ฐฑ๋ง ๋ช ์ ์ฌ์ฉ์๋ฅผ ๊ฑฐ๋๋ฆฐ ๊ฑฐ๋ ํ๋ซํผ์ด ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ 2007๋ ์ ํ์ ์์ดํฐ์ด ์ถ์๋์๊ณ , ๊ฐ์ ํด ๊ตฌ๊ธ์ ์๋๋ก์ด๋ ์ญ์ ๋ฐํ๋์์ฃ . ๊ธฐ์กด PC ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ ํ์ด์ค๋ถ์๋ ํด๋์ ํ๋ฅผ ์ด์ฉํ ์ด์ฉ์๊ฐ ๋์ด๋๊ฒ ๋ฉ๋๋ค. ๊ทธ์ ํจ๊ป ์น์ ์ง์คํ๋ ํ์ด์ค๋ถ ๊ฐ๋ฐ์๋ ๋ณํ๊ฐ ์๊ธฐ๊ธฐ ์์ํฉ๋๋ค.
Mark Zuckerberg โOur Biggest Mistake Was Betting Too Much On HTML5โ
Olanoff, Drew. TechCrunch. 2012. 09. 11.
2012๋ ์ธํฐ๋ทฐ์์ ๋ฉํ ์ฐฝ์ ์ ๋งํฌ ์ ์ปค๋ฒ๊ทธ(Mark Zuckerberg)๋ โํ์ด์ค๋ถ์ด ์น ๊ธฐ๋ฐ(HTML5)์ ์น์คํ๋ ๊ฒ์ด ์ค์โ๋ผ๊ณ ์ธ๊ธํ๊ธฐ๋ ํ์ต๋๋ค. ์ด๋ ๊ณง iOS๋ ์๋๋ก์ด๋(Android) ์ฑ ํ๋๋ฅผ ํค์ฐ๊ฒ ๋ค๋ ๋ง์ด์์ฃ .
ํ์ง๋ง ๋น์ ๋ชจ๋ฐ์ผ ์์ฅ์ผ๋ก ๋๊ฐ๋ ค๋ฉด, ์ด์ ์์ ๊ธฐ์กด REST API์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ์๊ฐ ์์์ต๋๋ค. ์ด ์์ ํ์ด์ค๋ถ์ด ์ง๋ฉดํ๋ ๋ฌธ์ ๋ค์ ์๋์ ๊ฐ์ต๋๋ค.
- ํ๋์ API๊ฐ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์ค๋ฒํจ์นญ(Over-fetching) ๋ฌธ์
- ํ ํ๋ฉด์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ API์์ ๋ถ๋ฌ์์ผ ํ๋ ์ธ๋ํจ์นญ(Under-fetching) ๋ฌธ์
- ๋ฐฑ์๋ API๊ฐ ์์ ๋ ๋๋ง๋ค ํ๋ก ํธ์๋ ์ฝ๋ ์ญ์ ์์ ๋์ด์ผ ํ๋ ๋ฌธ์
- ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฑ์๋ API๊ฐ ๋ณํ ๋๋ง๋ค API ๋ช ์ธ์๋ฅผ ์์ ํด์ผ ํ๋ ๋ฌธ์
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ด์ค๋ถ์ 2012๋ , GraphQL์ ์ ์ฉํ ์๋ก์ด iOS ์ฑ์ ์ถ์ํ๊ฒ ๋ฉ๋๋ค.
GraphQL vs. REST API
๊ทธ๋ ๋ค๋ฉด GraphQL์ ์ด๋ป๊ฒ ์ 4๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ผ๊น์? ๋ค์ ๋งํด, GraphQL์ ๊ธฐ์กด์ ์ฌ์ฉํ๋ REST์ ์ด๋ค ์ ์ด ๋ค๋ฅธ ๊ฑธ๊น์?
๊ธฐ์กด์ ํด๋ผ์ด์ธํธ-์๋ฒ ํต์ ์๋จ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฐ์ธ REST API๋ 2000๋ , ๋ก์ด ํ๋ฉ(Roy Fielding)์ ๋ ผ๋ฌธ์์ ์ฒ์ ๋ฑ์ฅํฉ๋๋ค. REST์ ๊ฐ์ฅ ํฐ ํน์ง์ ๋ฐ๋ก ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ์ ๋๋ค. ์ด๋ฅผ ํ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ํน์ ์๋ํฌ์ธํธ์ ์์ฒญ์ ๋ณด๋ผ ๋, ๊ทธ์ ํด๋นํ๋ ์ ํด์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก๋ง ์๋ต์ ๋ฐ์ต๋๋ค.
์ด๋ฌํ REST ๊ตฌ์กฐ๋ ํ์ค์ ์ ์ฐฌ ์๋น๊ณผ ์ ์ฌํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ ์ฐฌ์ ์ฃผ๋ฌธํ๋ฉด ๋๊ฐ ์ํค๋ ๊ฐ์ ์์์ด ์ ๊ณต๋๊ธฐ ๋ง๋ จ์ด๋๊น์. ๋ฌผ๋ก REST ์ญ์ ์ฟผ๋ฆฌ ๋งค๊ฐ ๋ณ์(query parameter)๋ฅผ ์ด์ฉํด์ ์ฝ๊ฐ์ ๋ณ์ฃผ๋ฅผ ์ค ์๋ ์์ง๋ง, ๊ทธ ๋ํ ๋ฒ์๊ฐ ํ์ ์ ์ ๋๋ค. ๋ง์น ์ค๊ตญ์ง์์ ์ฝ์ค ์๋ฆฌ๋ฅผ ๋จน๊ณ ๋, ํ์์ผ๋ก ์ง์ฅ๋ฉด์ ๋จน์์ง ์งฌ๋ฝ์ ๋จน์์ง ์ ํํ๋ ์ ๋์ฃ .
๋ฐ๋ฉด GraphQL์ ๋ทํ์ ๋ ๊ฐ๊น์ต๋๋ค. ๋ทํ์์๋ ์๋น์ด ์ ํด์ง ์์์ ์๋์๊ฒ ๊ฐ์ ธ๋ค ์ฃผ์ง ์์ต๋๋ค. ์๋์ด ์ง์ ์ํ๋ ์์์ ์ ํํ๋ ๊ตฌ์กฐ์ด์ฃ . ๋ง์ฐฌ๊ฐ์ง๋ก GraphQL๋ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ํํ๊ฒ ์ ํํด ์์ฒญํ ์ ์์ต๋๋ค. ๋ง์น ๋ทํ์์ ์๋์ด ์ ์์ ์ํ๋ ์ข ๋ฅ์ ์์์ ํ์ํ ์๋งํผ ๋์ด๊ฐ๋ฏ, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก๋ถํฐ ํ์ํ ๋ฐ์ดํฐ๋ง ๊ณจ๋ผ ๊ฐ ์ ์๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, GraphQL์์๋ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ๋ณด๋ผ ์๋ ์์ต๋๋ค: โ์ฌ์ฉ์์ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์ ์ธํ ๊ธฐ๋ณธ ์ ๋ณด์ ๊ทธ๋ค์ด ์์ฑํ ๊ฒ์๊ธ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒ์๊ธ์ ๋ฌ๋ฆฐ ๋๊ธ๋ค, ๊ทธ ๋๊ธ์ ์ข์์๋ฅผ ๋๋ฅธ ์ฌ๋โ. ์ผ๋ฐ์ ์ธ REST API๋ผ๋ฉด ์ฌ๋ฌ ๋ฒ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณตํด์ผ ํ ์ง๋ ๋ชจ๋ฅผ ์๊ตฌ์ฌํญ์ด์ฃ .
๋ํ ์๋น์์ ๋ฉ๋ด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์จ ๋๋ ๋ฉ๋ดํ์ ์๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ฒ๋ค๊ฐ ๊ธฐ์กด ์์์ ์ฐพ๋ ๋จ๊ณจ ์๋๋ค์๊ฒ๋ ์ผ์ผ์ด ์ค๋ช ๋ ํด์ค์ผ ํ์ฃ . ๋ฐ๋ฉด ๋ทํ์์๋ ์๋์ด ๋ฉ๋ด ๊ตฌ์ฑ์ ์ง์ ํ์ธํ๋ฉฐ ์๊ฐ์ , ํ๊ฐ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
REST์ GraphQL์ ์ฐจ์ด๋ ์ด์ ๋น์ทํฉ๋๋ค. GraphQL์ด API ์์ ๋ฌธ์ ์์ ์ข ๋ ์์ ๋ก์ด ํธ์ ๋๋ค. ๋ฌผ๋ก REST ์ญ์ ์คํ API ์คํ์ ์ฌ์ฉํด ๋ช ์ธํ๊ธด ํ์ง๋ง, ๋ช ์ธ๊ฐ ๋ฐ๋ก ์ฝ๋๋ก ์ด์ด์ง๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ๋ฉด GraphQL์ ์คํค๋ง ์ ์ ์ธ์ด(Schema Definition Language)์ด๊ธฐ ๋๋ฌธ์ ์คํค๋ง-์ฐ์ ๊ฐ๋ฐ ๋ฉด์์ ํจ์ฌ ๋งค๋๋ฌ์ด ํ๋ฆ์ ๋ณด์ฌ์ค๋๋ค.
GraphQL์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ: ์ฝ๋ ์์
๋ค์์ REST์ GraphQL์ด ๊ฐ๊ฐ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์์์ ๋๋ค.
REST์ ๋์ ๋ฐฉ์
์๋ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.
REST API์ ๊ฒฝ์ฐ ๋จผ์ ํน์ user๋ฅผ ๋ฐ์์ฌ ์ ์๋ URI ์๋ํฌ์ธํธ(Endpoint)๋ฅผ ์ค๋นํฉ๋๋ค.
GET /users/123456789
*์ฌ๊ธฐ์ ๋งจ ๋ง์ง๋ง ์ซ์๋ user์ ID์ ํด๋นํฉ๋๋ค.
REST๋ ๋ํ์ ์ธ ๋ช ์ธ ๋ฐฉ๋ฒ์ธ ์คํ์์ดํผ์์ด(OpenAPI Specification, ์ดํ OAS)๋ฅผ ์ด์ฉํด ํด๋น ์๋ํฌ์ธํธ์ ์๋ต์ ๋ช ์ธํด ์ค๋๋ค. ์ด ๋ช ์ธ๋ ์ค์จ๊ฑฐ(Swagger)๋ ๋ฆฌ๋ํด๋ฆฌ(Redocly) ๋ฑ์ ํด๋ก ์๊ฐํํด์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ, ์ด๋ค ์์ฒญ์ ๋ํด ์ด๋ค ์๋ต์ด ์ค๋์ง ์ ์ ์๊ฒ ํด์ค๋๋ค.
OpenAPI Specification ์ค User ์คํค๋ง ์ปดํฌ๋ํธ ์ ์
์ฌ๊ธฐ์ GraphQL๊ณผ REST์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๊ฐ ๋ํ๋ฉ๋๋ค. REST๋ OAS๋ก ๋ช ์ธํ๋ ๊ฒ์ด ๋ชจ๋ฒ ์ฌ๋ก์ด์ง๋ง, ์ค์ ๊ตฌํ์ด ๋ฌธ์์ ๋ค๋ฅด๋ค๊ณ ํด์ ์ง์ ์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ฌธ์๊ฐ ์ค๋๋์ด ์ ๋ฐ์ดํธ๊ฐ ์ด๋ค์ง์ง ์์๊ฑฐ๋, ๊ฐ๋ฐ์์ ์ค์๋ก ๊ตฌํ๊ณผ ๋ช ์ธ๊ฐ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค. REST์์๋ ๋ฌธ์๊ฐ ๊ถ์ฅ ์ฌํญ์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ด์ฃ .
GraphQL์ด ์ค๋ฒํจ์นญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
๋ฐ๋ฉด GraphQL์ ์คํค๋ง ์ ์ ์ธ์ด(Schema definition language)๋ก์จ API์ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ์ ์ํ๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ API ์ค๊ณ ๋จ๊ณ์์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์กฐํํ๊ณ ์กฐ์ํ ์ง ๋ช ํํ๊ฒ ๊ท์ ํ๋ ์ญํ ์ ํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์๊ฒฉํ ๊ณ์ฝ์ ํ์ฑํ์ฌ ์ผ๊ด์ฑ๊ณผ ์์ ์ฑ์ ๋์ ๋๋ค.
์์๋ก ๋ณด๊ฒ ์ต๋๋ค. ์ผ๋จ OAS์์์ฒ๋ผ GraphQL ์คํค๋ง๋ฅผ ์ ์ํ์ต๋๋ค.
๋ค์์ผ๋ก๋ REST์ GET ์๋ํฌ์ธํธ์ ๊ฐ์ ์ญํ ์ ํ๋ ์ฟผ๋ฆฌ ํ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ค์ ์ฟผ๋ฆฌ์์๋ ์๋์ฒ๋ผ ์ํ๋ ํ๋(field)๋ง์ ์ ํํ์ฌ ์์ฒญํ ์ ์์ต๋๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ฒญํ ์ ์๋ค๋ฉด, ์ฟผ๋ฆฌ๋ก ํ์ํ ํ๋๋ง์ ๋ถ๋ฌ์ค๋ฉด์ ์์ ์ ๊ธฐ๋ ์ค๋ฒํจ์นญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ๋ฉ๋๋ค.
GraphQL์ด ์ธ๋ํจ์นญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ ํ๋ฉด์์ ์ฌ์ฉ์ ํ ๋ช ์ ์ ๋ณด, ํด๋น ์ฌ์ฉ์์ ์น๊ตฌ๋ค์ ๋ํ ์ ๋ณด๋ฅผ ํ ๋ฒ์ ๋ถ๋ฌ์ฌ ์๋ ์์๊น์?
REST ์์น์ ์ ์งํค๋ API๋ผ๋ฉด, ์ด๋ฐ ๋ณต์กํ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ ์ง๋ ๋ชจ๋ฆ ๋๋ค.
GET /users/123456789
์์ฒญ- ์๋ต์์ friends ํค์ ๊ฐ๋ค์ ํ๋
GET /users/์ฒซ-๋ฒ์งธ-์น๊ตฌ์-ID
- 2์์ ์ป์ ์น๊ตฌ์ ๊ธธ์ด๋งํผ 3์ ๋ฐ๋ณต
์ฌ๊ธฐ์ N๋ช ์ ์น๊ตฌ๋ฅผ ๋ณด์ ํ ์ฌ์ฉ์์ ์น๊ตฌ ์ ๋ณด๋ฅผ ๋ชจ๋ ์ป๊ธฐ ์ํด์ N+1๋ฒ์ ์์ฒญ์ด ํ์ํด์ง๋๋ค.
GraphQL์ ์ข ๋ ์์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. User ์คํค๋ง์ โfriendsโ ํ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋ค๋ง ์ฌ๊ธฐ์ friends ํ๋๋ ํ์๊ฐ ์๋๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ์์๋ ์ฟผ๋ฆฌํ์ง ์๋ค๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.
์ด ์ฟผ๋ฆฌ๋ง์ผ๋ก ์๋์ฒ๋ผ ํ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ ๋ฒ์ ๋ฐํ๋ฐ์ ์ ์์์ต๋๋ค. ์ด๋ฐ ํน์ฑ์ผ๋ก ์ธ๋ํจ์นญ ๋ฌธ์ ์ญ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ํนํ GraphQL์ ์ด์ฉํ ๊ฒฝ์ฐ, ์ค์ ์ฟผ๋ฆฌ ์์์ฒ๋ผ name๊ณผ email์ ์กฐํฉ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฅํ 16๊ฐ(=2^4)์ ์กฐํฉ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํด์ฌ ์ ์์ต๋๋ค.
๋ฌผ๋ก , REST๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ์ด๋ฐ ์๋ต ํํ๋ฅผ ๋ฐ์ง ๋ชปํ๋ค๋ ๊ฒ์ ์๋๋๋ค. ๋ค๋ง ์์ ๋งํ๋ฏ REST์ค๋ฝ์ง ์์(Not RESTful) API๊ฐ ๋๋ ๊ฒ์ด์ฃ .
์ธ์ GraphQL์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น?
๊ทธ๋ ๋ค๊ณ GraphQL์ด REST๋ฅผ ์์ ํ ๋์ฒดํ๋ ๋๊ตฌ๋ ์๋๋๋ค. ์คํ๋ ค REST์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ๋์์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๊ฒฝ์ฐ์ GraphQL์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ ๊น์?
ํ ๋ฒ์ ๋ค์ํ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋
GraphQL์ ์ฌ๋ฌ UI ์ปดํฌ๋ํธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐ์์ฌ ์ ์์ต๋๋ค. ์์ ๋ฏธ๋์ด ์ฑ์ ํํ์ด์ง๋ฅผ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด ํ์ด์ง์๋ ์ฌ์ฉ์์ ํ๋กํ ์ ๋ณด, ์ต๊ทผ ๊ฒ์๋ฌผ, ์น๊ตฌ ๋ชฉ๋ก, ์๋ฆผ ๋ฑ ๋ค์ํ ์ ๋ณด๊ฐ ํ ๋ฒ์ ๋ณด์ฌ์ผ ํฉ๋๋ค. REST API๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ๊ฐ์ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด API๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ ํ์๊ฐ ์์ง๋ง, GraphQL์ ์ฌ์ฉํ๋ฉด ๋จ์ผ ์ฟผ๋ฆฌ๋ก ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋์์ ํธํ์ฑ์ ์ ์งํ๊ณ ์ถ์ ๋
GraphQL์ API๊ฐ ์ ์ง์ ์ผ๋ก ๋ฐ์ ํ ์ ์๋๋ก ๋ง๋ญ๋๋ค. ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ํ๋๋ฅผ ๋ฏธ์ฌ์ฉ(deprecated)์ผ๋ก ํ์ํจ์ผ๋ก์จ, ๊ธฐ์กด ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๊ณ API๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. API ๋ฒ์ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ณ๋ ฌ์ ์ผ๋ก ๊ฐ๋ฐํ ๋
GraphQL์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๋ณ๋ ฌ์ ์ผ๋ก ์งํํ ์ ์๊ฒ ํด์ค๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ ์ง์ ํ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ ์ด์ ๋ง์ถฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฐ ์๋๋ฅผ ์ฌ๋ ค ํ์ ์ํํ ํ์ ์ ๋์ต๋๋ค.
๋ค์ํ ๋นํธ์ธ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋
GraphQL์ ๊ฐ๋ ฅํ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API ๊ฐ๋ฐ๊ณผ ํ ์คํธ๋ฅผ ๋์ฑ ํจ์จ์ ์ผ๋ก ๋ง๋ญ๋๋ค. GraphiQL๊ณผ ๊ฐ์ ๋๊ตฌ๋ ์ค์๊ฐ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ํ ์คํธํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ฉฐ, ์คํค๋ง ํ์๊ณผ ์๋ ์์ฑ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ๋ฐ ์๋๋ฅผ ๋์ ๋๋ค.
์ฌ๋ก๋ก ์์๋ณด๊ธฐ: ๊นํ๋ธ๋ ์ GraphQL์ ์ฑํํ์๊น?
๋ง์ง๋ง์ผ๋ก ๊ฐ๋ณ๊ฒ ์ค์ ์๋น์ค๊ฐ REST์์ GraphQL๋ก ์ ํํ ์ฌ๋ก๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊นํ๋ธ๋ ์ง๋ 2016๋ ์ GraphQL API๋ฅผ ๊ณต๊ฐํ๋ฉฐ, ์ ํ ์ด์ ๋ฅผ ๊ณต์ ๋ธ๋ก๊ทธ ๊ธ์์ ์์ธํ ์ค๋ช ํ์ต๋๋ค.
์ ํ์ ๊ฒฐ์ฌํ ์ฒซ ์์ธ, โํ์ฅ์ฑโ์ ๋๋ค. ๋น์ REST API๋ก ๋ฐ์ํ๋ ์์ฒญ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒญ์ 60% ์ด์์ ์ฐจ์งํ๊ณ ์์๋ค๊ณ ํฉ๋๋ค. ์ด๋ ํ์ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ฌ๋ฌ ๋ฒ ํต์ ํด์ผ ํ๋ ๊ตฌ์กฐ์ ํ๊ณ๊ฐ ์์์ต๋๋ค.
๋ ๋ฒ์งธ ์์ธ์ โAPI์ ๋ํ ๋ฉํ ์ ๋ณด ๊ด๋ฆฌโ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ ์๋ํฌ์ธํธ์ ํ์ํ OAuth ์ค์ฝํ๋ฅผ ํ์ ํ๊ณ , ํ์ด์ง๋ค์ด์ ์ ๊ฐ์ ํ๊ณ , ํ์ ์์ ์ฑ์ ๋์ด๋ ์ผ๋ค์ด ํฌํจ๋์์ต๋๋ค.
์ด๋ฐ ์ด์ ๋ก ๊นํ๋ธ๋ GraphQL์ ๋์ ํ๊ณ , API ์ฌ์ฉ์ฑ์ ํฌ๊ฒ ์ฌ๋ฆด ์ ์์์ต๋๋ค. ๊นํ๋ธ์ ์ค์ GraphQL API๋ ๊ณต์ ๋ฌธ์์ GraphQL API ๋ฌธ์์์ ํ์ธํ ์ ์์ฃ . GraphQL ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํจ๊ป ์ดํด๋ณผ ์ ์๋ ๊ฐ์ด๋๋ ์ ๊ณตํ๊ณ ์์ต๋๋ค. GraphQL ๋์ ์ ๊ณ ๋ฏผํ๊ณ ์๋ค๋ฉด, ๊นํ๋ธ์ ์ฌ๋ก๋ฅผ ์ ์ดํด๋ณด๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ง์น๋ฉฐ
GraphQL์ ํ๋์ ์ธ API ๊ฐ๋ฐ์ ์์ด ์ค์ํ ๋๊ตฌ๋ก ์๋ฆฌ ์ก์์ต๋๋ค. ๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , API์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๋ฉฐ, ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๋ ์ฅ์ ์ผ๋ก ๋ง์ ๊ธฐ์ ์ ๊ด์ฌ์ ๋๊ณ ์์ต๋๋ค. GraphQL์ ์ฅ์ ์ ์ ์ดํดํ๊ณ ํ๋ก์ ํธ์ ํน์ฑ๊ณผ ์๊ตฌ์ฌํญ์ ๊ณ ๋ คํ์ฌ ์ ์ ํ ์ ํํด ๋ณด๋ ๊ฒ์ ์ด๋จ๊น์?
๋ถ๋ก: GraphQL์ ๊ด์ฌ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ฐธ๊ณ ์ฌ์ดํธ ๋ชจ์
GraphQL์ ๊ดํ ๊ฐ์ข ์ ๋ณด์ ์ปค๋ฎค๋ํฐ, ๋ธ๋ก๊ทธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- GraphQL๊ณผ ํจ๊ป ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๊ผฝ์ผ๋ผ๋ฉด ๋จ์ฐ ์๋ฐ์คํฌ๋ฆฝํธ(JavaScript) ํน์ ํ์ ์คํฌ๋ฆฝํธ(TypeScript)์ผ ๊ฒ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํ์ ์ธ ์น ์๋ฒ ํ๋ ์์ํฌ Nest.JS๋ ๊ณต์ GraphQL ๋ชจ๋๊ณผ ๊ฐ์ด๋, ํํ ๋ฆฌ์ผ ์์๊น์ง ์ ๊ณตํ๊ณ ์์ต๋๋ค.
- Amazon AppSync๋ GraphQL API๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํ๋ ์์ ๊ด๋ฆฌํ ์๋น์ค์ ๋๋ค.