๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Lect & Tip/node, Angular, React

๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ v5 ์—์„œ ๋ฐ”๋€ ์  react query v5

by ๋‚ฏ์„ ๊ณต๊ฐ„2019 2023. 11. 13.

๋ชฉ์ฐจ

    react query v5 ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ v5์˜ ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ

    ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ v5์—์„œ๋Š” ๋งŽ์€ ์ค‘์š”ํ•œ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด react query v5 ๋ณ€ํ™”๋“ค์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

    react query v5

    1. ๋‹จ์ผ ๊ฐ์ฒด ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ง€์›: ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” useQuery์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์ด TypeScript์—์„œ ๋‹ค์–‘ํ•œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ v5์—์„œ๋Š” ๊ฐ์ฒด ํ˜•์‹๋งŒ์„ ์ง€์›ํ•˜์—ฌ, ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹คใ€7ใ€‘.
    2. queryClient.getQueryData ๋ฐ queryClient.getQueryState ๋ณ€๊ฒฝ: ์ด์ œ ์ด ํ•จ์ˆ˜๋“ค์€ queryKey๋งŒ์„ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Š” API์˜ ์ผ๊ด€์„ฑ์„ ๋†’์ด๊ณ , ์‚ฌ์šฉ์˜ ๋‹จ์ˆœํ™”๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹คใ€8ใ€‘ใ€9ใ€‘.
    3. ์ฝ”๋“œ๋ชจ๋“œ ์ œ๊ณต: ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋Š” ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ œ๊ฑฐํ•˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋•๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๋ฒ„์ „์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คใ€9ใ€‘.
    4. ์ฝœ๋ฐฑ ์ œ๊ฑฐ: useQuery์™€ QueryObserver์—์„œ onSuccess, onError, onSettled์™€ ๊ฐ™์€ ์ฝœ๋ฐฑ์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” API๋ฅผ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜์ž…๋‹ˆ๋‹คใ€10ใ€‘.
    5. refetchInterval ์ฝœ๋ฐฑ ๋ณ€๊ฒฝ: ์ด์ œ refetchInterval ์ฝœ๋ฐฑ์€ query๋งŒ์„ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝœ๋ฐฑ ํ˜ธ์ถœ ๋ฐฉ์‹์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ , select์— ์˜ํ•ด ๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ดํ•‘ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹คใ€11ใ€‘.
    6. useQuery์—์„œ remove ๋ฉ”์†Œ๋“œ ์ œ๊ฑฐ: ์ด์ „์—๋Š” remove ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์บ์‹œ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ, ์ด์ œ๋Š” queryClient.removeQueries๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹คใ€12ใ€‘.
    7. ์ตœ์†Œ TypeScript ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ: v5์—์„œ๋Š” ์ตœ์†Œ TypeScript ๋ฒ„์ „์ด 4.7๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํƒ€์ž… ์ถ”๋ก ๊ณผ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ์ˆ˜์ • ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹คใ€13ใ€‘.
    8. useQuery์˜ isDataEqual ์˜ต์…˜ ์ œ๊ฑฐ: ์ด ์˜ต์…˜์€ ์ด์ „์— ์ฟผ๋ฆฌ์˜ ํ•ด๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋กœ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” structuralSharing์„ ํ†ตํ•ด ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คใ€14ใ€‘.
    9. ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๊ฑฐ ์ œ๊ฑฐ: v4์—์„œ ์ด๋ฏธ ํ๊ธฐ๋œ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๊ฑฐ ๊ธฐ๋Šฅ์ด ์ด์ œ ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹คใ€15ใ€‘.
    10. ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์—…๋ฐ์ดํŠธ: ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ชฉ๋ก์ด ์—…๋ฐ์ดํŠธ๋˜์–ด ๋” ํ˜„๋Œ€์ ์ด๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์€ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹คใ€16ใ€‘.
    11. ํ”„๋ผ์ด๋น— ํด๋ž˜์Šค ํ•„๋“œ ๋ฐ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ: ์ด์ œ ECMAScript์˜ ํ”„๋ผ์ด๋น— ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ๋กœ ํ”„๋ผ์ด๋น—ํ•œ ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹คใ€17ใ€‘.
    12. cacheTime์„ gcTime์œผ๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ: cacheTime์€ ์ฟผ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์ž‘๋™ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๊ฐ€ "๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜"๋  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹คใ€18ใ€‘.
    13. useErrorBoundary ์˜ต์…˜์˜ ์ด๋ฆ„์„ throwOnError๋กœ ๋ณ€๊ฒฝ: ์ด๋Š” useErrorBoundary ์˜ต์…˜์„ ๋” ํ”„๋ ˆ์ž„์›Œํฌ์— ์ค‘๋ฆฝ์ ์ด๋ฉฐ ์ง๊ด€์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด ์˜ต์…˜์€ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹คใ€19ใ€‘.
    14. TypeScript์—์„œ ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ํƒ€์ž… ๋ณ€๊ฒฝ: ์ด์ œ TypeScript์—์„œ error ํ•„๋“œ์˜ ๊ธฐ๋ณธ ํƒ€์ž…์€ unknown์ด ์•„๋‹Œ Error์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹คใ€20ใ€‘.
    15. eslint ๊ทœ์น™ ๋ณ€๊ฒฝ: ์ด์ œ ๊ฐ์ฒด ๊ตฌ๋ฌธ๋งŒ ์ง€์›๋˜๋ฏ€๋กœ eslint prefer-query-object-syntax ๊ทœ์น™์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹คใ€21ใ€‘.
    16. keepPreviousData ์˜ต์…˜ ์ œ๊ฑฐ: keepPreviousData ์˜ต์…˜๊ณผ isPreviousData ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ, ์ด์ œ placeholderData์™€ isPlaceholderData ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คใ€22ใ€‘.
    17. ์œˆ๋„์šฐ ํฌ์ปค์Šค ์žฌ์š”์ฒญ ๋ณ€๊ฒฝ: ์ด์ œ ์œˆ๋„์šฐ ํฌ์ปค์Šค ์žฌ์š”์ฒญ์€ focus ์ด๋ฒคํŠธ ๋Œ€์‹  visibilitychange ์ด๋ฒคํŠธ๋ฅผ ์ „์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๊ฐ€๋Šฅํ•ด์กŒ์œผ๋ฉฐ, ๊ด€๋ จ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹คใ€23ใ€‘.
    18. ๋„คํŠธ์›Œํฌ ์ƒํƒœ ํ™•์ธ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ: ์ด์ œ navigator.onLine ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , online๊ณผ offline ์ด๋ฒคํŠธ๋งŒ์„ ๋“ฃ์Šต๋‹ˆ๋‹ค. ์ด๋Š” navigator.onLine์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ , ๋” ์ •ํ™•ํ•œ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ํ™•์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹คใ€24ใ€‘.
    19. ์ปค์Šคํ…€ ์ปจํ…์ŠคํŠธ ํ”„๋กญ ์ œ๊ฑฐ: ์ด์ œ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ ํ›…์— ์ปค์Šคํ…€ context๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹ , ์ปค์Šคํ…€ queryClient ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ์ค‘๋ฆฝ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ ๊ฒฉ๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

    ์ด์™€ ๊ฐ™์€ ๋ณ€ํ™”๋“ค์€ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ v5๋ฅผ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋„๊ตฌ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ˆ™์ง€ํ•˜๊ณ  ์ ์ ˆํžˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

    ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์— ํฌํ•จ๋  ์ฃผ์š” ํ‚ค์›Œ๋“œ: ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ v5, TypeScript, ์ฝ”๋“œ๋ชจ๋“œ, useQuery, queryClient, API ๋ณ€๊ฒฝ, ํ”„๋ผ์ด๋น— ํด๋ž˜์Šค, ๋„คํŠธ์›Œํฌ ์ƒํƒœ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘๋ฆฝ์ , ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ.

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€