[๐Ÿถ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ] ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ๋ถ„์„ ์–ด๋–ป๊ฒŒ ์ •ํ•˜์ง€?

JEยท2024๋…„ 10์›” 18์ผ
1

์‹œ์ž‘

ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋ก ํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ๋งž๋Š”์ง€,
๋ฐฑ์—”๋“œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ๊ณ ๋ฏผํ•˜๋Š”๊ฒŒ ๊ฐ„ํ˜น ์žˆ์—ˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์น˜์›์„ ํƒˆํ‡ดํ•œ ๊ฐ•์•„์ง€๊ฐ€ ํ™œ์„ฑํ™” ๋œ ์ƒํƒœ์—์„œ
๊ฐ•์•„์ง€ ๊ด€๋ จ ํŽ˜์ด์ง€ ์ ‘์† ์‹œ ํŠน์ • UI๋ฅผ ํ‘œ์‹œํ•ด์•ผํ•˜๋ฉฐ ์—ด๋žŒ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผ ํ–ˆ๋‹ค.

ํ•ด๋‹น ๊ธฐํš ๋‚ด์šฉ์„ ๋ดค์„ ๋•Œ ๋‘ ๊ฐ€์ง€ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
ํƒˆํ‡ด ์œ ๋ฌด๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋ก ํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ๋งž์„์ง€ ๋ฐฑ์—”๋“œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ๋งž์„์ง€ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๊ณ 

2๊ฐ€์ง€ ์„ ํƒ์ง€๋ฅผ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


1. localStorage์— ์ €์žฅ

๋ฉ”์ธ ํ™ˆ api๋Š” ํƒˆํ‡ด ์œ ๋ฌด ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ผํ•˜๊ฒŒ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.
ํ•ด๋‹น ๊ฐ•์•„์ง€ ๊ด€๋ จ ํŽ˜์ด์ง€๋ฅผ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌด์กฐ๊ฑด ํ™ˆ์„ ๊ฑฐ์ณ์•ผ ํ–ˆ๊ธฐ์—
useEffect๋ฅผ ํ™œ์šฉํ•ด ์ฒซ ๋ Œ๋”๋ง ์‹œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ localStorage์— ์ €์žฅํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ์—ˆ๊ณ  ์ด๋ฅผ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋งŒ๋“ค์–ด ํ™œ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•œ ์ด์œ ๋Š”

  • ๋‹จ์ˆœ UI ์ˆ˜์ •์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋กœ api ์ˆ˜์ • ์š”์ฒญ์„ ํ•ด์•ผํ•˜๋Š”์ง€ ๊ณ ๋ฏผ์ด ๋“ค์—ˆ๋‹ค.
  • ๋ฉ”์ธ ํ™ˆ์„ ๋ฌด์กฐ๊ฑด ๊ฑฐ์ณ์•ผํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค.
  • localStorage์— ์ €์žฅํ–ˆ๊ณ  ์œ ์ €๊ฐ€ ์บ์‹œ ์ œ๊ฑฐ๋ฅผ ํ•ด๋„ ๋กœ๊ทธ์ธ ํ›„ ๋ฌด์กฐ๊ฑด ๋ฉ”์ธ ํ™ˆ์œผ๋กœ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋  ๊ฒฝ์šฐ๋Š” ์—†๋‹ค ์ƒ๊ฐํ–ˆ๋‹ค.

๋Œ€์‹  ๋‹จ์ ๋„ ์กด์žฌํ–ˆ์—ˆ๋‹ค.

  • ๋ฉ”์ธ ํ™ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ์ด ๊ฐ•ํ•ด์ง„๋‹ค.
  • ํ”„๋ก ํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

2. api์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์š”์ฒญ

api ํ•˜๋‚˜๋งŒ ์ˆ˜์ •ํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ๊ฐ•์•„์ง€ ๊ด€๋ จ ๋ชจ๋“  ํŽ˜์ด์ง€์— ํƒˆํ‡ด ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.

์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ

  • ํ”„๋ก ํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ํ•ญ์ƒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ์— ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค.

๋ฒˆ์™ธ) Tanstack Query์˜ ๊ธฐ๋Šฅ ํ™œ์šฉ?

Tanstack Query์˜ ์บ์‹ฑ ๊ธฐ๋Šฅ ์„ ํ™œ์šฉํ•˜๊ณ ์ž ํ–ˆ์ง€๋งŒ getQueryData ๋ฉ”์„œ๋“œ๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ๋กœ๊ณ ์นจ ํ•  ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ์— ์ž์—ฐ์Šค๋ ˆ ํ›„๋ณด์—์„œ ์ œ์™ธํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๋ก 

Server์—์„œ ๋ฐ›์•„์•ผํ•˜๋Š” ์ƒํƒœ๋“ค์˜ ํŠน์„ฑ

  • Client์—์„œ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ ์†Œ์œ ๋˜์ง€ ์•Š์€ ์›๊ฒฉ์˜ ๊ณต๊ฐ„์—์„œ ๊ด€๋ฆฌ๋˜๊ณ  ์œ ์ง€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • Fetching์ด๋‚˜ Updating์— ๋น„๋™๊ธฐ API๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ž ์žฌ์ ์œผ๋กœ 'out of date'๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์„ ์ง€๋‹Œ๋‹ค.

Client์—์„œ ๋ฐ›์•„์•ผํ•˜๋Š” ์ƒํƒœ๋“ค์˜ ํŠน์„ฑ

  • Client์—์„œ ์†Œ์œ ํ•˜๋ฉฐ ์˜จ์ „ํžˆ ์ œ์–ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ดˆ๊ธฐ ๊ฐ’ ์„ค์ • ์กฐ์ž‘์— ์ œ์•ฝ์‚ฌํ•ญ์ด ์—†๋‹ค.
  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ๋˜์ง€ ์•Š์œผ๋ฉฐ, Client๋‚ด ์—์„œ UI/UX ํ๋ฆ„์ด๋‚˜ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ ‰์…˜์— ๋”ฐ๋ผ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ญ์ƒ Client ๋‚ด์—์„œ ์ตœ์‹  ์ƒํƒœ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.
    [LIVE] React Query์™€ ์ƒํƒœ๊ด€๋ฆฌ :: 2์›” ์šฐ์•„ํ•œํ…Œํฌ์„ธ๋ฏธ๋‚˜

์ด๋•Œ ์ƒ๊ฐ ๋‚ฌ๋˜๊ฒŒ ์œ ํŠœ๋ธŒ React Query ๊ด€๋ จ ๊ฐ•์˜๋‚ด์šฉ์ด ์˜€๋‹ค.

ํ•ด๋‹น ๊ฐ•์‚ฌ๋‹˜์€ ๋ฐ์ดํ„ฐ์˜ Owner Ship์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๋‚ด์šฉ์„ ๋ณด์ž๋งˆ์ž ์•„์ฐจ ์‹ถ์—ˆ๋‹ค.

๋‚ด๊ฐ€ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•œ ๊ณ ๋ฏผ์„ ํ•˜๊ณ  ์žˆ๋˜๊ฒŒ ์•„๋‹ˆ ์˜€์„๊นŒ?

๋ฌด์—‡ ๋ณด๋‹ค ๋‹ค๋ฅธ ํŒ€์›๋ถ„๋“ค๊ป˜ ์˜๊ฒฌ์„ ๊ตฌํ–ˆ์„ ๋•Œ๋„ 2๋ฒˆ์„ ์ œ์•ˆํ•˜์…จ๋‹ค.

๊ฒฐ๊ตญ์—” 2๋ฒˆ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฌด์—‡ ๋ณด๋‹ค ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ํ”„๋ก ํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ์˜€๊ณ 
๋ฉ”์ธ ํ™ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋‹ค ๋ณด๋‹ˆ ์˜์กด์„ฑ ๋ฌธ์ œ๊ฐ€ ํฌ์ง€ ์•Š์•˜์„๊นŒ ์‹ถ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜...

2๋ฒˆ์œผ๋กœ ์ง„ํ–‰์„ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ์ ์šฉํ•˜๋ ค๋Š” ํŽ˜์ด์ง€ ์ „๋ถ€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ api๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์ง€ ์•Š์•˜๋‹ค.

์ตœ์ƒ๋‹จ์— UI๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋„ ์ตœ์ƒ์œ„์— ํ˜ธ์ถœ๋˜์–ด์•ผํ•œ๋‹ค.

๋‹ค๋ฅธ ๋ถ„์ด ์ž‘์—…ํ•˜์‹  ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ๋กค ๋ถ„๋ฆฌํ•˜์—ฌ
ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—์„œ api๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๊ณ ๋ฏผํ•˜๋˜ ์™€์ค‘...
ํŒ€์› ๋ถ„๊ป˜ "2๋ฒˆ์œผ๋กœ ๊ฐ€๋˜ ํƒˆํ‡ด ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” api ์ถ”๊ฐ€ ์š”์ฒญ์„ ํ•˜๋Š”๊ฒŒ ์–ด๋– ์‹œ๋ƒ"๊ณ  ๋ง์”€ํ•ด ์ฃผ์…จ๋‹ค.

์—ฌ๊ธฐ์„œ 2์ฐจ ์•„์ฐจ ์‹ถ์—ˆ๋‹ค...!

ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ๋งŒ ์ƒ๊ฐ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ์˜ ์ž‘์—… ๋Ÿ‰์ด api ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๋” ๋Š˜์–ด๋‚˜ ์žˆ์—ˆ๋‹ค.

๋ฌด์—‡ ๋ณด๋‹ค api ์ถ”๊ฐ€์‹œ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋” ์ˆ˜์›”ํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.

์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ํŒ๋‹จํ•ด์•ผ ํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๊ณ 
ํ˜ผ์ž ํ•ด๊ฒฐํ•˜๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ ํŒ€์› ๋ถ„๋“ค๊ณผ ์ƒ์˜ ํ–ˆ์„ ๋•Œ ๋” ๋‚˜์€ ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ฝ”๋“œ ์ˆ˜์ •

// ์ „
export const useDogDisconnected = () => {
  const DOG_DIS_CONNECTIED = "DOG-DIS-CONNECTIED";

  const setStorage = useSetLocalStorage();
  const [isDisconnected] = useLocalStorage(DOG_DIS_CONNECTIED, false);

  // disconnected localStorage์— ์ €์žฅ
  const setStorageDisconnected = (dogStatus: boolean) => {
    setStorage(DOG_DIS_CONNECTIED, dogStatus);
  };

  return { setStorageDisconnected, isDisconnected };
};
// ํ›„
export const useDogDisconnected = () => {
  const dogId = useRecoilValue(dogIdState) as number;
  const isDisconnected = useGetDogDisconnect(dogId).data;

  return { isDisconnected };
};
.
.
.
export const useGetDogDisconnect = (dogId: number) => {
  return useSuspenseQuery({
    queryKey: queryKey.member.dog.disconnect.dynamic(dogId),
    queryFn: () => handleGetDogDisconnect(dogId),
    staleTime: 10 * 60 * 1000
  });
};

์ฝ”๋“œ๋„ ๊ฐ„๊ฒฐํ•ด ์กŒ๊ณ  ์˜์กด์„ฑ๋„ ๋‚ฎ์•„์กŒ๋‹ค.
isDisconnected๋Š” ๊ฑฐ์˜ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ์— staleTime์„ ํ†ตํ•ด ํ˜ธ์ถœ์„ ์ง€์—ฐ ์‹œ์ผฐ๋‹ค.
๊ฑฐ์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์‹œ๊ฐ„์„ ๋” ๋Š˜๋ ค๋„ ๊ดœ์ฐฎ์ง€ ์•Š์„๊นŒ ์‹ถ์€ ์ƒ๊ฐ๋„ ๋“ค์—ˆ๋‹ค.


๋‹ค์Œ์—๋„ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ์ผ์–ด๋‚œ๋‹ค๋ฉด

  1. ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ Owner Ship์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด๊ณ ,
  2. ํ˜ผ์ž ๊ณ ๋ฏผํ•˜๊ธฐ ์• ๋งคํ•˜๋‹ค๋ฉด ํŒ€์›๋“ค๊ณผ ๊ณต์œ ํ•ด ๋‹ค์–‘ํ•œ ์˜๊ฒฌ ๋“ค์–ด๋ณด์ž.

ํ˜ผ์ž ๊ณ ๋ฏผํ•˜๋‹ค ์•„๊นŒ์šด ์‹œ๊ฐ„๋งŒ ์†Œ๋ชจํ–ˆ๋‹ค..

profile
[ํ”„๋ก ํŠธ ์• ์†ก์ด] ์ž‘์€ ๊นจ๋‹ฌ์Œ๋„ ๊ธฐ๋กํ•˜๊ธฐ

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