React๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค.
ํ์ง๋ง ์ด๋ณด ๋๋ ๋ฌด์กฐ๊ฑด useEffect
+ fetch
๋ง ์ฐ๋ค ๋ณด๋
์ค์ ๋ก ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ ํจ์จ์ ์ธ ํจํด์ด ์๋ ๊ฑธ ๋ชจ๋ฅด๊ณ ์ง๋์น๋ ๊ฒฝ์ฐ๋ ๋ง๋ค.
์ด๋ฒ ๊ธ์ React์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ์์
๊ธฐ๋ณธ๋ถํฐ ๊ณ ๊ธ๊น์ง ์์๋๋ก ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค.
useEffect(() => {
fetch('/api/data')
.then((res) => res.json())
.then((data) => setData(data));
}, []);
useState
๋ก ์ง์ ๊ด๋ฆฌuseEffect(() => {
const fetchData = async () => {
try {
const res = await fetch('/api/data');
const json = await res.json();
setData(json);
} catch (e) {
setError(true);
}
};
fetchData();
}, []);
function useUserData() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('/api/user').then((res) => res.json()).then(setData);
}, []);
return data;
}
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 ๋ฑ๋ ์ง์
React 18๋ถํฐ ๋์ ๋ ์๋ก์ด ๊ฐ๋
์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ์์ React ์์ฒด๊ฐ ์ง์
const Post = React.lazy(() => import('./Post'));
<Suspense fallback={<Loading />}>
<Post />
</Suspense>
React Query
, Relay
๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ๊ฐ๋ ฅํจ์ํฉ | ์ถ์ฒ ๋ฐฉ๋ฒ |
---|---|
๋จ์ํ 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๊น์ง ํ์ฉํด๋ณด๋ ์ฐ์ต์ ํ๊ณ ์๋ค.
โ๏ธ "๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ ์๋๋ผ,
์ฌ์ฉ์ ๊ฒฝํ์ ๊ธฐ๋ค๋ฆผ ์์ด ์ฐ๊ฒฐํ๋ ์ผ์ด๋ค."