์ค๋์ Next JS์์ Client Data fetching ์ฌ์ฉ ์ ๋ง์ฃผํ ์ ์๋ Anchoring ์ด์์ ๋ํด ์ ๋ฆฌํ๋ ค ํฉ๋๋ค. Next JS docs์์ ๊ถ์ฅํ๊ณ ์๋ ์ฝ๋ ์คํ์ผ์ ์ ์ฉํ์ ๋ ์๊ธธ ์ ์๋ ์ด์์ด๊ธฐ ๋๋ฌธ์, ๊ด๋ จ ์ด์๊ฐ ์๊ฒผ์ ๋ ์ ๋ ๋๋ฒ๊น ์ ์๊ฐ์ ๊ฝค๋ ์ผ์ต๋๋ค. ๋จผ์ Next JS์ Data fetching์ ๋ํ ์ง์์ด ์ ๋ฌดํ ๋ถ๋ค์ ์ํด ๊ฐ๋ ๋ถํฐ ์ ๋ฆฌํ๊ณ ์ด์์ ๋ํ ํด๊ฒฐ ๊ณผ์ ์ ์ฐจ๋ก๋ก ์ ์ด๋ณด๊ฒ ์ต๋๋ค.
Data fetching
Next JS๋ฅผ ์ด์ฉํ Data fetching์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์!
- getStaticProps / getServerSideProps : Server Side์์ ๋ฏธ๋ฆฌ page html์ ๋ง๋ค์ด ๋ก๋๋ค.
- Client Side : Client Side์์ data๋ฅผ fetching ํฉ๋๋ค.
Next JS์ ๊ณต์ ๋ฌธ์์์๋ getStaticProps์์ pre-render๊ฐ ํ์ํ ์ปดํฌ๋ํธ์ data๋ฅผ fetchingํ๊ณ Client Side์์๋ pre-render๊ฐ ํ์์๊ฑฐ๋ user์ interaction์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ data๋ฅผ fetchingํฉ๋๋ค.
Client Side์ data fetching์ ๋ฌผ๋ก axios, fetch ๋ฑ์ web api๋ฅผ ๋ฐ๋ก ์ฌ์ฉํด๋ ๋์ง๋ง, react-query๋ SWR๊ณผ ๊ฐ์ด ์บ์ฑ๊ณผ ํจ๊ป ํจ๊ณผ์ ์ผ๋ก fetchingํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค. Next JS์ ๊ณต์๋ฌธ์์์๋ SWR์ ์ด์ฉํ data fetching์ practice code๋ก ์ฐ๊ณ ์์ต๋๋ค.
ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ณตํต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋ ํ๋ฆ์ ๊ถ์ฅํฉ๋๋ค. useData๋ก๋ถํฐ data๋ฅผ ๋ฐ์์ค๊ธฐ ์ ๊น์ง๋ ๊ธฐ์กด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ง ์๊ณ ๋์ loading๊ณผ ๊ฐ์ ๋์ฒด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
const { data: nowDate, isLoading, isError } = useData();
if (isLoading) return <div>loading...</div>;
if (isError) return <div>error</div>;
return (
<div id='anchoring-target'>{nowDate.date}</div> // (1)
);
Issue
์ํฉ
์ต์ปค๋ง์ด ํ์ด์ง ์ฒซ ์ ๊ทผ ์ ๋์ํ์ง ์์์ต๋๋ค. ๋ค๋ง, ์ ๊ทผ ์ดํ url ๋ค์ hash(#)๋ฅผ ๋ถ์ด๊ฑฐ๋ ์ฝ๋ ์์ router.push ํตํด ์ด๋ํ๋ฉด ์ ๋๋ก ๋์ํ์ต๋๋ค.
์ด์ ์ ๋ฆฌ
์์ ์ฝ๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ตฌ์ฑํ ๊ฒฝ์ฐ useData๋ฅผ ํตํ data๋ฅผ fetchingํด์ค๊ธฐ ์ ๊น์ง๋ ์ฝ๋ (1)๋ฒ์ div๊ฐ ๋ ธ์ถ ๋์ง ์์ต๋๋ค.
SSR์ ์ฌ์ฉํ๋ Next js ์ดํ๋ฆฌ์ผ์ด์ ์์ ์์ ์ฝ๋ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Server Side์์ data fetching์ด ํ์์๋ ๋ถ๋ถ์ pre-render ํ๊ธฐ → ์ด ๋, data๊ฐ ์์ผ๋ฏ๋ก loading์ด ํ์๋ฉ๋๋ค.
- Client Side์์ useData๊ฐ ์๋ํ์ฌ data๋ฅผ ๋ฐ์์ต๋๋ค.
- ๋ฐ์์จ ๋ฐ์ดํฐ๋ก (1)๋ฒ์ div๊ฐ ๋ ๋๋ง๋ฉ๋๋ค.
๋ง์ฝ ์ต์ด ์ ๊ทผํ๋ url์ hash(#anchoring-target)์ด ๋ถ์ด ๊ณง๋ฐ๋ก ํด๋น ์์น๋ก ์ด๋ํด์ผ ํ๋ค๋ฉด ์์ ์ฝ๋๋ ์ต์ปค๋ง์ด ๋์ํ์ง ์์ต๋๋ค.
์ต์ปค๋ง ๋์ ์์ฒด๋ Server Side์์ ์์ฑ๋ page์์ ๋์ ์๋ฃ ํ๋ค๊ณ ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค๋ง Server Side์์๋ useData๊ฐ ๋์ํ๊ธฐ ์ ์ด๋ฏ๋ก Loading๋ง์ด ํ์๋๊ณ ์ต์ปค๋ง์ ์ ๋๋ก ๋์ํ์ง ์์ต๋๋ค.
ํด๊ฒฐ
ํด๋น ์ด์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
- Server Side์์ fetchingํ data๋ก default๋ก ์ปดํฌ๋ํธ ๊ตฌ์ฑ ํ, Client Side์์ fetchingํ ๋ฐ์ดํฐ๋ก ๊ฐฑ์ ํ๊ธฐ (default data๋ฅผ ๊ทธ๋ฅ ๋ฏธ๋ฆฌ ์ง์ ํด๋๋ ๊ฒ๋ ํ ๋ฐฉ๋ฒ์ ๋๋ค.)
- data๊ฐ ์๋ ์ํ์ ๋ ๋๋ง์ ํ์ด ์ ์ง๋๋๋ก ํ๊ธฐ (์๋จ ์ฝ๋์์ div๋ ๋ ธ์ถ๋๋๋ก)
const { data: nowDate } = useData();
return (
<div id='anchoring-target'>{nowDate?.date}</div> // ? ์ฐ์ฐ์๋ก data๊ฐ ์์ผ๋ฉด ํ์ํ์ง ์๊ธฐ
);
๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ
๋ฌธ์ ๋ ์ด๋ ๊ฒ ๋ฐ์ํ ์ต์ปค๋ง ๋ฌธ์ ๋ฅผ Client data fetching์ด ์์ธ์ด๋ผ๊ณ ์ฐพ์๋ด๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์์ผ๋ก ๋๋ฒ๊น ์์๋ SSR์ ์ด์ฉํจ์ ๋ฐ๋ผ ๋ฐ์ํ๋ ์ด์์ธ ์ง ํ์ธํ๊ธฐ ์ํด Server Side์์ ์์ฑ๋๋ ํ์ด์ง๋ฅผ ๋ณด๊ณ ์ด๋ค ์ปดํฌ๋ํธ๋ค์ด ๋ฏธ๋ฆฌ ์์ฑ๋์ด ์๋ ์ง๋ฅผ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ํ, ์ ์ด์ ์ด๋ฌํ ๋ฌธ์ ์ ๋ฐ์์ ๋ง๊ธฐ ์ํด ์ฝ๋ ์คํ์ผ์ ๊ณ ์ ํ ํ์๊ฐ ์๋๋ฐ ์ ๊ฐ ์ ์ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- user์์ interaction์ด ์๋ ์ปดํฌ๋ํธ๋ Server Side์์ data fetchingํด์ค๊ธฐ
- Client side์์ data fetching์ ํด์ผ ํ๋ค๋ฉด ํ๋ ์์ ์ ์งํ ์ ์๋๋ก Server Side์์ ์ ์ฉ๋ default data๋ฅผ ํ ๋นํด์ฃผ๊ธฐ
Comment