createQueryKeys
createQueryKeys๋ TanStack Query (React Query)์ ๊ณต์ ๊ธฐ๋ฅ์ด ์๋๋ผ, ์ปค๋ฎค๋ํฐ์์ ๋ง๋ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ @lukemorales/query-key-factory ํจํค์ง์ ํจ์์
๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ๊ณผ ๋ชฉ์
์ด ํจ์๋ ํ์
์ธ์ดํ(Type-safe)ํ๊ณ ๊ตฌ์กฐํ๋ Query Key Factory๋ฅผ ๋ง๋ค์ด์ค๋๋ค. TanStack Query์์ queryKey๋ฅผ ์ง์ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๋ค ๋ณด๋ฉด ์๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋์ด์.
- ํค ์คํ ๋ฐ์
- invalidateQueries ํ ๋ ํค๋ฅผ ์๋ชป ๊ธฐ์ต
- ํ์ ์ถ๋ก ์ด ์ฝํจ
- ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ํค ๊ด๋ฆฌ ์ด๋ ค์
import { createQueryKeys } from '@lukemorales/query-key-factory';
export const taskQueries = createQueryKeys('task', {
// ๊ธฐ๋ณธ ํค (parent key)
all: null, // _def: ['task']
// ์์ธ ์กฐํ
detail: (taskId: string) => ({
queryKey: [taskId], // ์ค์ ํค: ['task', 'detail', taskId]
// queryFn๋ ๊ฐ์ด ์ ์ ๊ฐ๋ฅ
// queryFn: () => fetchTask(taskId),
}),
// ๋ฆฌ์คํธ
list: (filters?: TaskFilters) => ({
queryKey: filters ? [{ filters }] : [],
}),
});createQueryKeys ์์ task ์ด๊ฒ์ด ๋ถ๋ชจํค์ด๊ณ , ๋๋จธ์ง ์๋ detail, list ๋ฑ๋ฑ createQueryKeys ์์ ๋ชจ๋ api ํต์ ์ฌ์ฉ ํค๊ฐ ์กด์ฌ ํฉ๋๋ค.
๋ถ๋ชจํค๋ฅผ ์
๋ฐ์ดํธ ํ๋ฉด ํ์ ์ฟผ๋ฆฌ๊ฐ ๋ค ์
๋ฐ์ดํธ ๋ฉ๋๋ค. createQueryKeys๋ฅผ ์ฐ๋ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋๊ฐ ๋ฐ๋ก ๋ถ๋ชจ ํค(parent key)๋ง ๋ฌดํจํ(invalidate)ํ๋ฉด ๊ทธ ์๋ ๋ชจ๋ ํ์ ์ฟผ๋ฆฌ๊ฐ ์๋์ผ๋ก ๋ฆฌํจ์น(refetch)๋๋๋ก ๋ง๋๋ ๊ฒ์
๋๋ค.
์ ์ฒด ๊ณต์ง ๊ด๋ จ ๋ถ๋ชจ ํค
all: null, // _def: ['task']
noticeQueries.detail('123')
// โ { queryKey: ['task', 'detail', '123'] }
noticeQueries.all
// โ { _def: ['task'] } // invalidateํ ๋ ๋ถ๋ชจ ํค๋ก ์ ์ฉ
queryClient.invalidateQueries({
queryKey: noticeQueries.all._def, // ['task'] ์ ์ฒด ๋ฌดํจํ
});
// ๋๋ ๋ถ๋ถ ๋ฌดํจํ
queryClient.invalidateQueries({
queryKey: noticeQueries.detail()._def, // ['task', 'detail']
});