Skip to content

[React] GraphQL, axios

Kim Hyewon edited this page Jun 14, 2022 · 4 revisions

GraphQL

What's GraphQL?

  • ์š”์ฒญํ•˜๋Š” data๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ๊ธฐ์ˆ ํ•˜๋Š” ์ฟผ๋ฆฌ. POST๋กœ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋‹ด์•„ ํ•œ ์‘๋‹ต์œผ๋กœ ๋Œ๋ ค์คŒ.
  • request์˜ body๋ถ€๋ถ„์— ์–ด๋–ค ์š”์ฒญ์„ ํ•˜๋Š”๊ฐ€์— ๋”ฐ๋ผ ์ˆ˜์ •, ์‚ญ์ œ ์š”์ฒญ๋„ ๊ฐ€๋Šฅ ๋ชจ๋‘ POST๋กœ ์š”์ฒญํ•จ.

GraphQL query ์˜ˆ์‹œ

์—ฌ๋Ÿฌ depth์˜ ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ request๋กœ ์š”์ฒญ ๊ฐ€๋Šฅ

query findRepos($login: String!) {
  user(login: $login) { //๋ณ€์ˆ˜ $login์€ ์š”์ฒญํ• ๋•Œ ๋‹ด์•„์„œ ๋ณด๋ƒ„
    id
    login
    name
    location
    avatar_url: avatarUrl //๊ฐ€์ ธ์˜ค๋Š” data alias๋„ ๊ฐ€๋Šฅ
    repositories(first: 100) {
      totalCount
      nodes {
        name
      }
    }
  }
}

GraphQL response ์˜ˆ์‹œ

GraphQL์€ query๋กœ ์š”์ฒญํ•œ ์ •๋ณด๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

{
  "data": {
    "user": {
      "id": "MDQ6VXNlcjc5NTkyNjA0",
      "login": "hyew-kim",
      "name": "Kim Hyewon",
      "location": null,
      "avatar_url": "https://avatars.githubusercontent.com/u/79592604?u=9cf807612ce5121bb2018cb4a85b3ff599357128&v=4",
      "repositories": {
        "totalCount": 33,
        "nodes": [
          {
            "name": "prgrms-fejs"
          },
          {
            "name": "42_piscine"
          },
          {
            "name": "printf"
          }, ...
       ]}
     }
   }
}

Axios

What's Axios?

  • Promise ๊ธฐ๋ฐ˜์˜ HTTP ๋น„๋™๊ธฐ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, HTTP method๋ชจ๋‘ ์ง€์›
  • ์ธ์Šคํ„ด์Šค ์ปค์Šคํ…€ ์„ค์ • ๊ฐ€๋Šฅ
  • ์š”์ฒญ ์ทจ์†Œ ๋ฐ ํƒ€์ž„์•„์›ƒ ์„ค์ • ๊ฐ€๋Šฅ

์‚ฌ์šฉ๋ฒ•

body๊ฐ€ ์•„๋‹Œ data์†์„ฑ ์‚ฌ์šฉ

  • axios.get(url,[,config])
  • axios.post(url[,data[,config]])
  • axios.delete(URL,[,config])
  • axios.put(url[, data[, config]])

response

์ž๋™์œผ๋กœ JSONํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด response๊ฐ€ ์˜จ๋‹ค. status๊ฐ€ 200์ด๊ณ  statusText๊ฐ€ โ€˜OKโ€™์ด๋ฉด ์„ฑ๊ณต์ด๋‹ค.

{
  // `data`๋Š” ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•œ ์‘๋‹ต(๋ฐ์ดํ„ฐ)์ž…๋‹ˆ๋‹ค.
  data: {},

  // `status`๋Š” ์„œ๋ฒ„ ์‘๋‹ต์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
  status: 200,

  // `statusText`๋Š” ์„œ๋ฒ„ ์‘๋‹ต์œผ๋กœ ๋ถ€ํ„ฐ์˜ HTTP ์ƒํƒœ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.
  statusText: 'OK',

  // `headers` ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต ํ•œ ํ—ค๋”๋Š” ๋ชจ๋“  ํ—ค๋” ์ด๋ฆ„์ด ์†Œ๋ฌธ์ž๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  headers: {},

  // `config`๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด `axios`์— ์„ค์ •๋œ ๊ตฌ์„ฑ(config)์ž…๋‹ˆ๋‹ค.
  config: {},

  // `request`๋Š” ์‘๋‹ต์„ ์ƒ์„ฑํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.
  // ๋ธŒ๋ผ์šฐ์ €: XMLHttpRequest ์ธ์Šคํ„ด์Šค
  // Node.js: ClientRequest ์ธ์Šคํ„ด์Šค(๋ฆฌ๋””๋ ‰์…˜)
  request: {}
}

์ฐธ๊ณ  ์ž๋ฃŒ