refactor jotai tan stack query - boostcampwm-2022/web33-Mildo GitHub Wiki

โœ‚๏ธ ๋ถ„๋ฐฐ๋œ ์ด์Šˆ

Jotai์˜ TanStack Query๋ฅผ ์„ค์ •ํ•ด๋ณด๊ณ , ์„ฑ๋Šฅ ๊ฐœ์„  ํ™•์ธํ•ด๋ณด๊ธฐ (#79)

๐Ÿšฉ ๊ตฌํ˜„ ๋ชฉํ‘œ

์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ์ „์˜ ์ƒํƒœ๋ฅผ ์บก์ณํ•˜๊ณ (React Query๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ), Jotai์˜ TanStack Query๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณธ ๋’ค, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํšจ์œจ์  ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋Š” ์ง€์— ๋Œ€ํ•ด ํ‰๊ฐ€ํ•ด๋ณด๊ณ  ๋ถ„์„ํ•œ๋‹ค.

  • Jotai๋ฅผ ์ด์šฉํ•œ ์บ์‹ฑ ์ •์ฑ…๊ณผ React Query๋Š” ๊ฐ๊ฐ ์–ด๋–ค ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์„๊นŒ? ์ผ๋‹จ์€ ์ด์— ๋Œ€ํ•ด์„œ ๋ฉด๋ฐ€ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • ๋ถ„์„์„ ํ•ด๋ณธ ๊ฒฐ๊ณผ, ์• ์ดˆ์— Jotai ๋‚ด๋ถ€์—์„œ TanStack Query๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. TanStack Query๋Š” React Query์˜ ์ตœ์‹  ๋ฒ„์ „์„ ํ†ต์นญํ•˜๋Š” ๋ง๋กœ ์“ฐ์ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Jotai์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” TanStack Query Tool์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด Tool์„ ์ด์šฉํ•ด์„œ React Query์™€ Jotai๋ฅผ ํ†ตํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด ์กด์žฌํ•œ๋‹ค.

ํ˜„์žฌ React Query๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉํ•˜๊ณ ๋Š” ์žˆ์ง€๋งŒ, ์•„์ง ์ ์šฉ์ด ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ถ€๋ถ„์„ Jotai์˜ tanstack-query๋ฅผ ํ†ตํ•ด ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ•  ๊ณ„ํš์ด๋‹ค.

๐Ÿ€ ์„ธ๋ถ€ ๋ชฉํ‘œ

<์ ์šฉ ์ „>

  • ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์˜ ํ˜„์žฌ ์ƒํƒœ์— ๋Œ€ํ•ด ์ธก์ •ํ•ด๋ณด๊ณ , ์ด๋ฅผ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ๊ธฐ๋กํ•ด๋ณธ๋‹ค.
  • jotai์˜ TanStack Query์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ํ•™์Šตํ•ด๋ณธ๋‹ค.

<์ ์šฉ ๊ณผ์ •>

  • atomsWithQuery๋ฅผ ์ ์šฉํ•˜์—ฌ jotai ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ

<์ ์šฉ ํ›„>

๐Ÿ–ฅ๏ธ ๊ตฌํ˜„ ๋‚ด์šฉ

์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์˜ ์ƒํƒœ ๋ณด๊ณ ์„œ ์ธก์ •ํ•˜๊ธฐ

https://ifh.cc/g/LH0YjW.jpg

๋„คํŠธ์›Œํฌ ์ƒํƒœ ๋ณด๊ณ ์„œ (์ ์šฉ ์ „ - ์ œํ•œ ์—†์Œ, ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ƒํƒœ)

  • ์•ฝ 2.28์ดˆ๋งŒ์— ์™„๋ฃŒ๊ฐ€ ๋˜์—ˆ์Œ
  • DOMContentLoaded ์‹œ๊ฐ„: 146 ๋ฐ€๋ฆฌ์ดˆ
  • ๋กœ๋“œ๋˜๋Š” ์‹œ๊ฐ„: 257 ๋ฐ€๋ฆฌ์ดˆ

https://ifh.cc/g/n7VAaF.jpg

๋„คํŠธ์›Œํฌ ์ƒํƒœ ๋ณด๊ณ ์„œ (์ ์šฉ ์ „ - ๋น ๋ฅธ 3G, ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ƒํƒœ)

  • ์•ฝ 3.36์ดˆ๋งŒ์— ์™„๋ฃŒ๊ฐ€ ๋˜์—ˆ์Œ
  • DOMContentLoaded ์‹œ๊ฐ„: 1.22์ดˆ
  • ๋กœ๋“œ๋˜๋Š” ์‹œ๊ฐ„: 257 ๋ฐ€๋ฆฌ์ดˆ

๋ณธ๊ฒฉ์ ์œผ๋กœ Jotai TanStack Query ์ ์šฉํ•ด๋ณด๊ธฐ

https://ifh.cc/g/CON59b.png

  • ์ด๋ฆฌ์ €๋ฆฌ ์กฐ์‚ฌํ•ด ๋ณธ ๊ฒฐ๊ณผ React Query์˜ useQuery๋ฅผ ํ™œ์šฉํ•œ โ€˜atomsWithQueryโ€™์™€ useMutation์„ ํ™œ์šฉํ•œ โ€˜atomsWithMutationโ€™์„ ํ†ตํ•ด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ/์‚ญ์ œํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จ๋˜์—ˆ๋‹ค.

๐Ÿ“– ํ•™์Šต ๋‚ด์šฉ

React-Query๋ž€ ๋ฌด์—‡์ผ๊นŒ?

  • **์„œ๋ฒ„ ๋ฐ์ดํ„ฐ์™€ ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ๋ฅผ โ€˜๋ถ„๋ฆฌโ€™**ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ์— React-Query๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ์ด๋ฏธ ํŒจ์น˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ํŒจ์น˜๋˜๊ธฐ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค ์ฐธ๊ณ  ์ž๋ฃŒ
  • React-Query๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ์™€ ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ๋ฅผ โ€˜๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹คโ€™.
  • โ€˜์บ์‹ฑโ€™์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • get์„ ํ•œ ๋ฐ์ดํ„ฐ์— update๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์‹œ get์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๋ž˜๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จ์ด ๋œ๋‹ค๋ฉด **get ( invalidateQueries )**๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค.

React-Query์˜ useMutation์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ? ์ด๋ฅผ Jotai์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?

  • useQuery๊ฐ€ GET์„ ๋‹ด๋‹นํ•œ๋‹ค๋ฉด, useMutation์€ POST, PUT, DELETE๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, jotai์—์„œ๋Š” ์ด๋ฅผ โ€˜****atomsWithMutation'****์„ ์‚ฌ์šฉํ•ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ TanStack Query๋„ atomsWithMutation ๋‚ด๋ถ€์— ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ฒŒ ์ƒ๊ด€์€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ, ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์“ฐ์ด์ง€ ์•Š๊ฒ ์ง€๋งŒ, **[atomsWithInfiniteQuery](https://jotai.org/docs/integrations/query#) ๋ฅผ ํ†ตํ•ด ๋ฌดํ•œ ์Šคํฌ๋กค๋ง์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿฉบ ์˜์‚ฌ๊ฒฐ์ •

  • ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์„ ๊ฑท์–ด๋‚ด์„œ atomsWithQuery๋‚˜ atomsWithMutation์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

https://ifh.cc/g/jKdmXd.png

  • ํ˜„์žฌ, atom ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ Atom๋“ค์ด ๋“ค์–ด์žˆ๋‹ค. ์ด๋“ค ์ค‘์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐํ™”๋ฅผ ์‹œ์ผœ์ฃผ๋Š” Atom ๋˜ํ•œ ์กด์žฌํ•œ๋‹ค. atomsWithQuery๋‚˜ atomsWithMutation์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด โ€˜๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ƒํƒœ๊ฐ’ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ ๋ฒˆ์— ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹คโ€™๋Š” ์žฅ์ ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค.

๐Ÿšง Trouble Shooting

  • Jotai์—์„œ ์ œ๊ณตํ•˜๋Š” atomsWithQuery, atomsWithInfiniteQuery, atomsWithMutation์€ React Query๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ™•์žฅ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋‚˜์ค‘์—์•ผ ์•Œ์•˜๋‹ค. ์ด๋Š” ๋‹ค์‹œ ๋งํ•ด, React-Query๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.
    • ๊ทธ๋žฌ๊ธฐ์— ํ˜„์žฌ React Query๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ณณ์—์„œ ์‹คํ—˜์„ ํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์ƒˆ๋กญ๊ฒŒ branch๋ฅผ ํŒŒ๊ณ , atomsWithQuery๋ฅผ ์ ์šฉํ•˜๊ณ ์ž ํ–ˆ์œผ๋‚˜, ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์—ˆ๊ณ , ์˜์กด์„ฑ์ด ์–ผ๊ธฐ์„ค๊ธฐ ์„ค์ผœ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ์–ด๋ ค์›€ โ†’ โ†’ ๋“ค์ด๋Š” ๋…ธ๋ ฅ์— ๋น„ํ•ด์„œ ์†Œ๋“์ด ์—†์„ ๊ฑฐ ๊ฐ™์•„ ์ผ๋‹จ ๋ณด๋ฅ˜ ์ค‘
โš ๏ธ **GitHub.com Fallback** โš ๏ธ