๐Ÿช ์‚ฌ์šฉ์ž ์ง€์ • React ํ›„ํฌ ๋งŒ๋“ค๊ธฐ

8738 ๋‹จ์–ด webdevreactjavascript

๋‹น์‹ ์€ React hooks์— ๋Œ€ํ•ด ๋“ค์—ˆ๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์ฃผ์š” ๊ฒƒ๋“ค์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ๋‹น์‹ ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ๋ฒจ์„ ์˜ฌ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ํ›„ํฌ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.

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

์ž‘์—…๊ณผ ํ”„๋กœ์ ํŠธ๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํ•ญ๋ชฉ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด 2๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ API ๋์ ์„ ํ˜ธ์ถœํ•˜๋Š” 2๊ฐœ์˜ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‘˜ ๋‹ค์— ๋Œ€ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฝ”๋”ฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ ๋งŒ๋“ค๊ธฐ



React์—์„œ ํ›„ํฌ์˜ ํ‘œ์ค€ ๊ด€ํ–‰์€ ์ด๋ฆ„์ด use ๋กœ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ํ›„ํฌ๋ฅผ useItemsLoader ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

const useItemsLoader = () => {};


์ƒํƒœ, ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ •์˜



๋‹ค๋ฅธ ๋์ ์— ๋Œ€ํ•ด ํ›„ํฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์ž…๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ๋ฐ์ดํ„ฐ(ํ•ญ๋ชฉ ํฌํ•จ) ๋ฐ ์š”์ฒญ ์ƒํƒœ( LOADING , DONE ๋ฐ ERROR ) ์ €์žฅ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๋ชจ์–‘์ด ์ถฉ๋ถ„ํžˆ ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์—(๋‹จ์ง€ ๋ช‡ ๊ฐœ์˜ ํ•„๋“œ) ๋‹จ์ผ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด useState ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ›„ํฌ์˜ ํ˜ธ์ถœ์ž ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

const useItemsLoader = (endpoint) => {
  const [data, setData] = useState({ items: null, state: 'LOADING' });
  return data;
};


๋ฐ์ดํ„ฐ ์š”์ฒญ



์š”์ฒญ์„ ํŠธ๋ฆฌ๊ฑฐํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋ฏ€๋กœ useEffect ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋งˆ์šดํŠธ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์š”์ฒญ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

useEffect(() => {
    fetchItems(endpoint)
    .then( items => setData({ items, state: 'DONE' }))
        .catch( () => setData({ items: null, state: 'ERROR' });
}, [endpoint]);


๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜๋กœ ๋ชจ์œผ๊ธฐ



์ด๊ฒƒ์€ ํ›„ํฌ์˜ ์ตœ์ข… ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

const useItemsLoader = (endpointPath) => {
    const [data, setData] = useState({ items: null, state: 'LOADING' });

    useEffect(() => {
        fetchItems(endpoint)
        .then( items => setData({ items, state: 'DONE' }))
            .catch( () => setData({ items: null, state: 'ERROR' });
    }, [endpoint]);

    return data;
};


๋‹ค์Œ์€ out ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

const Tasks = () => {
  const tasksData = useItemsLoader('path/to/tasks');

  if (tasksData.state === 'LOADING') return <div>Loading data...</div>;
  if (tasksData.state === 'ERROR') return <div>Something went wrong</div>;

  return (
    <div>
      <h1>Tasks</h1>
      {tasksData.items.map((task) => (
        <Task task={task} />
      ))}
    </div>
  );
};

Projects๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ useItemsLoader ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ํ›„ํฌ๋Š” ๋” ๋ณต์žกํ•œ ์†”๋ฃจ์…˜์˜ ๊ฒฝ์šฐ์—๋„ ์ข‹์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•œ ๊ณณ์—์„œ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ