๐ŸŒ 26. React์—์„œ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด ์ •๋ฆฌ โ€” fetch๋ถ€ํ„ฐ Suspense๊นŒ์ง€

JM_Devยท2025๋…„ 5์›” 5์ผ
0
post-thumbnail

React๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๋‹ค.
ํ•˜์ง€๋งŒ ์ดˆ๋ณด ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด useEffect + fetch๋งŒ ์“ฐ๋‹ค ๋ณด๋‹ˆ
์‹ค์ œ๋กœ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‚˜ ํšจ์œจ์ ์ธ ํŒจํ„ด์ด ์žˆ๋Š” ๊ฑธ ๋ชจ๋ฅด๊ณ  ์ง€๋‚˜์น˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค.

์ด๋ฒˆ ๊ธ€์€ React์—์„œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ์‹์„
๊ธฐ๋ณธ๋ถ€ํ„ฐ ๊ณ ๊ธ‰๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‹ค.


โœ… 1. ๊ฐ€์žฅ ๊ธฐ๋ณธ: fetch + useEffect

useEffect(() => {
  fetch('/api/data')
    .then((res) => res.json())
    .then((data) => setData(data));
}, []);
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•
  • ์ƒํƒœ: useState๋กœ ์ง์ ‘ ๊ด€๋ฆฌ
  • ๋‹จ์ : ๋กœ๋”ฉ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ

โœ… 2. async/await + try-catch ํŒจํ„ด

useEffect(() => {
  const fetchData = async () => {
    try {
      const res = await fetch('/api/data');
      const json = await res.json();
      setData(json);
    } catch (e) {
      setError(true);
    }
  };
  fetchData();
}, []);
  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง
  • ์—ฌ์ „ํžˆ ๋กœ๋”ฉ ์ƒํƒœ, ์—๋Ÿฌ ์ƒํƒœ๋ฅผ ์ง์ ‘ ๋‹ค๋ค„์•ผ ํ•จ

โœ… 3. ์‚ฌ์šฉ์ž ์ •์˜ Hook์œผ๋กœ ๋กœ์ง ๋ถ„๋ฆฌ

function useUserData() {
  const [data, setData] = useState(null);
  useEffect(() => {
    fetch('/api/user').then((res) => res.json()).then(setData);
  }, []);
  return data;
}
  • ๋ฐ˜๋ณต๋˜๋Š” fetch ๋กœ์ง์„ custom hook์œผ๋กœ ๋ถ„๋ฆฌ
  • ์‹ค๋ฌด์—์„œ ์•„์ฃผ ์ž์ฃผ ์“ฐ์ž„
  • ํ•˜์ง€๋งŒ ์—๋Ÿฌ, ๋กœ๋”ฉ ์ƒํƒœ๋„ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•จ

โœ… 4. SWR, React Query ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ

import useSWR from 'swr';

const fetcher = (url: string) => fetch(url).then(res => res.json());

function App() {
  const { data, error, isLoading } = useSWR('/api/data', fetcher);
}
  • ์ƒํƒœ ๊ด€๋ฆฌ, ์บ์‹ฑ, ๋ฆฌํŠธ๋ผ์ด๊นŒ์ง€ ๊ธฐ๋ณธ ๋‚ด์žฅ
  • ๋กœ๋”ฉ/์—๋Ÿฌ ์ฒ˜๋ฆฌ๋„ ๊น”๋”
  • ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹

โœ… React Query๋Š” Mutation, Infinite Scroll ๋“ฑ๋„ ์ง€์›


โœ… 5. Suspense for Data Fetching (React 18+)

React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ์ƒˆ๋กœ์šด ๊ฐœ๋…
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹์„ React ์ž์ฒด๊ฐ€ ์ง€์›

const Post = React.lazy(() => import('./Post'));

<Suspense fallback={<Loading />}>
  <Post />
</Suspense>
  • ์•„์ง์€ React Query, Relay ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ•๋ ฅํ•จ
  • ์ง์ ‘ fetch๋ฅผ Suspense์™€ ์—ฐ๋™ํ•˜๋ ค๋ฉด ์‹คํ—˜์  ๊ธฐ๋Šฅ ์‚ฌ์šฉ ํ•„์š”

๐Ÿ” ์š”์•ฝ: ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๊ฑธ ์“ฐ๋ฉด ์ข‹์„๊นŒ?

์ƒํ™ฉ์ถ”์ฒœ ๋ฐฉ๋ฒ•
๋‹จ์ˆœํ•œ fetch, ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธuseEffect + fetch
์ฝ”๋“œ ๋ถ„๋ฆฌ ๋ฐ ์žฌ์‚ฌ์šฉ ํ•„์š”Custom Hook ํ™œ์šฉ
์‹ค๋ฌด, ๋ณต์žกํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ํ•„์š”SWR ๋˜๋Š” React Query
SSR + ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ (Next.js)getServerSideProps, useSWR
React 18, ์‹คํ—˜์  ๋ Œ๋”๋ง ์ „๋žตSuspense + use

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ฒ˜์Œ์—” useEffect๋งŒ ์“ฐ๋ฉด ๋‹ค ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ,
SWR์ด๋‚˜ React Query๋ฅผ ์จ๋ณด๊ณ  ๋‚˜์„œ์•ผ ์ƒํƒœ ๊ด€๋ฆฌ, ์บ์‹ฑ, ๋กœ๋”ฉ ํ•ธ๋“ค๋ง๊นŒ์ง€
๋ชจ๋“  ๊ฑธ ์†์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค.

์ง€๊ธˆ์€ SWR์ด๋“  React Query๋“  ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ์— ๋งž์ถฐ ์ ์ ˆํžˆ ์„ ํƒํ•˜๊ณ ,
ํ•„์š”ํ•˜๋ฉด Suspense๊นŒ์ง€ ํ™œ์šฉํ•ด๋ณด๋Š” ์—ฐ์Šต์„ ํ•˜๊ณ  ์žˆ๋‹ค.


โ›“๏ธ "๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ธฐ๋‹ค๋ฆผ ์—†์ด ์—ฐ๊ฒฐํ•˜๋Š” ์ผ์ด๋‹ค."

profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

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