์ด๋ฒ ํ๋ก์ ํธ๋ ๋ฆฌ์ํธ ์ฟผ๋ฆฌ์ ๋ฅ์คํธ๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์ํธ์ฟผ๋ฆฌ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
react-query๋ SSR์ ์ํด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ ํ๋ฆฌํจ์นญ์ ์ง์ํจ
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ queryClient์ ์ ๋ฌํจ
๐ค ๋ฐฉ๋ฒ 1 : ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ฆฌํจ์นํ์ฌ initialData๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
getStaticProps ๋ getServerSideProps ์์ ์ํ๋ API ๋ฅผ ์์ฒญํ๊ณ ๊ทธ์ ๋ํ ์๋ต์ page ์ props ๋ก ๋ด๋ ค์ฃผ๊ณ ๊ทธ ๊ฐ์ react-query ์ initialData ๋ก ๋ฃ์ด์ฃผ๋ ๋ฐฉ๋ฒ
export async function getStaticProps() {
const posts = await getPosts()
return { props: { posts } }
}
function Posts(props) {
const { data } = useQuery({
queryKey: ['posts'],
queryFn: getPosts,
initialData: props.posts,
})
// ...
}
getStaticPropsํจ์๋ก ์๋ฒ ์ธก์์ Post๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด. ์ด ๋ฐ์ดํฐ๋ popsts๋ผ๋ ํค ๊ฐ์ผ๋ก props์ ์ ๋ฌ๋จ. ๊ทธ ๋ค์ Posts์ปดํฌ๋ํธ์์ useQuery๋ฅผ ์ฌ์ฉํ์ฌ posts๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ด๊ธฐ๋ฐ์ดํฐ๋ก props.posts๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์
์ฃผ์์
1. ํธ๋ฆฌ ๋ด ๋ ๊น์ ์ปดํฌ๋ํธ์์ useQuery๋ก ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ initialData๋ฅผ ๊ทธ ๊น์ ๊ณณ๊น์ง ์ ๋ฌํด์ผ๋จ
2. ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ์์น์์ useQuery๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ ๋ชจ๋ ์์น์ initialData๋ฅผ ์ ๋ฌํด์ผ๋จ
3. ์๋ฒ์์ ์ฟผ๋ฆฌ๊ฐ ์ธ์ ๊ฐ์ ธ์์ก๋์ง ํ๋จ ๋ถ๊ฐ๋ฅ
๐ค ๋ฐฉ๋ฒ 2 : Hydration
getStaticProps or getServerSideProps์์ prefetch๋ฅผ ํตํด ๋ฐ์ดํฐ ์์ฒญ
ํด๋น ์บ์๋ฅผ dehydrateํด์ ํด๋ผ์ด์ธํธ์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ rehydrateํจ
์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ ์ ๊ฐ์ ธ์ ํด๋น ์ฟผ๋ฆฌ๋ค์ queryClient์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ์ง์ํจ. ์ด๋ ์๋ฒ๊ฐ ํ์ด์ง๋ฅผ ๋ก๋ํ ๋ ๋ฏธ๋ฆฌ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋งํฌ์
์ ํฌํจ์ํฌ ์ ์์์ ์๋ฏธํจ.
๊ทธ๋ฆฌ๊ณ ์ด ๋ฐ์ดํฐ๋ JS๊ฐ ์ฌ์ฉ๊ฐ๋ฅํด์ง๋ฉด React-query๊ฐ ์ด๋ฅผ ๋ค์ ๊ฐ์ ธ์ ํด๋ผ์ด์ธํธ์์ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์
๊ทธ๋ ์ด๋ํ๊ฑฐ๋ Hydration ํ ์ ์์์ ์๋ฏธํจ. ์ด๋ฌํ ๊ณผ์ ์๋ ์๋ฒ์์ ๋ ๋๋ง๋ ์ดํ ํด๋น ์ฟผ๋ฆฌ๊ฐ ๋ง๋ฃ๋ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ ์๋ก ๊ณ ์นจํ๋ ๊ธฐ๋ฅ๋ ํฌํจ๋์ด์์.
๋ ๋น์ฐํ ๋ ๋์ ๋ฐฉ๋ฒ์ธ Hydration ๋ฐฉ๋ฒ์ ํํ๊ธฐ๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ๋ ๋น์ฐํ๋ฏ์ด ์ฐ๋ reat-query
์ ์บ์
๊ธฐ๋ฅ์ด ์ ๋ง ์๋์ ํ๋์ง ๊ถ๊ธํด์ก๋ค
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ดค๊ณ , ๋๋ฒ์งธ์๋ useQuery๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์๋ดค๋ค.
๋๋ฆฐ3G ํ๊ฒฝ์์ ๋์ผํ๊ฒ ์คํ ์งํ
const getMe = async () => {
try {
const data = await loadMe();
setData(data);
} catch (err) {
console.log(err);
}
};
์บ์๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋์ ํ๋ฉด์๋ ๋ฐ์ดํฐ๋ฅผ ๋์ฐ์ง ๋ชปํจ
const { data } = useQuery([QUERYKEYS.LOAD_ME], loadMe);
๋๋ฆฐ 3Gํ๊ฒฝ์์๋ ์บ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ด์ง ์ ํ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์์.
์ ์ ์ฉ์ด ๋๋ ๋ฏ ๐
SSG๋ผ๋๊ฑด ๋น๋ ์์ ์ ์๋ฒ์์ ํด๋น API๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด๊ธฐ๋๋ฌธ์, ๊ฐ๋ฐํ๊ฒฝ์์ npm run build
, npm run export
๋ฅผ ํ๊ณ ์์ฑ๋ /out
ํ์ผ์์ ํด๋น ์ปดํฌ๋ํธ index.html
์ ์คํํ์๋ ํด๋น API๋ฅผ ํตํด ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๊ฐ ๋์์ผํจ.
๋จผ์ getStaticProps๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ทธ๋ฅ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ ์๋ index.html
์ ํ์ธํด๋ณด์
getStaticProps๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๊ฒฝ์ฐ index.html
์ ํ์ธํด๋ณด์
export async function getStaticProps() {
const queryClient = new QueryClient();
await queryClient.prefetchQuery([QUERYKEYS.LOAD_PRODUCT], () =>
loadMarketProductPaging({ size: 4, visible: true }),
);
return {
props: {
dehydratedState: dehydrate(queryClient),
},
};
}
๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋น๋์์ ์ ๋์ด์จ ๊ฒ์ ํ์ธํด๋ณผ ์ ์๋ค!!!!!!