Next.js SSR๐ŸŒธ๐Ÿ

yongheeยท2022๋…„ 7์›” 5์ผ
0

SSR์€ Server Side Rendering ์•ฝ์ž๋กœ, ์›น์‚ฌ์ดํŠธ๋ฅผ ์ ‘์†ํ–ˆ์„ ๋•Œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ HTMLํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ํด๋ผ์ด์–ธํŠธํ•œํ…Œ ์‘๋‹ตํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋ณด์—ฌ์งˆ HTML ๋‚ด์šฉ์ด ํŒŒ์ผ์— ๋‹ด๊ฒจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ธ SEO๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ HTMLํŒŒ์ผ์„ ๋ฐ›์•„์™€์„œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ์—ญ์‹œ ๋น ๋ฅด๋‹ค.

ํ•˜์ง€๋งŒ ์•„์ง ๋™์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ๋ฐ›์•„์˜ค์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ฆญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋ฐ›์•„์™€์•ผ ์ธํ„ฐ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์€ ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„๊ณผ ์ธํ„ฐ๋ ‰์…˜ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„ ์‚ฌ์ด ๊ณต๋ฐฑ์ด ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

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

์ด์ฒ˜๋Ÿผ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ๊ฐ€์ง„ CSR๊ณผ SSR์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ž์–ด ๋ชฉ์ ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋ฉ”์ธํŽ˜์ด์ง€ ์ ์šฉํ•˜๊ธฐ

์‚ฌ์‹ค ๊ฐœ์ธํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด SSR์˜ ์žฅ์ ์„ ํฌ๊ฒŒ ๊ฒฝํ—˜ํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ ์šฉํ•˜๊ณ  ๋„์ž…ํ•˜๋Š” ๊ฒฝํ—˜์€ ์•ž์œผ๋กœ๋„ ๊ฐœ๋ฐœ์ž๋กœ ์—ญ๋Ÿ‰์„ ํ‚ค์šฐ๋Š” ๋ฐ ํฐ ๊ธฐํšŒ๋ผ ์ƒ๊ฐํ•œ๋‹ค.

https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props

Next.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SSG๋ฐฉ์‹์ด default ๊ฐ’์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ๋‹ค. ์ด ๋ง์€ ์ฆ‰ SSR ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋”ฐ๋กœ ์ง€์ •์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ ์šฉ๋ฐฉ๋ฒ• getServerSideProps


์ด์™€ ๊ฐ™์ด ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋‹ค.

export async function getServerSideProps() {
  const products = await client.product.findMany({});
  console.log(products);
  return {
    props: {
      products: JSON.parse(JSON.stringify(products)),
    },
  };
}

์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„


console.log(products);๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค.

๋‘๋ฒˆ์งธ ๋‹จ๊ณ„

const Home: NextPage<{products: ProductWithCount[]}> =({ products }) => {
  const user = useUser()
  console.log(user);
  const { data } = useSWR<ProductsResponse>("/api/products/Index")
  console.log(data); 
  const fetcher = (url: string) => fetch(url).then((response) => response.json());
  const { data:profile } = useSWR("/api/users/Me", fetcher); 
  const router = useRouter();
  -----

์ด๋ ‡๊ฒŒ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ๋‹จ์— Props๋กœ ๋‚ด๋ ค์ฃผ๋ฉด ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฟŒ๋ ค ์ค„ ์ˆ˜ ๊ฐ€ ์žˆ๋‹ค.

SSR + SWR ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

SWRConfig ์ปดํฌ๋„ŒํŠธ๋Š” fallback ์ด๋ผ๋Š” property ๋กœ ์บ์‹œ ์ดˆ๊ธฐ ๊ฐ’์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด Home ์ปดํฌ๋„ŒํŠธ๊ฐ€ /api/products/ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ์บ์‹œ๋ฅผ ๋ถˆ๋Ÿฌ ์˜ค๊ฒŒ ๋œ๋‹ค.

*fallback์—๋Š” key-value ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์บ์‹œ์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

return (
< SWRConfig value={{ fallback }}>
< Article />
< /SWRConfig>
)
}
const Page:NextPage<{products:ProductWithCount[]}> = ({ products }) => {
  return <SWRConfig value={{
    fallback: {
      "api/products/Index" : {
        ok:true,
        products
      }
    }
  }}>
    <Home/>
  </SWRConfig>
}
profile
ํ•„์š”ํ•  ๋•Œ ๋‚จ๊ธฐ๋Š” ๋‚ ๊ฒƒ์˜ ๊ธฐ๋ก ๊ณต๊ฐ„

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด