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

Parallel Queries(๋ณ‘๋ ฌ ์ฟผ๋ฆฌ)

โ€œ๋ณ‘๋ ฌโ€ ์ฟผ๋ฆฌ๋Š” fetching ๋™์‹œ์„ฑ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ‘๋ ฌ๋กœ ๋˜๋Š” ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

1. Manual(์ˆ˜๋™) Parallel Queries

๋ณ‘๋ ฌ ์ฟผ๋ฆฌ์˜ ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. TanStack Query์˜ useQuery ๋ฐ useInfiniteQuery ํ›…์„ ๋‚˜๋ž€ํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!

1
unction App () {
2
// The following queries will execute in parallel
3
const usersQuery = useQuery({ queryKey: ['users'], queryFn: fetchUsers })
4
const teamsQuery = useQuery({ queryKey: ['teams'], queryFn: fetchTeams })
5
const projectsQuery = useQuery({ queryKey: ['projects'], queryFn: fetchProjects })
6
...
7
}

React Query๋ฅผ suspense ๋ชจ๋“œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ, ๋ณ‘๋ ฌ์„ฑ(parallelism)์˜ ์ด ํŒจํ„ด์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ query๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ throwํ•˜๊ณ , ๋‹ค๋ฅธ query๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—, ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”(To get around this), useSuspenseQueries ํ›…์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ (๊ถŒ์žฅ๋จ)
๊ฐ useSuspenseQuery ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ๋ณ‘๋ ฌ์„ฑ์„ ์กฐ์œจํ•ด์•ผ ํ•œ๋‹ค.


2. Dynamic(๋™์ ) Parallel Queries with useQueries

๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” query์˜ ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ, ์ˆ˜๋™(manual) query๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋Š” ํ›…์˜ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  TanStack Query๋Š” (์›ํ•˜๋Š” ๋งŒํผ ๋™์ ์œผ๋กœ ๋ณ‘๋ ฌ๋กœ ๋งŽ์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”) useQueries ํ›…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

useQueries๋Š” (queries ํ‚ค์˜ ๊ฐ’์œผ๋กœ query ๊ฐ์ฒด์˜ ๋ฐฐ์—ด์„ ๊ฐ€์ง€๋Š”) ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Š” query ๊ฒฐ๊ณผ์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

1
function App({ users }) {
2
const userQueries = useQueries({
3
queries: users.map(user => {
4
return {
5
queryKey: ['user', user.id],
6
queryFn: () => fetchUserById(user.id),
7
}
8
}),
9
})
10
}