๋ค์ด๊ฐ๊ธฐ ์ ์...
์ง๊ธ๊น์ง ์๊ฒผ๋ ์๋ฌธ๋ค์ ์ ๋ฆฌํด๋ณด์
Q1. SSR์ ๋น๋์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ค ๊ฐ์ ธ์ค๋๊ฒ ์๋๋ฐ ์ด๋ป๊ฒ SEO ์ธก๋ฉด์ ์ ๋ฆฌํ ๊ฑธ๊น?
SSR(์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง)์ ๊ฐ ์์ฒญ๋ง๋ค ์๋ฒ ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ด์ง๋ฅผ ๋ ๋๋งํจ. ๋ฐ๋ผ์ SSR์ ๋น๋ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค์ง ์์.
SSR์ ์ด๊ธฐ ๋ก๋ฉ ์์ ์์ ํ HTML ํ์ด์ง๋ฅผ ์ ๊ณต
Q2. CSR์ ํด๋ ๊ฒฐ๊ตญ api๋ฅผ ์์ฒญํ๋๊ฑด ์๋ฒ์ ์์ฒญํ๋๊ฑฐ ์๋๊ฐ? ์ด๊ฒ SSR๊ณผ ์ ํํ ๋ญ๊ฐ ๋ค๋ฅธ๊ฑฐ์ง? SSR๋ ์๋ฒ์ ์์ฒญ์ํ๊ณ CSR๋ ์๋ฒ์ ์์ฒญํ์์
์ด๊ธฐ ๋ก๋ฉ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์น๊ฐ ์๋ฒ์ธ์ง ํด๋ผ์ด์ธํธ์ธ์ง๊ฐ ๋ ๋ฐฉ์์ ์ฃผ์ํ ์ฐจ์ด์
CSR์ ๊ฒฝ์ฐ, ์ด๊ธฐ์๋ ๋น ํ์ด์ง๊ฐ ๋ก๋๋๊ณ , ์ดํ JavaScript๊ฐ ์คํ๋๋ฉด์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ธ์์ง๊ณ ํ์ด์ง๊ฐ ์ ๋ฐ์ดํธ๋จ.
๋ฐ๋ฉด์ SSR์ ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ฉด์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์์ ์์ ํ ํ์ด์ง๋ฅผ ์ ๊ณตํจ.
CSR:
์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ ์
ํ์ด์ง๋ ์ด๊ธฐ์ ๋น ์ํ๋ก ๋ก๋
ํด๋ผ์ด์ธํธ ์ธก JavaScript๋ API๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ถ๋ฌ์์ง๋ฉด, ํ์ด์ง๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง
SSR:
์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ ์
์๋ฒ๋ ์ด๊ธฐ ์์ฒญ์ ๋ํด ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ฉด์ API๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ด
์๋ฒ๋ ์์ ํ ํํ์ ํ์ด์ง๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ๊ณต, ํ์ด์ง์๋ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด์์.
Q3. SSG,SSR,CSR ๊ฐ๊ฐ API๋ฅผ ๋ถ๋ฅด๋ ์์ ์ด ์ด๋ป๊ฒ ๋ ๊น?
SSG->SSR->CSR
SSG์ ๋น๋ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ฏ๋ก, ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ ์ํ์ ๋ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ ๋๋ง๋จ.
SSR์ ๊ฐ ์์ฒญ๋ง๋ค ์๋ฒ ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก, SSG๋ณด๋ค๋ ๋๋ฆด ์ ์์ง๋ง, CSR๋ณด๋ค๋ ๋น ๋ฅด๊ฒ ํ์ด์ง๋ฅผ ์ ๊ณตํจ.
CSR์ ์ด๊ธฐ์๋ ๋น ํ์ด์ง๊ฐ ๋ก๋๋๊ณ , ์ดํ์ ํด๋ผ์ด์ธํธ ์ธก JavaScript๊ฐ ์คํ๋๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด.
SHOPํ๋ฉด ์นดํ ๊ณ ๋ฆฌ ๋ฐ์ดํฐ, ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ๋ SSR,SSG ์ค ์ ํ์ ํด์ผํจ.
๊ด๋ฆฌ์๊ฐ๊ฐ ์ ํ ๋ฐ์ดํฐ ํ๋๋ฅผ ์ถ๊ฐํ์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ๋ด๊ฐ ์ถ๊ฐํ ๊ทธ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์์ผ๋ ค๋ฉด....
SSG๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
getStaticProps
์์ revalidate
์ต์
์ ์ฌ์ฉํด์ผ ํจ. revalidate
์ ์ฌ์ฉํ์ง ์์ผ๋ฉด, ์ ์ ์์ฑ๋ ํ์ด์ง๋ ๋น๋๋ ์ดํ์๋ง ์
๋ฐ์ดํธ๋๋ฉฐ, ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ํ๋ ค๋ฉด ๋ช
์์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ๋น๋๋ฅผ ๋ค์ ์คํํด์ผํจ.
revalidate์ ๊ฒฝ์ฐ ํ์ด์ง ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์์ ๋๋ง ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ํ์ด์ง๋ฅผ ๊ฐฑ์ ํจ. ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ์ด์ ์ ์์ฑ๋ ์ ์ ํ์ด์ง๋ฅผ ๊ณ์ ์ฌ์ฉํจ.
SSR์ ์ฌ์ฉํ ๊ฒฝ์ฐ
์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ์์ ๋์ ์ผ๋ก ๊ฐ์ ธ์์ ํ์ด์ง๋ฅผ ๋ ๋๋งํ ์ ์์.
๋ฐ์ดํฐ ์
๋ฐ์ดํธ ์์ ๋น๋๋ฅผ ๋ค์ ์คํํ ํ์๊ฐ ์์.
SSR ๊ตฌํ ์์
export async function getServerSideProps() {
const queryClient = new QueryClient();
const productQuery = await queryClient.prefetchQuery(
[QUERYKEYS.LOAD_PRODUCT],
loadMarketProduct,
);
const categoryQuery = queryClient.prefetchQuery(
[QUERYKEYS.ADMIN_GET_CATEGORY],
adminGetCategory,
);
await Promise.all([productQuery, categoryQuery]);
return {
props: {
dehydratedState: dehydrate(queryClient),
},
};
}
const queryClient = useQueryClient();
const productData = queryClient.getQueryData([QUERYKEYS.LOAD_PRODUCT]) as {
data: {
content: Array<any>;
};
};
const categoryData = queryClient.getQueryData([
QUERYKEYS.ADMIN_GET_CATEGORY,
]) as { data: Array<any> };
getServerSideProps ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ
ํด๋ผ์ด์ธํธ ์ธก์์๋ useQueryClient ํ
์ ์ฌ์ฉํ์ฌ ๋์ผํ ์ฟผ๋ฆฌ ํด๋ผ์ด์ธํธ์ ์ ๊ทผํ๊ณ , ์ด์ ์ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
์ด ๊ธ์ ์์ฑํ ๋๊น์ง๋ง ํด๋ SSR๋ก ๊ตฌํํ๋ ค๊ณ ํ์ง๋ง, SSG๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์
์ด์ : ๊ด๋ฆฌ์๋ ์๋ก์ด ์ ํ ๋ฐ์ดํฐ๋ ์ผ์ฃผ์ผ์ ํ๋ฒ ์ ๋ฐ์ดํธํ๊ณ , ์นดํ ๊ณ ๋ฆฌ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์ ๋ณํ์ง ์์. ์ด๋ด ๊ฒฝ์ฐ SSG๋ฅผ ํ๋๊ฒ ํจ์จ์ ์.
SSG ๊ตฌํ
export async function getStaticProps() {
const queryClient = new QueryClient();
// Prefetch queries
await queryClient.prefetchQuery([QUERYKEYS.LOAD_PRODUCT], loadMarketProduct);
await queryClient.prefetchQuery(
[QUERYKEYS.ADMIN_GET_CATEGORY],
adminGetCategory,
);
return {
props: {
dehydratedState: dehydrate(queryClient),
},
revalidate: 10,
};
}
์๋๋ SSR๊ณผ ๋์ผ
๋!...
๐ซ