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

Dependent Queries(์˜์กด์„ฑ ์ฟผ๋ฆฌ)

1. useQuery dependent Query

Dependent (or serial) query ์˜์กด์ (๋˜๋Š” ์ง๋ ฌ) query๋Š” ์ด์ „ query๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” enabled ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ, query๊ฐ€ ์‹คํ–‰ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์„ ๋•Œ๋ฅผ ์•Œ๋ ค์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1
// Get the user
2
const { data: user } = useQuery({
3
queryKey: ['user', email],
4
queryFn: getUserByEmail,
5
})
6
7
const userId = user?.id
8
9
// Then get the user's projects
10
const {
11
status,
12
fetchStatus,
13
data: projects,
14
} = useQuery({
15
queryKey: ['projects', userId],
16
queryFn: getProjectsByUser,
17
// The query will not execute until the userId exists
18
enabled: !!userId,
19
})

projects query๋Š” ๋‹ค์Œ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค:

1
status: 'pending'
2
isPending: true
3
fetchStatus: 'idle'

์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ์ฆ‰์‹œ, projects query๊ฐ€ enabled(ํ™œ์„ฑํ™”)๋˜๊ณ  ๊ทธ ํ›„์— ๋‹ค์Œ์œผ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค:

1
status: 'pending'
2
isPending: true
3
fetchStatus: 'fetching'

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ค€๋น„๋˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

1
status: 'success'
2
isPending: false
3
fetchStatus: 'idle'

2. useQuery ์ข…์† ์ฟผ๋ฆฌ

๋™์  parallel query - useQueries์— ์˜์กดํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1
// Get the users ids
2
const { data: userIds } = useQuery({
3
queryKey: ['users'],
4
queryFn: getUsersData,
5
select: users => users.map(user => user.id),
6
})
7
8
// Then get the users messages
9
const usersMessages = useQueries({
10
queries: userIds
11
? userIds.map(id => {
12
return {
13
queryKey: ['messages', id],
14
queryFn: () => getMessagesByUsers(id),
15
}
16
})
17
: [], // if users is undefined, an empty array will be returned
18
})

์ฐธ๊ณ ์‚ฌํ•ญ : useQueries๋Š” query ๊ฒฐ๊ณผ์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


3. ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ

์˜์กด์  query๋Š” ์ •์˜์ƒ ์š”์ฒญ ํญํฌ, request-waterfalls๋ฅผ ํ˜•์„ฑํ•˜๋ฉฐ, ์„ฑ๋Šฅ์— ํ•ด๋ฅผ ๋ผ์นฉ๋‹ˆ๋‹ค. ๋‘ query๊ฐ€ ๊ฐ™์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  ์ง๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋ฉด ํ•ญ์ƒ ๋‘ ๋ฐฐ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ธด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐœ์ƒํ•  ๋•Œ ํŠนํžˆ ํ•ด๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํ•ญ์ƒ ๋‘ query๋ฅผ ๋ณ‘๋ ฌ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ฐฑ์—”๋“œ API๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ, ํ•ญ์ƒ ์‹ค์šฉ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ getUserByEmail์„ ๋จผ์ € ๊ฐ€์ ธ์™€์„œ getProjectsByUser๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹ ์—, ์ƒˆ๋กœ์šด getProjectsByUserEmail ์ฟผ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด, ์š”์ฒญ ํญํฌ(waterfall)๋ฅผ ํ‰ํ‰ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.