๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“บ Front End/- React, Next.js

[์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Next js] Next.js์˜ ๋‘ ๋ฒˆ์งธ ํ•ต์‹ฌ Pre-Rendering

by Wonit 2020. 12. 31.

ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ์‹œ๋ฆฌ์ฆˆ๋Š” ์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Next js ์‹œ๋ฆฌ์ฆˆ๋กœ์จ ์ด 8๋ถ€์ž‘์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
Next.js๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๋‚ด์šฉ์„ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์ด๊ฒŒ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

0. ๋ชฉ์ฐจ

1. create-next-app์œผ๋กœ next ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…ํ•˜๊ธฐ

2. create-next-app์—์„œ ๋งŒ๋‚œ ์ฒซ ๋ฒˆ์งธ ํ•ต์‹ฌ pages. ๊ทธ๋ฆฌ๊ณ  ๋™์  ๋ผ์šฐํŒ…

3. ํŽ˜์ด์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Link-Component ๊ทธ๋ฆฌ๊ณ  Pre-Fetch

Dynamic Routing๊ณผ Link๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

4. Next.js์—์„œ head ํƒœ๊ทธ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•

๋ฒˆ์™ธ & ์‹ค์Šต) ์ด๋ฏธ์ง€์™€ ๋™์˜์ƒ์„ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ณด์ž.

5. ์›น์˜ ๋ฐœ์ „ ๊ณผ์ •์œผ๋กœ ๋ณด๋Š” SSG์™€ SSR

6. next์˜ ๋‘ ๋ฒˆ์งธ ํ•ต์‹ฌ Pre-Rendering

7. SSG๋กœ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™” ๋…ธ๋ฆฌ๊ธฐ

8. ์ •์งํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Next.js ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋งˆ์น˜๋ฉฐ..


SPA์˜ ํŠน์„ฑ์„ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.


SPA๋Š” ์ฒ˜์Œ์ด ๋Š๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ ๋น ๋ฅด๋‹ค.


SPA ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ ์ปจํ…์ธ ๋ฅผ ๋ณด๋ ค๋ฉด ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ํ•œ ๋’ค์— html, js, assets ํŒŒ์ผ์„ ๋‹ค ๋‹ค์šด ๋ฐ›๊ธฐ ์ „ ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผํ•œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๋‹ค ๋‹ค์šด๋ฐ›๊ณ  ๋‚œ๋’ค Javascript ๋ฅผ ์ด์šฉํ•ด์„œ ๋งค ํ™”๋ฉด์˜ ์ปจํ…์ธ ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊พผ๋‹ค.


ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด SPA๋ฅผ ๋Š๋ฆฌ๊ฒŒ ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋˜๋Š”๋ฐ, ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SSR์œ„ํ•ด HTML ํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•ด์ค„ ์„œ๋ฒ„๋ฅผ ๋‘ฌ์•ผํ•œ๋‹ค.


ํ•˜์ง€๋งŒ NextJs์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ Pre-Rendering ์œผ๋กœ SSR๋ณด๋‹ค ๋ณต์žกํ•˜์ง€ ์•Š์€ ๋น„์šฉ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Pre-Rendering

ํ”„๋ฆฌ ๋ Œ๋”๋ง์€ next js ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค.


next์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „ํ•ด์ง€๊ธฐ ์ „์— HTML์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ํ”„๋ฆฌ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ create-react-app์œผ๋กœ ๋งŒ๋“  ์ผ๋ฐ˜์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ ๊ฒฝ์šฐ js ๊ธฐ๋Šฅ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋˜๋Š”๋ฐ, ํ”„๋ฆฌ ๋ Œ๋”๋ง๋œ next ์•ฑ์€ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— js ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ๋Š” next๋กœ ๋งŒ๋“  ๋ฆฌ์•กํŠธ ์•ฑ์ธ๋ฐ, js ๊ธฐ๋Šฅ์„ ๋„๋”๋ผ๋„ ๋™์ž‘ํ•˜๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Pre-Rendering์˜ ๊ณผ์ •

Pre-Rendering์—๋Š” 2๊ฐ€์ง€ ๊ณผ์ •์ด ์žˆ๋‹ค.

  1. initial load
  2. hydration

initial load html

js ๋™์ž‘๋งŒ ์—†๋Š” html์„ ๋จผ์ € ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š”๋ฐ, ์•„์ง js ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๊ธฐ ์ „ ์ด๋ฏ€๋กœ <Link>์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

hydration

initial load ์—์„œ html ์„ ๋กœ๋“œํ•œ ๋’ค js ํŒŒ์ผ์„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„ html์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ณผ์ •์ด๋‹ค.


์—ฌ๊ธฐ์„œ js๋ž‘ html์ด๋ž‘ ์—ฐ๊ฒฐํ•œ๋‹ค.


ํ•ด๋‹น ๊ณผ์ •์—์„œ react ์ปดํฌ๋„ŒํŠธ๋Š” ์ดˆ๊ธฐํ™”๋˜๊ณ  ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ค€๋น„๋ฅผ ๋งˆ์นœ๋‹ค.

 

๋งŒ์•ฝ Pre-Rendering์ด ์—†๋‹ค๋ฉด?

๋งŒ์•ฝ Pre-Rendering์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด JS ์ „์ฒด๊ฐ€ ๋กœ๋“œ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ดˆ Load์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

์ฆ‰ ์šฐ๋ฆฌ๋Š” ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „ ๊นŒ์ง€ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด ๋˜๊ณ  ๊ฒฐ๊ตญ UX๋Š” ๋‚ฎ์€ ํ‰๊ฐ€๋ฅผ ๋ฐ›๊ฒŒ๋  ์ˆ˜ ์žˆ๋‹ค.

Pre-Rendering์˜ 2๊ฐ€์ง€ SSG์™€ SSR

์ด๋Š” ์ด ์ „ ๋ฒˆ์™ธ์—์„œ ์„ค๋ช…ํ–ˆ์ง€๋งŒ ํ˜น์‹œ ๋ชจ๋ฅผ ์‚ฌ๋žŒ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SSG SSR CSR์— ๋Œ€ํ•ด์„œ ๋ชจ๋ฅธ๋‹ค๋ฉด ํ•ด๋‹น ๋งํฌ๋ฅผ ๋“ค์–ด๊ฐ€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

Next.js ์—์„œ๋Š” 2๊ฐ€์ง€ Pre-Rendering ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

  1. Static Site Generation : html ์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ์š”์ฒญ์— ๋”ฐ๋ผ์„œ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. (SSG)
  2. Server Side Rendering : html์„ ๊ฐ ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ์ผ์–ด๋‚  ๋•Œ ๋งˆ๋‹ค ์ƒ์„ฑ (SSR)

 

Static Site Generation

SSG๋Š” ๋™์ผํ•œ HTML์„ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑํ•ด์„œ ์“ฐ๋Š” SSR์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ๊ธฐ๋ฒ•์ด๋‹ค.


Next.js ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” Pre-Render ๋ฉ”์„œ๋“œ๊ฐ€ ์ตœ์ดˆ์— HTML์„ Buildํ•  ๋•Œ ๋™์ž‘ํ•œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  Pre-Render๋œ HTML ํŒŒ์ผ์€ ์š”์ฒญ์— ๋”ฐ๋ผ ์žฌ์‚ฌ์šฉ๋œ๋‹ค.

 

Server Side Rendering

์œ„์—์„œ ํ•œ ๋ง ๋•Œ๋ฌธ์— SSR์ด SSG๋ณด๋‹ค ๋” ๋น„ํšจ์œจ์ ์œผ๋กœ ๋น„์ถฐ์งˆ ์ˆ˜ ์žˆ๋‹ค.


ํ•˜์ง€๋งŒ SSR์€ HTML์„ ๊ฐ ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ์ผ์–ด๋‚  ์‹œ์ ๋งˆ๋‹ค ์ƒ์„ฑ์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— SSR์„ ์จ์•ผํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ช…๋ฐฑํžˆ ์กด์žฌํ•œ๋‹ค.


์ฃผ๋กœ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

 

์–ด๋–ค ์ƒํ™ฉ์—์„œ ์จ์•ผํ• ๊นŒ

next ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ์—์„œ๋Š” ๊ฐ€๋Šฅํ•œ static generation์„ ์ถ”์ฒœํ•œ๋‹ค.
๋งค ์š”์ฒญ๋งˆ๋‹ค data๊ฐ€ ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์ด๋ฅผํ…Œ๋ฉด ์š”์ฒญ๋งˆ๋‹ค ์ฝ˜ํ…์ธ ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ๋Š” SSR์„ ์„ ํƒํ•ด์•ผ ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด SSG๋ฅผ ์„ ํƒํ•˜๋„๋ก ํ•˜์ž.

๋Œ“๊ธ€