๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Front
Tanstack Query
04-GraphQL

1. GraphQL

React Query์˜ fetching ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ Promise์— ๋Œ€ํ•ด ๋ถˆ๊ฐ€์ง€๋ก ์ (agnostically)์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, GraphQL์„ ํฌํ•จํ•œ ์–ด๋–ค ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ fetching์ด๋“  ์™„์ „ํžˆ(literally, ๋ง ๊ทธ๋Œ€๋กœ) ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค!

cf. ๋ถˆ๊ฐ€์ง€๋ก 

  • ์•„๋‹ ๋ถˆ, ์˜ณ์„ ๊ฐ€, ์•Œ ์ง€, ๋…ผํ•œ ๋…ผ(๋ก )
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ๋ช…์ œ์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์—†๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ž…์žฅ์„ ์˜๋ฏธ
  • ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(fetching)๋ฅผ ๊ฐ€์ ธ์˜ฌ์ง€ ๋ชปํ• ์ง€์˜ ๋น„๋™๊ธฐ์  ์˜๋ฏธ๋กœ ํ•ด์„ํ•˜๋ฉด ๋จ

React Query๋Š” ํ‘œ์ค€ํ™”๋œ ์บ์‹ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ์„ ๋ช…์‹ฌํ•ด๋ผ. ๋Œ€๋‹ค์ˆ˜ ์‚ฌ์šฉ์ž๋Š” ์‹ค์ œ๋ก  ์ •๊ทœํ™”๋œ ์บ์‹œ๋‚˜, ๊ทธ๋“ค์ด ์ƒ๊ฐํ•œ ๋งŒํผ ์บ์‹œ์˜ ์žฅ์ ์ด ํ•„์š”์—†๋‹ค. ๋งค์šด ๋“œ๋ฌธ ์ƒํ™ฉ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋จผ์ € react-queryํŒ€์—๊ฒŒ ํ™•์ธํ•˜์—ฌ ํ•„์š”ํ•œ ์ œํ’ˆ์ธ์ง€ ํ™•์ธํ•ด๋ผ!


2. ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ ์ฝ”๋“œ ์ƒ์„ฑ(Generation)

React Query๋Š” (,graphql-request^5 ๋ฐ graphQL Code Generator๊ฐ€ ์กฐํ•ฉ๋œ) ๋ชจ๋“  ํƒ€์ž…์˜ GraphQL ๋™์ž‘์„ ์ œ๊ณตํ•œ๋‹ค:

1
import request from 'graphql-request'
2
import { useQuery } from '@tanstack/react-query'
3
4
import { graphql } from './gql/gql'
5
6
const allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `
7
query allFilmsWithVariablesQuery($first: Int!) {
8
allFilms(first: $first) {
9
edges {
10
node {
11
id
12
title
13
}
14
}
15
}
16
}
17
`)
18
19
function App() {
20
// `data` is fully typed!
21
const { data } = useQuery({
22
queryKey: ['films'],
23
queryFn: async () =>
24
request(
25
'https://swapi-graphql.netlify.app/.netlify/functions/index',
26
allFilmsWithVariablesQueryDocument,
27
// variables are type-checked too!
28
{ first: 10 },
29
),
30
})
31
// ...
32
}