Web Development/JAVASCRIPT

์ƒํƒœ๊ด€๋ฆฌ [5ํŽธ]: Redux, Zustand, Tanstack Query — ์–ธ์ œ, ๋ฌด์—‡์„ ์จ์•ผ ํ• ๊นŒ?

devflate 2025. 3. 22. 16:08

๐Ÿง  ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ, ์™œ ์ด๋ ‡๊ฒŒ ๋งŽ์„๊นŒ?

ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด "์ด๊ฑด Redux๋กœ?" "Zustand๊ฐ€ ๋” ์‰ฝ์ง€ ์•Š๋‚˜?" ๊ฐ™์€ ๊ณ ๋ฏผ์ด ์ƒ๊น๋‹ˆ๋‹ค.
๊ฒŒ๋‹ค๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ฉด Tanstack Query๋„ ์จ์•ผ ํ•œ๋‹ค๊ณ ? ๐Ÿ˜ต‍๐Ÿ’ซ

1. ๋„๋Œ€์ฒด ์ด ๋„๊ตฌ๋“ค์€ ๊ฐ๊ฐ ๋ญ˜ ํ•˜๋Š” ๊ฑด๊ฐ€์š”?

ํ•ญ๋ชฉ Redux Zustand Tanstack Query
์ฃผ ์—ญํ•  ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ„ํŽธํ•œ ์ „์—ญ ์ƒํƒœ ๊ณต์œ  ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ (fetch, cache ๋“ฑ)
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ thunk, saga ๋“ฑ ์™ธ๋ถ€ ๋„๊ตฌ ํ•„์š” fetch ์ง์ ‘ ์‚ฌ์šฉ ๋‚ด์žฅ๋œ ์ž๋™ ์ฒ˜๋ฆฌ
์บ์‹ฑ ์ง์ ‘ ๊ตฌํ˜„ ์ง์ ‘ ๊ตฌํ˜„ ๊ธฐ๋ณธ ์ œ๊ณต
optimistic UI ์ˆ˜๋™ ๊ตฌํ˜„ ์ˆ˜๋™ ๊ตฌํ˜„ ์ง€์›
๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๋งŽ์Œ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์  ์„œ๋ฒ„ ์ƒํƒœ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”
์ฃผ์š” ์˜ˆ์‹œ ๋กœ๊ทธ์ธ, UI ์ƒํƒœ ๋ชจ๋‹ฌ, ๋‹คํฌ๋ชจ๋“œ ๊ฒŒ์‹œ๋ฌผ, ์œ ์ € ์ •๋ณด

 

2. ์˜ˆ์ œ๋กœ ๋ณด๋ฉด ๋” ์‰ฝ๊ฒŒ ์ดํ•ด๋จ

๐Ÿ” ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” 3๊ฐ€์ง€ ๋ฐฉ์‹

โ‘  Tanstack Query (์ž๋™ ์บ์‹ฑ, ๋ฆฌํŒจ์น˜, ๋กœ๋”ฉ/์—๋Ÿฌ ์ƒํƒœ ๊ด€๋ฆฌ)

const { data: user } = useQuery(['user'], fetchUser);

โ‘ก Redux (thunk, ๋กœ๋”ฉ/์—๋Ÿฌ ์ƒํƒœ ์ง์ ‘ ๊ตฌํ˜„ ํ•„์š”)

// useEffect ๋‚ด๋ถ€์—์„œ dispatch(fetchUser())
const user = useSelector(state => state.user);

โ‘ข Zustand (๊ฐ„๋‹จํ•˜์ง€๋งŒ ์บ์‹ฑ/๋กœ๋”ฉ ์ง์ ‘ ์ฒ˜๋ฆฌ)

const user = useUserStore((s) => s.user);
useEffect(() => {
  fetch('/api/user')
    .then(res => res.json())
    .then(setUser);
}, []);

 

3. ์–ธ์ œ ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ• ๊นŒ?

์„œ๋ฒ„์™€ ํ†ต์‹ ํ•œ ๋ฐ์ดํ„ฐ๋Š” Tanstack Query, UI ์ƒํƒœ๋Š” Zustand/Redux๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒŒ ๋ฒ ์ŠคํŠธ!

์ „๋žต ์„ค๋ช…
Tanstack Query + Zustand - ์„œ๋ฒ„ ์ƒํƒœ: Tanstack Query
- UI ์ƒํƒœ: Zustand
๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ์กฐํ•ฉ
Redux + RTK Query - ์ด๋ฏธ Redux๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค๋ฉด?
- ์„œ๋ฒ„ ์ƒํƒœ๋Š” RTK Query๋กœ ์ถ”๊ฐ€
์ค‘๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์— ์•ˆ์ •์ 

 

4. ๊ทธ๋Ÿผ Redux๋Š” ์•ˆ ์จ๋„ ๋˜๋‚˜์š”?

์‚ฌ์‹ค ์š”์ฆ˜์—๋Š” ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Redux๋ฅผ ๊ตณ์ด ์“ธ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ๋Œ€๊ทœ๋ชจ ํŒ€, ๋ณต์žกํ•œ ์•ก์…˜ ํ๋ฆ„, ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ์—ฌ์ „ํžˆ ๊ฐ•๋ ฅํ•œ ํˆด์ด์—์š”.

  • ๊ณตํ†ต ์•ก์…˜ ๋กœ๊น…, ๋ฏธ๋“ค์›จ์–ด ํ™œ์šฉ
  • ํƒ€์ž… ์•ˆ์ •์„ฑ, ๋ณต์žกํ•œ ํ”Œ๋กœ์šฐ ์ œ์–ด
  • ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ Redux ๊ธฐ๋ฐ˜์ผ ๊ฒฝ์šฐ

 

5. โœ… ์ •๋ฆฌํ•˜๋ฉด?

  • Tanstack Query → ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋• ๋ฌด์กฐ๊ฑด ๊ณ ๋ ค
  • Zustand → ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ UI ์ƒํƒœ ๊ด€๋ฆฌ
  • Redux → ๋ณต์žกํ•œ ๊ตฌ์กฐ/ํŒ€์—์„  ์—ฌ์ „ํžˆ ์“ธ๋ชจ ์žˆ์Œ

 

๐Ÿ’ก ๊ฒฐ๋ก 

์ƒํƒœ ๊ด€๋ฆฌ๋Š” “ํ•˜๋‚˜๋กœ ๋‹ค ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ”, ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋‚˜๋ˆ  ์จ์•ผํ•œ๋‹ค.
๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต ์ƒํƒœ๋ฅผ ์ค„์ด๊ณ , ๋„๊ตฌ์— ๋งž๋Š” ์—ญํ• ๋งŒ ๋งก๊ธฐ๋ฉด ์œ ์ง€๋ณด์ˆ˜๋„ ํ›จ์”ฌ ์‰ฌ์›Œ์งˆ ๊ฒƒ.

โœ” Tanstack Query → ์„œ๋ฒ„ ์ƒํƒœ
โœ” Zustand/Redux → UI ์ƒํƒœ