
TanStack Query ๊ฐ๋ฐ ์ค ๋ง์ฃผ์น ๋ฒ๊ทธ ๊ฐ์ ํ๊ณ ๊ธฐ์ฌํ๊ธฐ1
ํ๋ก์ ํธ ๊ฐ๋ฐ ๋์ค ๋ง์ฃผ์น ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ํ๊ณ ๊ธฐ์ฌํ๋ ์ํผ์๋๋ฅผ ์ด์ผ๊ธฐํฉ๋๋ค.
๋ค์ด๊ฐ๋ฉฐ
TanStack Query์์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฅผ ๋นํ์ฑํ ํน์ ์ผ์์ ์ง๋ฅผ skipToken์ ํตํด์ ํ ์ ์๋๋ฐ์. useQueries์์ skipToken๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฐํ๋๋ ๋ฐ์ดํฐ๊ฐ unknown์ผ๋ก ํ์ ์ถ๋ก ์ด ์๋๋ ๋ฒ๊ทธ๊ฐ ์์์ต๋๋ค. ํด๋น ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ํ์ฌ ๊ธฐ์ฌํ๋ ๊ณผ์ ์ ์ด์ผ๊ธฐํ๊ณ ์ ํด์.
TanStack Query๋
ํ๋ก ํธ์๋ ๊ธฐ์ ์ ์์ TanStack Query(์์ ์ React Query๋ผ๊ณ ๋ถ๋ฌ์ก์ต๋๋ค.)๋ ๋ฐ์ดํฐ ํจ์น, ๋๊ธฐํ, ์ ๋ฐ์ดํธ ๋ฑ ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์์. ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๊ฐ์ ธ์ค๊ณ ์ด๋ฅผ ์บ์ฑํ๊ณ ์๋์ผ๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฑ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ด์. ํ๋ฐํธ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์์ฃผ ์น์ํ์ฃ .
skipToken์ ๋ญ๊ฐ์
์ฟผ๋ฆฌ๊ฐ ์๋์ผ๋ก ์คํ๋์ง ์๋๋ก ํ๋ ค๋ฉด enabled ์ต์ ์ด๋ skipToken์ ์ฌ์ฉํด์ผํด์. ํนํ skipToken์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฅผ ๋นํ์ฑํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํด์.
TanStack Query ๊ณต์ ๋ฌธ์์ ์๋ ์์ ๋ฅผ ๊ฐ์ ธ์๋๋ฐ์. ํํฐ๋ฅผ ์ ์ฉํ๋ฉด ์์ ์ ์ธํ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ผ์. ๋ฐ๋๋ก ํํฐ๊ฐ ์์ ๊ฒฝ์ฐ ํด๋น ์ฟผ๋ฆฌ๋ ๋นํ์ฑํ๋์ด ์คํ๋์ง ์์ต๋๋ค. ์กฐ๊ฑด์ผ๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌํ์ฌ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ๋นํ์ฑํํ๊ณ ์ ํ ๋ ์ฌ์ฉํด์.
๊ฐ๋ฐ ์ค ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๋ค
useQueries๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ์์์ด์. ๋์๋ฆฌ ๊ด๋ จ ํ๋ก์ ํธ์์ ์ผ์ ์ ์กฐํํ๋ ํ ์์ ์ด์์ง(์ด๋๋ฏผ)์ผ ๊ฒฝ์ฐ ์ด์์ง์๊ฒ๋ง ํ์ํ ์ผ์ ์ ๊ฐ์ด ์กฐํ๋๋ ํ ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ๊ฑฐ์์. ๋ฐํ๋ ์ด์์ง ์ผ์ ์ ๋ฐ์ดํฐ ํ์ ์ด unknown์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๋ค๋ฅธ ํ ์์๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ์๊ธด ๊ฒ์ ํ์ธํ๊ณ ๋๋ฒ๊น ํ ๊ฒฐ๊ณผ skipToken๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์๋๋ ๋ฌธ์ ์์ด์. ์ฒ์์๋ ์ ๊ฐ useQueries๋ฅผ ์๋ชป ์ฌ์ฉํ๊ณ ์๋ ๊ณต์ ๋ฌธ์๋ ํ์ธํด ๋ดค์ง๋ง ํด๊ฒฐํ ์ ์์์ฃ . ์ด ๋ฌธ์ ๊ฐ ๋ฒ๊ทธ์ธ ์ง๋ ๊นํ๋ธ(Github)์์ TanStack/Query ์ด์๋ฅผ ํตํด ํ์ ํ ์ ์์์ต๋๋ค.
๊ฐ๋ฐ ์ค ๋ง์ฃผ์น ๋ฌธ์ ๋ ๋ฒ๊ทธ์๋ค
useQuerirs์์ skipToken์ ์ฌ์ฉํ๋ฉด ์ ์์ ์ธ ํ์ ์ถ๋ก ์ด ์๋๋ ๋ฒ๊ทธ๋ 3์ 6์ผ ๊นํ๋ธ ์ด์๋ฅผ ํตํด ์ ๋ณด๋ ์ํ์์ด์. ์ ํ๊ฒฝ์์๋ง ๊ฒช๋ ๋ฌธ์ ๊ฐ ์๋์์ต๋๋ค.
ํด๋น ์ด์๋ฅผ ๋ณด์๋ง์ ๋ด๊ฐ ํ ๋ฒ ํด๊ฒฐํด ๋ด์ผ๊ฒ ๋ค๊ณ ์๊ฐ๋์๊ณ , ์ด์ ์ ์คํ์์ค์ ๊ธฐ์ฌํ ๊ธฐ์ต์ผ๋ก CONTRIBUTING.md๋ ์ดํด๋ดค์ด์. ์ด์ ์ ๊ธฐ์ฌํ๋ VitePress์ ํฌ๊ฒ ๋ค๋ฅธ ์ ์ด ์์๊ณ ๋ฐ๋ก ํฌํฌ(Fork)๋ฅผ ์งํํ์ฌ ํ๊ฒฝ ์ธํ ์ ํ์ต๋๋ค.
์์ฒญ๋ ์ฝ๋, ์ฝ์ง์ ์์
๋ก์ปฌ ํ๊ฒฝ์ ์ธํ ํ ์ฝ๋๋ฅผ ์ด์ด๋ณธ ์๊ฐ ๊น์ง ๋๋์ด์. ์์ฒญ๋ ์ฝ๋์ ์๊ณผ ํ๋ก์ ํธ ๊ท๋ชจโฆ ๋ชจ๋ ธ๋ ํฌ(Monorepo)๋ก ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Vue, Svelte, Solid, React, Angular)๋ก ๊ตฌ์ฑ๋์ด ์์์ด์.
์ฝ๋๋ฅผ ๋ณด์๋ง์ ์ด๋์๋ถํฐ ๋ณด๊ณ ์์ ํด์ผ ํ ์ง ๋ง๋งํ์ด์. ์ด๊ฒ ํฐ ๊ท๋ชจ์ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ตฌ๋๋ฅผ ๋๊ผ์ฃ . ์ผ๋จ ๋จผ์ useQueries๊ฐ ์ ์ธ๋์ด ์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ธฐ๋ก ํ์ด์. ํ์ ์ถ๋ก ์ด ์๋๋ ๋ฒ๊ทธ๋ ํ์ ์ถ๋ก ์ชฝ์ ์ดํด๋ณด๋ฉด ๋๊ฒ ์ง ํ๋ ๋ง์ฐํ ์๊ฐ์ด์์ด์. ์๋๋ ์์ฒญ๋ ๊ท๋ชจ์ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ ๋ง์ด์ฃ .
์ด๋ค๊ฐ์? ๋ณด์๋ง์ ์ฝ์ง ์๊ฒ ๋ค๋ ์๊ฐ์ด ์ ๋ก ๋ค์ฃ ? ์ฌ๊ธฐ๋ถํฐ ์ ์ ์ฝ์ง์ ์์๋์๋ต๋๋ค. useQueries๋ฅผ ์จ๋ณด๊ธฐ๋ง ํ์ง ๋ด๋ถ์ ์ธ ์ฝ๋๊ฐ ์ด๋ค ๋ฉ์ปค๋์ฆ์ผ๋ก ์๋ํ๊ณ ํ์ ์ ์ ์ธ๋์ด ์ถ๋ก ๋๋์ง๋ ๋ชจ๋ฅด๋ ์ ๊ฐ ํด๋น ์ด์๋ฅผ ํ ๋ฒ ๊ณ ์ณ๋ณด๊ฒ ๋ค๋ ๋ง์๊ฐ์ง์ผ๋ก ๋ฐค์ ์์ฐ๋ฉฐ ๋ถ์ํ์ต๋๋ค.
useQueries๋ฅผ ์ดํดํ๋ ค๋ฉด ๋จผ์ useQuery์ ๋ํด ์์์ผ ํ๊ณ ์ ์ธ๋ ํ์ ์ ์ด๋์ ๋ ์์งํด์ผ ํฉ๋๋ค. ํนํ ๋ด๋ถ์ ์ธ ํต์ฌ ์ฝ๋๋ useBaseQuery์ ์์ฑ๋์ด ์์ด์. ํด๋น ๋ถ๋ถ์ ์ค์ฌ์ผ๋ก ์ฝ๋๋ฅผ ๋ถ์ํ์ต๋๋ค. (ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ํด๋น ์ฝ๋๋ฅผ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒํด์, ํด๋น ์ฝ๋ ๋ถ์์ ์ฌ์ ๊ฐ ๋๋ค๋ฉด ๋ค์์ ๊ฒ์๊ธ๋ก ๋ค๋ค๋ณผ๊ฒ์.)
์ด๋ ์ ๋ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๋ฉ์ปค๋์ฆ์ ์ดํดํด๋ ํด๋น ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ ์ด์. ํ์ ์ถ๋ก ๊ด๋ จ์์๋ ํ์ ์คํฌ๋ฆฝํธ์ ๊ด๋ จ๋ ๋ฌธ์ ๊ธฐ๋ ํ๊ณ ์. ์์ ์๋ QueriesOptions๋ฟ๋ง ์๋๋ผ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ ์ถ๋ก ์ ํ๋GetUseQueryOptionsForUseQueries๋ ๋ถ์ํ๊ณ ์์ ํ๋ ์๋ง์ ์๋๋ฅผ ํ์ง๋ง ํด๊ฒฐํ๊ธฐ๋ ์ด๋ ค์ ์ด์.
ํด๊ฒฐํ ์ ์๋ ํฌ๋ง์ด ๋ณด์ด๋ค
ํด๋น ์ด์๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ๋ ์๋๋ ์ฌ๋ฌ ์ฐจ๋ก ์์์ต๋๋ค. as const๋ฅผ ํตํด ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ํ๊ฒ ๋๋ฉด ์ ์์ ์ผ๋ก ํ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ๋ค๋ ๋๊ธ(Comment)๊ฐ ์์๊ณ Jaaneek ๊ฐ๋ฐ์๋๊ป์ ํด๋น ์ด์๋ฅผ ๊ณ ์น PR(#7037)์ ๋ณด๋ธ ์ํ์์ต๋๋ค. ํ์ง๋ง ํด๋น PR์ Merge๊ฐ ์๋ Closed ์ํ์์ด์.
ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง solid/vue/svelte์ ์ ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์๋์ด ์ง๊ธ ์ข์ ํด๊ฒฐ ์ฑ ์ ์ฐพ์ ์ ์๋ค๋ ์ด์ ๋ก Closed ์ํ๊ฐ ๋ ๊ฒ์ด์์.
ํ์ง๋ง ์ ๋ ๊ธฐ์กด PR๊ณผ ๋๊ธ์์ ํํธ๋ฅผ ์ป์ ์ ์์์ต๋๋ค. as const, ์ฆ readonly ์ํ์ผ ๊ฒฝ์ฐ ์ ์์ ์ธ ํ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋ด๋ถ์ ์ผ๋ก readonly ์ํ๋ก ๋ง๋ค์ด์ ํ๋ฉด ๋์ง ์์๊น๋ผ๋ ์๊ฐ์ ๋ค์ ์๋ํด๋ณผ ์ ์์์ต๋๋ค.
ํ์ ์ถ๋ก ์์ readonly๋ก ์ ์ธ์ด ๊ฐ๋ฅํ ๋ถ๋ถ์ ์์ฐจ๋ ฅ์ผ๋ก ์ ๋ ฅํ์ฌ ํ ์คํธ ์ฝ๋์ ํจ๊ป ๋๋ฒ๊น ํ๋ฉฐ ์๋ํ ๋์ QueriesOptions์์ Array<unknown> extends T๋ฅผ ReadonlyArray<unknown> extends T๋ก readonly ํ์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด as const๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ ์์ ์ผ๋ก ์ถ๋ก ์ด ๋๋ ์ฌ์ค์ ํ์ธํ๊ฒ ๋์์ต๋๋ค. (ํ์ ์ถ๋ก ๊ณผ ๊ด๋ จํ์ฌ dev-tool์ด ์์ด ํ์ ์ถ๋ก ์ด ์ ์ ๋๋๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ฐจ๋ก๋๋ก ์์ ํ์ฌ ํ์ธํ๋ ๋ฐฉ๋ฒ ๋ฐ์ ์์์ด์. ๊ด๋ จํ์ฌ ์ข์ dev-tool์ด๋ ํ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.)
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๊ธฐ์กด์ Jaaneek ๊ฐ๋ฐ์๋์ PR ์ฝ๋์์๋ ํ์ธ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด์์. ๋ค๋ฅธ ์๋ง์ ์๋ฌ๊ฐ ๋ฐ์๋์ด Closed ๋์๋ค๋ ๋ฐฉ๋ฒ์ด์ฃ . ๊ทธ๋์ ์ ๋ RadonlyArray๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์๋๋ ์๋ฌ๋ฅผ ๊ณ ์น๋ ๋ฐฉํฅ์ผ๋ก ์๋ํ์ด์.
๋์๋ณด๋ฉด ๊ฐ๋จํ ๋ฌธ์
ReadonlyArray๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด 5๊ฐ ์ ๋ ํ์ ์ค๋ฅ๊ฐ ์ถ๊ฐ๋ก ๋ฐ์๋๋๋ฐ ์ด๋ ReadonlyArray๋ก ์ธํด ํ์ ์ง์ ์ด ์๋๋ ์๋ฌ์์ด์. ์ฐจ๋ก๋๋ก ํ์ ์ ์ ๋ค๋ฆญ์ผ๋ก ์ง์ ํ์ฌ ์ค๋ฅ๋ฅผ ๊ฐ์ ํด๋๊ฐ๋๋ฐ, ์ต์ข ์ ์ผ๋ก defaultedQueries์ ์๋ opts์ ํ์ ์ ์ง์ ํด์ฃผ๋ฉด ๋ค๋ฅธ ๋ชจ๋ ์๋ฌ๊ฐ ํด๊ฒฐ๋๋ ๋ฌธ์ ์์ด์.
์ต์ข ์ ์ผ๋ก ํด๋น ์ด์์ ๋ํ ํ ์คํธ ์ฝ๋๋ ์์ฑํ์ฌ ์ฌ์ ์ ์๋ฌ๋ฅผ ์๋ณํ๊ณ ์ ์ง๋ณด์ ์ฉ์ดํ๋๋ก ํ์์ต๋๋ค.
PR(#7150)์ ์์ฑํ๊ณ TanStack Query์ Maintainer์ธ TkDodo ๊ฐ๋ฐ์๋์ด ๋ค๋ฅธ ์ด๋ํฐ(Angular, Solid, Svelte, Vue)์๋ ์ ์ฉํ์ฌ ๋์ผํ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ํด๋ฌ๋ผ๋ ๋๊ธ์ด ๋ฌ๋ ค ์ถ๊ฐ๋ก ์ปค๋ฐํ์ฌ ํด๋น ์ด์๋ฅผ ์๋ฒฝํ ๊ฐ์ ํ ์ ์์์ด์. ๊ทธ ๋ค์ ๋ Merge ๋์ด TanStack Query์ Contributor๊ฐ ๋์ต๋๋ค. ๐
์ ๊ฐ ๊ฐ์ ํ ํ์ ์ถ๋ก ๋ฒ๊ทธ๋ v5.28.8์ ํฌํจ๋์ด ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์์ต๋๋ค.
๋ง์น๋ฉฐ
์ด๋ค ๋ฌธ์ ๋ ๋์๋ณด๋ฉด ์ฐธ ์ฌ์ด ๊ฑฐ ๊ฐ์์. ๊ทธ ๊ณผ์ ์์ ์๋ง์ ์ํ์ฐฉ์ค๊ฐ ์์๊ณ ๋ฐฐ์ฐ๋ ๊ฒ๋ ๋ง์๊ณ ์์ฒญ ์ด๋ ค์ ๋๋ฐ ๋ง์ด์ฃ . ํด๋น ์ด์๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์๋ ์ด๋ ค์์ด ๋ง์์ด์. ํ์ ์คํฌ๋ฆฝํธ์ ์ ํธ๋ฆฌํฐ ํ์ , any ํ์ ์์ ์ํ๋ ํ์ ์ผ๋ก ์ถ๋ก ํ๋ ๋ณต์กํ ๋ก์ง, ๋ด๋ถ์ ์ธ ์ดํด๋ ํ์ํ๊ณ ๋ณตํฉ์ ์ผ๋ก ๋ง์ ์ดํด๋๊ฐ ํ์ํ๋ ๊ฒฝํ์ด์์.
ํด๋น ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ํ๋ฉด์ ๊ธฐ์ ์ ์ผ๋ก ๋ฐฐ์ด ๊ฒ์ด ๋ง์์. useQuery์ ๋งค์ปค๋์ฆ ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์ฑ, ํ ์คํธ ์ฝ๋, NX CI ๋ฑ ๋ง์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ต์ํด์ง ์ ์์์ด์. ํ๊ณ ๊ธ์๋ ์ด ์๋ง์ ๊ณผ์ ์ด ๋ค์ด๊ฐ ์์ง ์์ง๋ง ์ด๋ฐ ์ฌ์ํ ๋ฒ๊ทธ๋ฅผ ๊ณ ์น๋ ๊ณผ์ ์์ ์๋ก์ด ๊ฒฝํ๊ณผ ๊ธฐ์ ์ ๋ฐฐ์ธ ์ ์์์ต๋๋ค. ์ด๊ฒ ์คํ์์ค ๊ธฐ์ฌ์ ์ฅ์ ์ธ ๊ฑฐ ๊ฐ์์.
์ฌ๋ฌ๋ถ๋ค๋ ์คํ์์ค ๊ธฐ์ฌ๋ฅผ ํตํด์ ๋ง์ ์ฑ์ฅ๊ณผ ์ฌ๊ณ ๋ฅผ ํ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. TanStack Query์ ๊ธฐ์ฌ์ ๊ด๋ จํ์ฌ ๊ถ๊ธํ์๊ฑฐ๋ ๊ด์ฌ์ด ์์ผ์๋ค๋ฉด ์ฐ๋ฝ ์ฃผ์๋ฉด ์ต๋ํ ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.