React - ์™œ Route ๋ณ€ํ™” ์‹œ ๐ŸปZustand์˜ state ๋ณ€ํ™”๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๐Ÿ”ฅReact Query์˜ cache clear๋Š” ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ?

Maria Kimยท2025๋…„ 2์›” 15์ผ
0
post-thumbnail

๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด, ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋ณดํ†ต Zustand๋ฅผ ์œ ์ €์˜ ์ƒํƒœ ์ €์žฅ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  React-query๋ฅผ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ ๋‘˜ ๋‹ค ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด ๋‘˜์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ฐจ์ด์ ์„ ๋Š๋ผ๊ฒŒ ๋œ๋‹ค.

ํŠนํžˆ, React Query๊ฐ€ ๋‹จ์ˆœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ํˆด์ด ์•„๋‹Œ '์บ์‹œ์™€ ๊ตฌ๋…์„ ๊ด€๋ฆฌํ•˜๋Š” ํˆด'์ด๋ผ๋Š” ์ ์„ ๊นจ๋‹ซ๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ๋ฌธ์— React Query์˜ ์บ์‹œ๋Š” ๋•Œ๋•Œ๋กœ ์ถ”๊ฐ€์ ์ธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ด ๊ธ€์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค.

ํ‰๋ฒ”ํ•œ ๋กœ๊ทธ์•„์›ƒ ์˜ˆ์‹œ

const onLogout = async () => {
  await logout(); // ๋กœ๊ทธ์•„์›ƒ api
  resetUser(); // ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋œ ์œ ์ € ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” Zustand code 
  queryClient.clear(); // ์บ์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ React Query code 
  router.push('/home'); // Navigate 
};

์–ผํ• ๋ณด๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•ด๋ณด๋ฉด router.push()์™€ ๊ด€๋ จ๋œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์–‘ํ•œ ์‹œ๋„ ๋์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

const onLogout = async () => {
  await logout();
  resetUser(); // Zustand 
  Promise.resolve().then(() => queryClient.clear()); // React Query 
  router.push('/home');
};

๊ทธ๋ฆฌ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋Ÿฐ ์˜๋ฌธ์ด ์ƒ๊ธด๋‹ค.

"์™œ React Query ์ฝ”๋“œ๋Š” Promise๊ฐ€ ํ•„์š”ํ•˜๊ณ , Zustand ์ฝ”๋“œ๋Š” Promise ์—†์ด๋„ ์ž˜ ์ž‘๋™ํ• ๊นŒ?"

๐Ÿป Zustand vs ๐Ÿ”ฅ React Query

๐Ÿป Zustand - ๋‹จ์ˆœํ•œ ๋™๊ธฐ์ ์ธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ

resetUser()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Zustand๋Š”:
1. ์Šคํ† ์–ด์˜ ์ƒํƒœ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ๋ณ€ํ™”์‹œํ‚จ๋‹ค.
2. ์ƒํƒœ๋ฅผ ๊ตฌ๋… ์ค‘์ธ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์„ ์š”์ฒญํ•œ๋‹ค.
3. ์ด๋ฏธ ์–ธ๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ตฌ๋…์ด ์ทจ์†Œ๋˜์–ด ๋ฌด์‹œ๋œ๋‹ค.

React Query - ์บ์‹œ, ์˜ต์ €๋ฒ„๋“ค, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋“ค

queryClient.clear()์„ ์‹คํ–‰ํ•˜๋ฉด:
1. ์บ์‹œ๋กœ๋ถ€ํ„ฐ ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฌดํšจํ™”ํ•œ๋‹ค.
2. ํ™œ์„ฑํ™” ์ƒํƒœ์˜ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๋ฆฐ๋‹ค.
3. ์ง„ํ–‰ ์ค‘์ธ ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์žฌ์‹œ๋„, ๋ฆฌํŽ˜์น˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ฃผ์š” ๋ฌธ์ œ๋Š” queryClient.clear()๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ, router.push()๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๋ฉด ๋ ˆ์ด์Šค ์ปจ๋””์…˜์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

  • React query๊ฐ€ ์—ฌ์ „ํžˆ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ์ค‘์ผ ๋•Œ, ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๊ตฌ๋… ์ทจ์†Œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์บ์‹œ๋ฅผ ํด๋ฆฌ์–ดํ•œ ํ›„ ์ง„ํ–‰ ์ค‘์ด๋˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์–ธ๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ์— React Query๊ฐ€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ ˆ์ด์Šค ์ปจ๋””์…˜ (race condition)

โ€˜๋ ˆ์ด์Šค ์ปจ๋””์…˜โ€™์ด๋ž€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด์„œ, ์‹คํ–‰ ์ˆœ์„œ๋‚˜ ํƒ€์ด๋ฐ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, React Query ์บ์‹œ๋ฅผ ํด๋ฆฌ์–ดํ•˜๋Š” ๊ฒƒ๊ณผ ๋ผ์šฐํŠธ์— ์˜ํ•œ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ๊ฐ€ ๊ฒน์น  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์ด๋‚˜ ์˜ค๋ฅ˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์™œ ์ง€์—ฐ์‹œํ‚ค๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ ๊นŒ?

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด:

Promise.resolve().then(() => queryClient.clear());

์บ์‹œ ํด๋ฆฌ์–ด๋Š” ๋‹ค์Œ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ์—์„œ ์ง„ํ–‰๋œ๋‹ค.

์ด๋กœ ์ธํ•ด ๋ฆฌ์•กํŠธ๊ฐ€ ๋‹ค์Œ ์ž‘์—…์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.
1. router.push()๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ๋ฅผ ์™„๋ฃŒํ•œ๋‹ค.
2. React Query์™€ ์—ฐ๊ฒฐ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๊ตฌ๋… ์ทจ์†Œ๋ฅผ ์™„๋ฃŒํ•œ๋‹ค.
3. ๊ทธ ์ดํ›„, ์ง„ํ–‰ ์ค‘์ธ ๋ฆฌ์•กํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด๊ณผ ๊ฐ„์„ญ ์—†์ด, ์•ˆ์ „ํ•˜๊ฒŒ ์บ์‹œ๋ฅผ ํด๋ฆฌ์–ดํ•˜๊ฒŒ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์ง€์—ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋ ˆ์ด์Šค ์ปจ๋””์…˜์„ ํ”ผํ•˜๋Š” ํ•ต์‹ฌ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ Zustand๋Š” ์–ธ์ œ๋‚˜ ์•ˆ์ „ํ• ๊นŒ?

Zustand ์ƒํƒœ ๋ณ€๊ฒฝ์€ ๋™๊ธฐ์ ์ด๊ณ  ๋ผ์ดํ”„ ์‚ฌ์ดํด์— ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋งŒ์•ฝ, resetUser() ์‹คํ–‰ ์‹œ, ๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.
  • ์–ธ๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฏธ ๊ตฌ๋… ์ทจ์†Œ๋˜์–ด ์žˆ์–ด ๋ฌด์‹œ๋œ๋‹ค.
  • ๊ฐ„์„ญํ•  ๋น„๋™๊ธฐ์ ์ธ ํ–‰๋™์ด๋‚˜ ๋„คํŠธ์›Œํฌ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์—†๋‹ค.

์ด๋ ‡๋“ฏ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ ๋•๋ถ„์—, ๋„ค๋น„๊ฒŒ์ด์…˜์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ๊ด€๊ณ„์—†์ด ์–ธ์ œ๋“  ์•ˆ์ „ํ•˜๊ฒŒ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์š”์•ฝ

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

profile
Frontend Developer, who has business in mind.

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด