Logo
Hyunsu Blog
nextjs-12-rendering

๐Ÿ“†Published :Jun 4, 2023 โ€ข

๐Ÿ“†Updated :Jun 4, 2023 โ€ข

โ˜•๏ธ2min

๊ถ๊ธˆํ•ด์„œ ํ•ด๋ณธ Next.js 12 ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ๋ฐฉ์‹ ์‹คํ—˜

๋“ค์–ด๊ฐ€๋ฉฐ

์ด ๊ธ€์€ Next.js์—์„œ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ˜ผ์ž playground์—์„œ ์‹คํ—˜ ํ•ด๋ณด๋‹ค ๋ฐฐ์šฐ๊ฒŒ ๋œ ๋ถ€๋ถ„์„ ๊ธฐ๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค์†Œ ๊ธ€์ด ์ „๋ฌธ์  ์ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ณ  ํ‹€๋ฆฐ ๋ถ€๋ถ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


๋„Œ CSR์ด๋‹ˆ SSR์ด๋‹ˆ ๋˜๋Š” SSG์ด๋‹ˆ?

Next.jsํŽ˜์ด์ง€์—์„œ getServerSideProps getStaticProps ์ค‘ ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ ๋Š” ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ window ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด client ์ผ ๊ฒƒ์ด๊ณ , ์—†๋‹ค๋ฉด server ์—์„œ ๋™์ž‘ํ•œ๋‹ค๊ณ  ์˜ˆ์ƒํ•˜์—ฌ log๋ฅผ ํ•˜๋‚˜ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.

useEffect๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€ csr๋™์ž‘์ž„์„ ํ™•์ธํ•ด ๋ณด๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋„ ๋ Œ๋”๋ง ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

export default function Test() { const [data, setData] = useState() console.log(typeof window === 'undefined' ? 'serverrrr' : 'client') useEffect(() => { fetch('https://api.github.com/repos/vercel/next.js') .then((res) => res.json()) .then((data) => setData(data?.description)) }, []) return ( <> <h1>Test Page</h1> <main> {' '} <h2>{data}</h2> </main> </> ) }

getServerSideProps ๋˜๋Š” getStaticProps ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์–‘์ชฝ์—์„œ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ๊ด€์ฐฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํ˜„์ƒ์€ Next.js์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์›๋ฆฌ์™€ ๊ด€๋ จ์ด ์žˆ๋Š”๋ฐ์š”.

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง (SSR):

  • ๊ธฐ๋ณธ์ ์œผ๋กœ, Next.js ํŽ˜์ด์ง€๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์— getServerSideProps ๋˜๋Š” getStaticProps ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋”๋ผ๋„, ์„œ๋ฒ„๋Š” ์ดˆ๊ธฐ HTML์„ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ํŽ˜์ด์ง€์˜ JavaScript ์ฝ”๋“œ๋Š” ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ๋”ฐ๋ผ์„œ console.log ์—์„œ "serverrrr"๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง (CSR):

  • ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ HTML์ด ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ๋„๋‹ฌํ•˜๋ฉด, ํŽ˜์ด์ง€์— ํฌํ•จ๋œ JavaScript๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ, React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค์‹œ ์‹คํ–‰๋˜๊ณ , console.log ์—์„œ "client"๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • CSR์—์„œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ useSWR ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ถ€๋ถ„์ด CSR์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?

  • OrderChangeListPage ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„์—์„œ ๋จผ์ € ๋ Œ๋”๋ง๋˜๊ณ , ๊ทธ ํ›„์— ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ๋„ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋  ๋•Œ, typeof window === 'object' ๋Š” false ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” window ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ "serverrrr"๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋ง๋  ๋•Œ๋Š” window ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ typeof window === 'object' ๋Š” true ๊ฐ€ ๋˜๊ณ , "client"๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

์—ฌํƒœ๊นŒ์ง€๋Š” ๋กœ์ปฌ์—์„œ ์ด๋ฃจ์–ด์ง„ ์ผ๋“ค์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด ํŽ˜์ด์ง€๋ฅผ ๋นŒ๋“œํ–ˆ์„ ๋• Next.js๋Š” ์–ด๋–ค ํŽ˜์ด์ง€๋กœ ๋ฐ›์•„ ๋“ค์ผ๊นŒ์š”?

ํŽ˜์ด์ง€์— getStaticProps, getServerSideProps, ๋˜๋Š” getInitialProps ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํŽ˜์ด์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.๋นŒ๋“œ ์‹œ์—๋Š” ๊ฐ„๋‹จํ•œ HTML ํ‹€๋งŒ ์ƒ์„ฑ๋˜๊ณ , ์‹ค์ œ ์ฝ˜ํ…์ธ ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. ์ด๋Š” SSR์ด ์•„๋‹Œ CSR (Client-Side Rendering) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ํŽ˜์ด์ง€๋Š” ์ •์  ํŽ˜์ด์ง€๋กœ ๋นŒ๋“œ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ „ํ†ต์ ์ธ SSR ํŽ˜์ด์ง€๋กœ ๋นŒ๋“œ๋˜๋Š” ๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์‹ , ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ดํ›„์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” CSR ๋ฐฉ์‹์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

nextjs rendering 1 nextjs rendering 2
  • order-changeํŽ˜์ด์ง€๋Š” ๋กœ์ปฌ์‹œ์— ServerSideRendering ๋ฐฉ์‹์ฒ˜๋Ÿผ ํ–‰ํ•ด ์กŒ๋Š”๋ฐ, ์‹ค์ œ ๋นŒ๋“œ ํ›„์—๋Š” Static ํŽ˜์ด์ง€๊ฐ€ ๋˜์—ˆ๊ณ , ๊ทธ๋ ‡๋‹ค๊ณ  ์ดํŽ˜์ด์ง€๋Š” SSG ๋„ ์•„๋‹ˆ๋„ค์š”.

๋ถ„๋ช… Next.js์—์„œ ๋ Œ๋”๋ง ๋ฐฉ์‹์„ ์„ค๋ช…ํ•  ๋• SSG, SSR, CSR์ด ์—ˆ๋Š”๋ฐ์š”. ์ €๋Š” ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์ธ์ง€ ์„ค๋ช…์ด ์ž˜ ์•ˆ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์—ฌ๊ธฐ์— ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด Prerendering ์ž…๋‹ˆ๋‹ค.

  • ๋นŒ๋“œ ๊ณผ์ •์—์„œ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ณธ HTMLํ‹€์€ ์ƒ์„ฑ๋˜์ง€๋งŒ, ํŽ˜์ด์ง€์˜ ์‹ค์ œ ์ฝ˜ํ…์ธ ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ฉด, Next.js๋Š” ๋นŒ๋“œ๊ณผ์ •์—์„œ ์ €์žฅํ•œ ์ •์ ์ธ HTML์„ pre-renderํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์ด๋Š” ๋ฆฌ์•กํŠธ์˜ CSR๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. CSR๋Š” HTML์— ์•„๋ฌด๊ฒƒ๋„ ๋‹ด๊ฒจ ์žˆ์ง€ ์•Š์ง€๋งŒ, ์•„๋ž˜ ์ด๋ฏธ์ง€ ์ฒ˜๋Ÿผ Next.js์—์„œ๋Š” h1 ํƒœ๊ทธ์™€ ํ•จ๊ป˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • ํ•ด๋‹นํŽ˜์ด์ง€๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์ ์œผ๋กœ ๋ Œ๋”๋ง ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋Š” ๋นŒ๋“œ ๊ณผ์ •์—์„œ ๋งŒ๋“ค์–ด์ง„ HTMLํ‹€ ์ž…๋‹ˆ๋‹ค.

nextjs rendering 3

์‹ค์ œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ณด์—ฌ์ง„ HTML๊ณผ , HTML์ด ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌ ๋œ ํ›„ ๋™์  ํŽ˜์ด์ง€๋ฅผ ์ฑ„์šฐ๋Š” ๊ณผ์ •์„ ๋‹ด์€ ์˜์ƒ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ API ํ˜ธ์ถœ ๋“ฑ์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CSR์˜ ์ „ํ˜•์ ์ธ ํŠน์ง•์ž…๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋นŒ๋“œ๋œ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ํŒŒ์ผ์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

nextjs-rendering-4

  • ๋นŒ๋“œ ํด๋”(.next ํด๋”) ๋‚ด์—์„œ๋„ ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํŒŒ์ผ์€ ์ฃผ๋กœ ๊ธฐ๋ณธ HTML ํ‹€๊ณผ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ JavaScript ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์šด ์  :

๊ฒฐ๋ก ์ ์œผ๋กœ, getStaticProps ๋‚˜ getServerSideProps ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€๋Š” ๋นŒ๋“œ ํด๋”์—๋Š” ์กด์žฌํ•˜์ง€๋งŒ, ๊ทธ ๋‚ด์šฉ์€ ์ฃผ๋กœ ๊ธฐ๋ณธ์ ์ธ HTML๊ณผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ์œ„ํ•œ JavaScript ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์˜ ์‹ค์ œ ์ฝ˜ํ…์ธ ๋‚˜ ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ๋™์ ์œผ๋กœ ๋กœ๋“œ๋˜๊ณ  ๋ Œ๋”๋ง๋˜๋ฉฐ, ๋นŒ๋“œ ํŒŒ์ผ ์ž์ฒด์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ Next.js๊ฐ€ ์„œ๋ฒ„์‚ฌ์ด๋“œ์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ดํŠธ์˜ ์ด์ ์„ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜์žˆ๋‹ค๋Š” ๊ฑด์ง€์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋™์ž‘๋ฐฉ์‹์€ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์˜ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ๋™์‹œ์— ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ์˜ ๋™์ ์ธ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข€ ๋‚˜์€ ๊ฒฝํ—˜์„ ์„ ์‚ฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฑด ์ด๋Ÿฐ ํŠน์ •์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.


์ฐธ๊ณ 

https://nextjs.org/ Nextjs ๊ณต์‹๋ฌธ์„œ

Hi, I'm Hyunsu ๐Ÿ‘‹

Profile Image

์•ˆ๋…•ํ•˜์„ธ์š”. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ฃผํ˜„์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ’๋ถ€ํ•˜๊ณ  ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์ผ์— ๋ฟŒ๋“ฏํ•จ์„ ๋Š๋‚๋‹ˆ๋‹ค.

์˜ต์‹œ๋””์–ธ(Obsidian)์—์„œ ํ˜„์žฌ ๋ธ”๋กœ๊ทธ๋กœ ํ•˜๋‚˜์”ฉ ๊ธ€์„ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์— ์žˆ์–ด์š”. โ˜•๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป โ›ท

Github on ViewReach Me Out