avatar
Published on

GraphQL ์‹œ์ž‘ํ•˜๊ธฐ ๐Ÿ”ฅ

Authors
  • avatar
    Name
    Haneul
    Twitter

GraphQL

GraphQL ์ด๋ž€ ?

Graph QL(์ดํ•˜ gql)์€ Structed Query Language(์ดํ•˜ sql)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ gql๊ณผ sql์˜ ์–ธ์–ด์  ๊ตฌ์กฐ ์ฐจ์ด๋Š” ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. ๋˜ํ•œ gql๊ณผ sql์ด ์‹ค์ „์—์„œ ์“ฐ์ด๋Š” ๋ฐฉ์‹์˜ ์ฐจ์ด๋„ ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. gql๊ณผ sql์˜ ์–ธ์–ด์  ๊ตฌ์กฐ ์ฐจ์ด๊ฐ€ ํ™œ์šฉ ์ธก๋ฉด์—์„œ์˜ ์ฐจ์ด๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์ด ๋‘˜์€ ์• ์ดˆ์— ํƒ„์ƒ ์‹œ๊ธฐ๋„ ๋‹ค๋ฅด๊ณ  ๋ฐฐ๊ฒฝ๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. sql์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๊ณ , gql์€ ์›น ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. sql์˜ ๋ฌธ์žฅ(statement)์€ ์ฃผ๋กœ ๋ฐฑ์•ค๋“œ ์‹œ์Šคํ…œ์—์„œ ์ž‘์„ฑํ•˜๊ณ  ํ˜ธ์ถœ ํ•˜๋Š” ๋ฐ˜๋ฉด, gql์˜ ๋ฌธ์žฅ์€ ์ฃผ๋กœ ํด๋ผ์ด์–ธํŠธ ์‹œ์Šคํ…œ์—์„œ ์ž‘์„ฑํ•˜๊ณ  ํ˜ธ์ถœ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜

npm init
npm install graphql --save

์‚ฌ์šฉ

query

  • ๋ฐ์ดํ„ฐ ์กฐํšŒ. ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•˜์—ฌ ๋”ฑ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ fetching ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— overfetch ํ˜น์€ underfetch ๋ฅผ ํ•  ๊ฑฑ์ •์„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Overfetching : ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋‹ค ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ Underfetching : endpoint๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋œ ๋ฐ›์•„์™€์„œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋‚ ๋ฆฌ๋Š” ๊ฒƒ

query {
  getOrders(input: {
    status: Pending
  }) {
    ok

  }
}

mutation

  • ๋ฐ์ดํ„ฐ ์กฐ์ž‘. ์ฟผ๋ฆฌ ํ•„๋“œ๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ ๋ฎคํ…Œ์ด์…˜ ํ•„๋“œ๋Š” ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค.
mutation {
  createOrder(input: {
    restaurantId: 2,
    items:[
      {
        dishId:9
        options: [
          {
            name: "spicy level",
            choice: "little"
          },
          {
            name: "Pickle",
          }
        ]
      }
    ]
  }) {
    ok
    error
  }
}

subscription

  • ์‹ค์‹œ๊ฐ„ ํ†ต์‹ . ๊ตฌ๋…/๋ฐœํ–‰ ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ WebSocket์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ตฌ๋…์„ ํ†ตํ•ด ํŠน์ •ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค.
subscription {
  hotPotatos
}

REST API VS GraphQL

REST API๋Š” URL, METHOD๋“ฑ์„ ์กฐํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ Endpoint๊ฐ€ ์กด์žฌ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, gql์€ ๋‹จ ํ•˜๋‚˜์˜ Endpoint๊ฐ€ ์กด์žฌ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, gql API์—์„œ๋Š” ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ์ฟผ๋ฆฌ ์กฐํ•ฉ์„ ํ†ตํ•ด์„œ ๊ฒฐ์ • ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, REST API์—์„œ๋Š” ๊ฐ Endpoint๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL ์ฟผ๋ฆฌ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ฐ˜๋ฉด, gql API๋Š” gql ์Šคํ‚ค๋งˆ์˜ ํƒ€์ž…๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL ์ฟผ๋ฆฌ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ฐธ๊ณ : https://tech.kakao.com/2019/08/01/graphql-basic/, ๊ณต์‹๋ฌธ์„œ, ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ, ํŠœํ† ๋ฆฌ์–ผ์‚ฌ์ดํŠธ