Unit6 ํšŒ๊ณ 

YEN Jยท2022๋…„ 12์›” 1์ผ
0

code states

๋ชฉ๋ก ๋ณด๊ธฐ
39/43

[API]GraphQL

๐Ÿ”† GraphQL

GraphQL๐Ÿ“ˆ
: ํŽ˜์ด์Šค๋ถ์—์„œ ๊ฐœ๋ฐœํ•ด ์˜คํ”ˆ ์†Œ์Šค๋กœ ์ œ๊ณต๋œ ์ฟผ๋ฆฌ ์–ธ์–ด

  • Server API๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” Query Language
    โ†’ API๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ์–ธ์–ด
  • ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์–ธ์–ด
  • GraphQL์˜ ์ „์ œ
    • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค
      • ์ผ๋Œ€์ผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ด€๊ณ„๋‚˜ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ ๊ด€๊ณ„๋„ ๋ชจ๋‘ ํฌํ•จ
        (ํŠธ๋ฆฌ์™€ ๊ทธ๋ž˜ํ”„ ๋ชจ๋‘ ๋…ธ๋“œ์™€ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ!)
        โ†’ GraphQL์€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต์œผ๋กœ ์ „์†ก
  • GraphQL์˜ ํŠน์ง•
    • HTTP๋ฅผ ํ†ตํ•ด API ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์Œ
    • ์‘๋‹ต์„ ๋ฐ›์„ ์‹œ, ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ฐ›์Œ
    • ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ฐ ํ•„๋“œ์— ๋Œ€์‘ํ•˜๋Š” resolver ํ•จ์ˆ˜๋กœ ๊ฐ ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ
    • GraphQL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กฐํšŒ ๋Œ€์ƒ schema๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌ

๐Ÿ’ก GraphQL vs REST API

Rest API์˜ ํ•œ๊ณ„๐Ÿง

  • Overmatch: ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ œ๊ณต
    • ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ์‹œ ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๋กœ ๋ฐ›์•„์•ผ ๋จ
  • Underfetch: endpoint๊ฐ€ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ถฉ๋ถ„ํžˆ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•จ
    • ์—ฌ๋Ÿฌ resource์— ์ ‘๊ทผ ์‹œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ์— ๋ชจ๋‘ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•จ
  • ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์‹œ ์—”ํŠธํฌ์ธํŠธ ๋ณ€๊ฒฝ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด ํ•„์š”
    • ์ž์›์˜ ํฌ๊ธฐ์™€ ํ˜•ํƒœ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ ๊ฒฐ์ • ๋ถˆ๊ฐ€

Rest API์™€ GraphQL์˜ ์ฐจ์ด์ 

Rest APIGraphQL
Resource์— ๋Œ€ํ•œ ํ˜•ํƒœ ์ •์˜์™€ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ฐฉ๋ฒ• ์—ฐ๊ฒฐ ์—ฌ๋ถ€์—ฐ๊ฒฐ๋ถ„๋ฆฌ
Resource์˜ ํฌ๊ธฐ์™€ ํ˜•ํƒœ ๊ฒฐ์ •์„œ๋ฒ„์„œ๋ฒ„: Resource์— ๋Œ€ํ•œ ์ •๋ณด ์ •์˜
ํด๋ผ์ด์–ธํŠธ: ์š”์ฒญ ์‹œ ํ•„์š”ํ•œ ํฌ๊ธฐ์™€ ํ˜•ํƒœ ๊ฒฐ์ •
Resource์™€ ์ž‘์—… ์œ ํ˜• ๊ฒฐ์ • ๋ฐฉ๋ฒ•Resource: URI
์ž‘์—…์˜ ์œ ํ˜•: Method
Resource: GraphQL Schema
์ž‘์—…์˜ ์œ ํ˜•: Query, Mutation ํƒ€์ž…
์—ฌ๋Ÿฌ Resource์— ์ ‘๊ทผ ์‹œ ์š”์ฒญ ํšŸ์ˆ˜์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์š”์ฒญ ํ•„์š”ํ•œ ๋ฒˆ์˜ ์š”์ฒญ ํ•„์š”
์ž‘์—… ์ฒ˜๋ฆฌ ๋ฐฉ์‹ํ•ด๋‹น endpoint์— ์ •์˜๋œ ํ•ธ๋“ค๋ง ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ์š”์ฒญ ๋ฐ›์€ ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•œ resolver๋ฅผ ํ˜ธ์ถœ

GraphQL์˜ ์žฅ๋‹จ์ 

  • GraphQL์˜ ์žฅ์ ๐Ÿ˜Ž
    • ํ•˜๋‚˜์˜ endpoint ์š”์ฒญ
      • /graphql์ด๋ผ๋Š” ํ•˜๋‚˜์˜ endpoint๋กœ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์š”์ฒญ์— ๋”ฐ๋ผ query, mutation์„ resolverํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์š”์ฒญ์— ์‘๋‹ต
        • ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์€ POST ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
    • under&overfetchingโŒ
      • ํ•˜๋‚˜์˜ endpoint์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ API์— ์š”์ฒญ&์‘๋‹ต ๊ฐ€๋Šฅ
    • ๊ฐ•๋ ฅํ•œ playground
      • graphql ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ, playground๋ผ๋Š” GUI๋ฅผ ์ด์šฉํ•ด resolver์™€ schema๋ฅผ ํ•œ ๋ˆˆ์— ๋ณด๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
    • ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์—๋„ ์„œ๋ฒ„์— ์ง€์žฅ ์—†์Œ
  • GraphQL์˜ ๋‹จ์ ๐Ÿ˜…
    • REST API์— ์นœ์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž๋Š” ํ•™์Šตํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”
    • ์บ์‹ฑ์ด REST๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žก
      • ๊ฐ ๋ฉ”์†Œ๋“œ์— ๋”ฐ๋ฅธ ์บ์‹ฑ์„ ์ง€์›๋ฐ›์„ ์ˆ˜ ์—†์Œ
        โ†’ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Apollo ์—”์ง„์˜ ์บ์‹ฑ๊ณผ ์˜์† ์ฟผ๋ฆฌ ๋“ฑ์ด ๋“ฑ์žฅ
      • ๊ณ ์ •๋œ ์‘๋‹ต๋งŒ ํ•„์š”ํ•  ๊ฒฝ์šฐ Query๋กœ ์ธํ•ด ์š”์ฒญ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง

๐Ÿ”† GraphQL

GraphQL Keywords

  • Query
    : ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(REST API์˜ GET๊ณผ ์œ ์‚ฌ)
  • Mutation
    : ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•˜๊ธฐ
    • Create: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
    • Update: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ˆ˜์ •
    • Delete: ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ ์‚ญ์ œ
  • Subscription
    : ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์„œ๋ฒ„๊ฐ€ ๋Œ€์‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก
    • ๋ฐœํ–‰/๊ตฌ๋… ๋ชจ๋ธ์„ ๋”ฐ๋ฆ„
      • ์ด๋ฒคํŠธ ๊ตฌ๋… ์‹œ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์™€ WebSocket์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ํ˜•์„ฑํ•˜๊ณ  ์œ ์ง€
        โ†’ ๊ทธ ํ›„ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์„œ๋ฒ„๋Š” ๋Œ€์‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ํ‘ธ์‹œ

์ฟผ๋ฆฌ(query, ๋ฐ์ดํ„ฐ ์กฐํšŒ)

  • ํ•„๋“œ(Riled): ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์Šคํ‚ค๋งˆ์™€ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ
  • ์ „๋‹ฌ์ธ์ž(Arguments): ํ•„๋“œ์— ์ธ์ˆ˜ ์ „๋‹ฌ ์‹œ, ์ฟผ๋ฆฌ์˜ ํ•„๋“œ ๋ฐ ์ค‘์ฒฉ ๊ฐ์ฒด์— ์ „๋‹ฌํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Œ
  • ๋ณ„๋ช…(Aliases): ํ•„๋“œ ์ด๋ฆ„ ์ค‘๋ณต ์‚ฌ์šฉ ์‹œ, ๋ณ„๋ช…์„ ๋ถ™์—ฌ ์ฟผ๋ฆฌ
  • ์˜คํผ๋ ˆ์ด์…˜ ๋„ค์ž„(Operation name): ์˜คํผ๋ ˆ์ด์…˜ ํƒ€์ž…์— ๋งž๋Š” ์ด๋ฆ„์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉ
    • ์˜คํผ๋ ˆ์ด์…˜ ํƒ€์ž…: query, mutation, subscription, describes ๋“ฑ
  • ๋ณ€์ˆ˜(Varibles): ์ธ์ˆ˜๋“ค์„ ๋™์ ์œผ๋กœ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ
    • ์˜คํผ๋ ˆ์ด์…˜ ๋„ค์ž„ ์˜†์— $๋ณ€์ˆ˜ ์ด๋ฆ„: ํƒ€์ž… ํ˜•ํƒœ๋กœ ์ •์˜
    • !์€ optionalํ•œ ์‚ฌํ•ญ์œผ๋กœ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ํƒ€์ž… ํ˜•ํƒœ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ

๋ฎคํ…Œ์ด์…˜(mutation, ๋ฐ์ดํ„ฐ ์ˆ˜์ •)

  • ์„œ๋ฒ„ ์ธก ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์‹œ ์‚ฌ์šฉ
  • mutation์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •

์Šคํ‚ค๋งˆ/ํƒ€์ž…(Schema/Type)

  • ์Šค์นด๋งˆ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ
    • ์„œ๋น„์Šค์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ์ข…๋ฅ˜
    • ํฌํ•จํ•˜๋Š” ํ•„๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด ์œ ํ˜•

๋ฆฌ์กธ๋ฒ„(Resolver)

  • ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ฒฐ์ •ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
  • Query, Mutation, Subscription๊ณผ ๊ฐ™์€ ํƒ€์ž…์˜ ์‹ค์ œ ์ผํ•˜๋Š” ๋ฐฉ์‹(๋กœ์ง)์„ ์ž‘์„ฑ
    • ์Šคํ‚ค๋งˆ ์ •์˜ ์‹œ ์Šคํ‚ค๋งˆ ํ•„๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์˜ ์‹ค์ œ ํ–‰๋™์„ Resolver์—์„œ ์ •์˜

<์˜ค๋Š˜์˜ ์ผ๊ธฐ>
๋ชจ๋“  ์ผ์ด ๊ทธ๋ ‡์ง€๋งŒ(...ใ…Ž) ์„œ๋ฒ„ ์ธก์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์€ ํŠนํžˆ ๊ธด์žฅ๋˜๋Š” ์ผ์ธ ๊ฒƒ ๊ฐ™๋‹ค,,, ์ด๋ฒˆ ์œ ๋‹› ์—ญ์‹œ ์—ฌ๋Ÿฌ ์‹œํ–‰์ฐฉ์˜ค ๋์— GraphQL๋กœ github ์„œ๋ฒ„์—์„œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”๋ฐ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์—๋Š” ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด๋ณด๋Š” ๊ฒƒ์€ ์‹คํŒจํ–ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ง€์— ๋Œ€ํ•œ ์—ฐ์Šต์€ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์œผ๋กœ ์‹œ๋„ํ•ด๋ณด๋Š” ๊ฒƒ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€