10 min read

Nuxt๋กœ ์•Œ์•„๋ณด๋Š” SPA, SSR ๊ทธ๋ฆฌ๊ณ  Static Web

Table of Contents

๐Ÿ˜จ ๊ทธ๋™์•ˆ์˜ ์˜คํ•ด

๋‚˜๋Š” ๊ทธ๋™์•ˆ Nuxt๋ฅผ ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ”ํžˆ ๋งํ•˜๋Š” SPA์˜ ํŠน์ง•๊ณผ SSR์˜ ํŠน์ง•์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์—ˆ๊ณ , ์„œ๋น„์Šค์˜ ํŠน์ง•๊ณผ ํ•„์š”์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์˜๋ฌธ์ด ๋“ค์–ด ๋‚˜๋ฆ„์˜ ์กฐ์‚ฌ๋ฅผ ํ•ด๋ณด๋‹ˆ SPA์™€ SSR์˜ ํฐ ํŠน์ง•๋“ค๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ์ง€, Nuxt๋ฅผ ์ œ๋Œ€๋กœ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์—ˆ๋”๋ผ. SPA, SSR ๊ทธ๋ฆฌ๊ณ  Static Web์˜ ์ฐจ์ด๋ฅผ ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์“ฐ๋„๋ก ํ•˜์ž.


๐Ÿ“ฑ SPA?

๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Single Page Application, SPA) SPA๋ž€ ๋‹จ์ผ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋œ ์›น์•ฑ์„ ๋งํ•œ๋‹ค. ๊ธฐ์กด์˜ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•  ๋•Œ, ๋ฐฐํฌ๊ฐ€ ๊ฐ„๋‹จํ•˜๋ฉฐ ์ƒ๋Œ€์ ์œผ๋กœ ์œ ๋ คํ•œ UX๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. SSR๊ณผ ๋น„๊ต๋ฅผ ํ•ด๋ณด๊ฒ ์ง€๋งŒ ์žฅ๋‹จ์ ์„ ์•Œ์•„๋ณด์ž.

์žฅ์ 

  • SSR๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๊นœ๋นก์ž„์ด ์—†๋‹ค. (์œ ๋ คํ•œ UI/UX ์ œ๊ณต)
  • ์ •์  ๋ฆฌ์†Œ์Šค(css / font / image ๋“ฑ)๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ „์ฒด์ ์ธ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ๋ถˆ๋ฆฌํ•˜๋‹ค.

    ๋‹จ์ผ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๊ณ  ํ™”๋ฉด ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์ด์šฉํ•ด ๊ทธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ๋ฅผ ํ•˜๋ฉด ๋‚ด์šฉ์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.

    ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก js์˜ ์šฉ๋Ÿ‰๋„ ์ปค์ง€๋‹ค ๋ณด๋‹ˆ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ์ž์—ฐ์Šค๋ ˆ ๋А๋ ค์ง„๋‹ค.


๐Ÿ–ฅ SSR?

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(Server Side Rendering) SSR์ด๋ž€ SPA์˜ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ์œ ์ €๊ฐ€ ํ™”๋ฉด์„ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ HTML์„ ๊ทธ๋ ค ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์žฅ๋‹จ์ ์€ SPA(ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง)๊ณผ ๋Œ€์กฐ๋œ๋‹ค.

์žฅ์ 

  • ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ์œ ๋ฆฌํ•˜๋‹ค.
  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

๋‹จ์ 

  • ๋งํฌ ์ด๋™ ์‹œ ํ™”๋ฉด์ด ๊นœ๋นก์ธ๋‹ค.
  • ์ „์ฒด ํŠธ๋ž˜ํ”ฝ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ๋‹ค.

โ” vue-cli๋ฅผ ์ด์šฉํ•˜๋ฉด..

๊ฐ„๋‹จํ•˜๊ฒŒ SPA(ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง)์™€ SSR(์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง)์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋Œ€์ฒด vue-cli๊ฐ€ ์žˆ์Œ์—๋„ Nuxt๋Š” ์™œ ์ƒ๊ฒจ๋‚ฌ์œผ๋ฉฐ, ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ณด์ž.

1. vue-cli

์ผ๋‹จ vue-cli๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SPA ํ”„๋กœ์ ํŠธ์ด๋‹ค. SSR์„ ์ด์šฉํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

https://kr.vuejs.org/v2/guide/ssr.html
https://ssr.vuejs.org/

๋‘ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด SSR ๋˜๋Š” Pre-Rendering์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

vue-cli๋ฅผ ์ด์šฉํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

vue create <app-name>

๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

vue-cli-ํ”„๋กœ์ ํŠธ-์ƒ์„ฑ

vue-cli-ํ”„๋กœ์ ํŠธ-๊ตฌ์กฐ

3. ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

package.json์—๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ, serve๋Š” ๊ฐœ๋ฐœ์šฉ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ, lint๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ๋ง๊ณผ ๊ด€๋ จํ•œ ์Šคํฌ๋ฆฝํŠธ์ด๋‹ˆ build ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

yarn build

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

vue-cli-build

์ € ๊ฒฐ๊ณผ๋ฌผ์„ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋ฉด SPA๋Š” ๋ฐฐํฌ๋˜๊ณ  ๋ฐ”๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ณผ์ •์„ ํ†ตํ•ด SPA๋Š” ๋ฐฐํฌ๊ฐ€ ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋นŒ๋“œ๋œ ์•ฑ์„ ์‹คํ–‰์‹œ์ผœ๋ณด์ž.

// ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ๋ช…๋ น์–ด ์‚ฌ์šฉ
npx serve dist

npx serve ๋ช…๋ น์–ด๋Š” ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค. npx์™€ serve๋Š” ๋”ฐ๋กœ ์ฐพ์•„๋ณด๊ฑฐ๋‚˜ ์ผ๋‹จ ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.

4. ๊ฒฐ๊ณผ ํ™”๋ฉด

vue-cli-view

npx serve dist๋ฅผ ํ†ตํ•ด ์›น์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ํ•ด๋‹น ์ฃผ์†Œ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์›น์ด ์‹คํ–‰๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ํฌ๋กฌ ์ฝ˜์†”(์ด๋ฏธ์ง€๋Š” ๋„ค์ด๋ฒ„ ์›จ์ผ)์„ ํ†ตํ•ด ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋ฉด body ํƒœ๊ทธ ์•ˆ์— ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ํƒœ๊ทธ๋“ค์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ์—” ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ ํ•˜์—ฌ ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

vue-cli-view-source

์œ„์˜ ํ™”๋ฉด์€ ํŽ˜์ด์ง€ ์†Œ์Šค ๋ณด๊ธฐ๋ฅผ ํ†ตํ•ด ๋ณธ ํ™”๋ฉด์ด๋‹ค. ์ด๋ฏธ์ง€์˜ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ <div id="app"></div>๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด ํฌ๋กฌ ์ฝ˜์†”๋กœ ๋ณธ ๊ฒฐ๊ณผ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ SPA๋ฅผ ์ด์šฉํ•œ ์›น์€ ํ™”๋ฉด์„ ๋ฏธ๋ฆฌ ๊ทธ๋ ค๋†“์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•ž์„œ ๋‚˜์—ดํ•œ ์žฅ๋‹จ์ ์„ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Nuxt๋Š” ์–ด๋–จ๊นŒ??


โœ… Nuxt๋ฅผ ์ด์šฉํ•˜๋ฉด..

Nuxt๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด SSR์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ๋˜ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€๋ฅผ ์‚ดํŽด๋ณด๋ฉด Nuxt๋Š” SPA ๋˜ํ•œ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฐํฌํ•ด์•ผ ์ด ์ผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ์•„๋ณด์ž.

๋ช…๋ น์–ด์™€ ๋ชจ๋“œ์— ๋”ฐ๋ฅธ ์ฐจ์ด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•œ๋‹ค.

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

์ผ๋‹จ Nuxt๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž.

npx create-nuxt-app <app-name>

create-nuxt-app์ด๋ผ๋Š” ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ํ†ตํ•ด Nuxt ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค. create-nuxt-app์€ SSR์„ ์‚ฌ์šฉํ•  ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” Nuxt ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ–ˆ๋‹ค.

nuxt-create-project

2. ๋ชจ๋“œ

Nuxt์—๋Š” ๋‘ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  1. spa
  2. universal

์œ„ ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด Nuxt๋Š” SPA์™€ SSR ๊ทธ๋ฆฌ๊ณ  Static Web์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“œ๋Š” ํ”„๋กœ์ ํŠธ์˜ nuxt.config.js์—์„œ ๊ฐ’์„ ๋ฐ”๊ฟ”์ค˜๋„ ๋˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ <๋ช…๋ น์–ด> --spa๋ผ๋Š” ์˜ต์…˜์„ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ๋„ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

nuxt-create-config

package.json์„ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๊ณ , ์•ž์œผ๋กœ spa์™€ universal ๋ชจ๋“œ๋ฅผ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ๊ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

{
  "name": "nuxt-test",
  "version": "1.0.0",
  "description": "My ace Nuxt.js project",
  "author": "khwan",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate"
  },
  "dependencies": {
    "nuxt": "^2.0.0"
  },
  "devDependencies": {}
}

3. ๋ช…๋ น์–ด

3.1. dev

dev ๋ช…๋ น์–ด๋Š” ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœ๋ชฉ์ ์œผ๋กœ Nuxt๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

๊ฐœ๋ฐœ์„œ๋ฒ„๋ฅผ ํ•ซ ๋ฆฌ๋กœ๋”ฉ ์ƒํƒœ๋กœ localhost:3000์— ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

3.1.1. ๋ชจ๋“œ universal

๋จผ์ € universal ๋ชจ๋“œ๋กœ dev ๋ช…๋ ์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

// package.json
module.exports = {
  mode: "universal",
  ...
}
yarn dev

nuxt-create-dev-universal

dev ๋ช…๋ ์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์ „๊ณผ์˜ ์ฐจ์ด๋Š” ํ”„๋กœ์ ํŠธ์— .nuxt๋ผ๋Š” ํด๋”๊ฐ€ ์ƒ๊ฒผ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. vue-cli์˜ dist์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ. ์ผ๋‹จ ์„œ๋ฒ„๊ฐ€ ๋„์›Œ์กŒ์œผ๋‹ˆ ์ ‘์†ํ•ด๋ณด์ž. (http://localhost:3000)

nuxt-create-dev-universal-view

nuxt-create-dev-universal-view-source

์œ„ ๋‘ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด ์ฐจ์ด๋ฅผ ์•Œ๊ฒ ์ง€๋งŒ, ์ด์ „ vue-cli๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํŽ˜์ด์ง€ ์†Œ์Šค ๋ณด๊ธฐ์—๋„ ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋“ค์ด ๋ณด์ด๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด SSR์ด ์ ์šฉ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ด์–ด์„œ ๋ฏธ๋ฆฌ ์ถ”๊ฐ€ํ•ด๋‘” ๋‹ค๋ฅธ ํŽ˜์ด์ง€(http://localhost:3000/sub)๋„ ๊ฐ™์€์ง€ ํ™•์ธํ•ด๋ณด์ž.

nuxt-create-dev-universal-view-2

nuxt-create-dev-universal-view-source-2

๋‹ค๋ฅธ route(URL)๋ฅผ ๊ฐ€์ง„ ํŽ˜์ด์ง€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

3.1.2. ๋ชจ๋“œ spa

์ด๋ฒˆ์—” spa ๋ชจ๋“œ๋กœ dev ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

// package.json
module.exports = {
  mode: "spa",
  ...
}
yarn dev
// ๋˜๋Š”
yarn dev --spa

nuxt-create-dev-spa-view

nuxt-create-dev-spa-view-source

spa ๋ชจ๋“œ๋กœ ์‹คํ–‰์„ ์‹œ์ผฐ๋”๋‹ˆ, ๋ณด์—ฌ์ง€๋Š” view๋Š” ๊ฐ™์ง€๋งŒ ํŽ˜์ด์ง€ ์†Œ์Šค ๋ณด๊ธฐ์—์„œ universal ๋ชจ๋“œ์™€์˜ ์ฐจ์ด๋ฅผ ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค.

3.1.3. ์ •๋ฆฌ

ํ”„๋กœ์ ํŠธ ๋ชจ๋“œ๋ฅผ universal๊ณผ spa์ค‘ ์–ด๋–ค ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๊ฐœ๋ฐœ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์— ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ž์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

4. build & start

build์™€ start ๋ช…๋ น์–ด๋Š” ๋ฌถ์–ด์„œ ํ™•์ธํ•ด๋ณด์ž. vue-cli์˜ build์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•  ํ…๋ฐ ๋‹ค๋งŒ buildํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ start ๋ช…๋ น์–ด๋กœ ์‹คํ–‰์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. production(๋ฐฐํฌ) ์šฉ ์ž„์„ ์ธ์ง€ํ•˜์ž.

build์™€ start ๋ช…๋ น์–ด๋ฅผ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

  1. build
    Webpack์„ ํ†ตํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋ฉฐ, CSS์™€ JS๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.(ํ”„๋กœ๋•์…˜ ์šฉ์œผ๋กœ)
  2. start
    ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.๏ผˆnuxt build๋ฅผ ์‹คํ–‰ํ•œ ํ›„์—๏ผ‰

build์™€ start ๋ช…๋ น์–ด๋„ ๋ชจ๋“œ ๋ณ„ ์ฐจ์ด๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

4.1.1. ๋ชจ๋“œ universal

// package.json
module.exports = {
  mode: "universal",
  ...
}
yarn build

nuxt-build-universal

dev ๋ช…๋ ์–ด๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, .nuxtํด๋” ์•ˆ์— distํด๋”๊ฐ€ ์ถ”๊ฐ€๋กœ ์ƒ๊ฒผ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ๋“ค์„ ์ด์šฉํ•ด ์„œ๋ฒ„๋ฅผ ๋„์šด๋‹ค๋Š” ๊ฒƒ ์ •๋„๋งŒ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž. (์‚ฌ์‹ค ์ž˜ ๋ชจ๋ฅธ๋‹ค.) ์ด์–ด์„œ start๋ฅผ ๋ณด์ž.

yarn start

nuxt-start-universal

ํ„ฐ๋ฏธ๋„์„ ๋ณด๋ฉด production ๋ชจ๋“œ๋กœ ์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ผ๊ฐ”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

nuxt-start-universal-view

nuxt-start-universal-view-2

์œ„ ์ด๋ฏธ์ง€๋ฅผ ์‚ดํŽด๋ณด๋ฉด dev ๋ช…๋ น์–ด๋ฅผ universal ๋ชจ๋“œ๋กœ ์ผฐ์„ ๋•Œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋ฉด์ด ๋ณด์ธ๋‹ค. ํŽ˜์ด์ง€ ์†Œ์Šค ๋ณด๊ธฐ๋ฅผ ๋ณด๋ฉด, html ๋‚ด์šฉ์ด ๋ณด์ด๋Š” ๊ฒƒ์ด ํ™•์ธ๋œ๋‹ค. ์ฆ‰ SSR์ด ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ. ๊ทธ๋Ÿฌ๋‚˜ ์œ—๋ถ€๋ถ„์˜ style ์ฝ”๋“œ๊ฐ€ dev ๋ชจ๋“œ์— ๋น„ํ•˜๋ฉด ์ƒ๋‹นํžˆ ์••์ถ•๋˜์–ด์žˆ๋‹ค. production(๋ฐฐํฌ) ์šฉ์œผ๋กœ ๋นŒ๋“œ๊ฐ€ ๋๊ธฐ ๋•Œ๋ฌธ์— js ๋ฐ css ๊ด€๋ จ ์ฝ”๋“œ๋“ค์ด ์••์ถ•์ด ๋œ ๊ฒƒ์ด๋‹ค.

๋ฐ”๋กœ ์ง€๊ธˆ ์ด ์ƒํƒœ๊ฐ€ SSR์„ ์ด์šฉํ•ด ๋ฐฐํฌํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

SSR์€ ์ดˆ๊ธฐ ์ง„์ž… ํŽ˜์ด์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ๋ถˆ๋Ÿฌ์™€ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค. ์ฆ‰ ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ ค์ฃผ๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ด์ „ vue-cli๋ฅผ ๋ณด๋ฉด build์˜ ๊ฒฐ๊ณผ๋ฌผ์ด ์ •์ ํŒŒ์ผ๋“ค๋งŒ ์žˆ์—ˆ๊ณ , ๊ทธ ์ •์ ํŒŒ์ผ์„ ์›น์„œ๋ฒ„(nginx, github pages, netlify, amazon S3 ๋“ฑ)์— ์˜ฌ๋ ค์„œ ์ ‘๊ทผ๋งŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. SPA๊ฐ€ ๋ฐฐํฌ๊ฐ€ ๊ฐ„๋‹จํ•œ ๊ฒƒ์€ ์ •์ œ๋œ ์ •์ ํŒŒ์ผ์„ ์˜ฌ๋ฆฌ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ ์ด๊ณ , SSR์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ด์ฒ˜๋Ÿผ ํ™”๋ฉด์„ ๊ทธ๋ ค์ค„ ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜์—ฌ์„œ ๋น„์šฉ(๊ณผ์ •, ๋‚œ์ด๋„, ์‹œ๊ฐ„ ๋“ฑ)์ด ๋” ๋“ค๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด SSR์„ ์ด์šฉํ•˜๋ฉด SPA ์žฅ์ ์„ ์žƒ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ? Nuxt๋Š” ์ดˆ๊ธฐ์ง„์ž…๋งŒ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜๊ณ  ๊ทธ ๋’ค๋ก  SPA์˜ ํ๋ฆ„์„ ๋”ฐ๋ฅธ๋‹ค. ์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

nuxt-universal-url

๋จผ์ € URL๋กœ ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋ฉด ํ™”๋ฉด์ด ๊นœ๋นก๊ฑฐ๋ฆฌ๋ฉฐ ๋‹ค์‹œ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์„ ์ฝ˜์†”์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

nuxt-universal-link

๊ทธ๋Ÿฌ๋‚˜ ์ดˆ๊ธฐ ์ง„์ž… ์ดํ›„์— ์•ฑ ๋‚ด ๋งํฌ๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜๋ฉด ๋ฐ”๋€ ํ™”๋ฉด ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ SSR์ด ๋˜๋Š” ์žฅ์ ๋„, ๊ทธ ์ดํ›„์—๋Š” SPA์˜ ์žฅ์  ๋˜ํ•œ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค.

4.1.2. ๋ชจ๋“œ spa
// package.json
module.exports = {
  mode: "spa",
  ...
}
yarn build
// ๋˜๋Š”
yarn build --spa

nuxt-build-spa

universal ๋ชจ๋“œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, serverํด๋”์˜ ๊ตฌ์„ฑ์ด ์ข€ ๋‹ค๋ฅธ ๊ฒƒ์ด ๋ณด์ธ๋‹ค. ์ด๋ฒˆ์—๋„ start๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด์ž.

yarn start
// ๋˜๋Š”
yarn start --spa

mode๋ฅผ spa๋กœ ๋ฐ”๊พธ์ง€ ์•Š์•˜๋‹ค๋ฉด --spa์˜ต์…˜์„ ๊ผญ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•จ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค!

nuxt-start-spa-view

nuxt-start-spa-view-2

spa ๋ชจ๋“œ๋กœ ์‹คํ–‰์ด ๋๋‹ค. dev ๋ช…๋ ์–ด๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ์™€ ํฐ ์ฐจ์ด๋Š” ์—†์–ด๋ณด์ธ๋‹ค. ๋‹ค๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ production(๋ฐฐํฌ) ์šฉ์œผ๋กœ ์˜ฌ๋ผ๊ฐ”์„ ๊ฒƒ์ด๊ณ , ๊ทธ ์ฐจ์ด(์ฝ”๋“œ ์••์ถ•, ํ™˜๊ฒฝ์„ค์ • ๋ณ€์ˆ˜ ๋“ฑ)๊ฐ€ ์žˆ๊ฒ ๋‹ค.

ํ•˜์ง€๋งŒ spa ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ๋„ start ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„๋ฅผ ์ผœ์•ผํ•œ๋‹ค๋ฉด, vue-cli์— ๋น„ํ•ด ๋ญ๊ฐ€ ๋‚˜์€์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๊ทธ ์ ์„ ๊ธฐ์–ตํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ๋ช…๋ น์–ด์ธ generate๋ฅผ ํ™•์ธํ•ด๋ณด๋Ÿฌ ๊ฐ€์ž.

5. nuxt generate

gnerate ๋ช…๋ น์–ด๋Š” ์•ฑ์„ ๋นŒ๋“œํ•˜๊ณ  ์ •์ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์˜ ์„ค๋ช…์„ ํ™•์ธํ•ด๋ณด๋„๋ก ํ•˜์ž.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ณ  ๋ชจ๋“  ๋ผ์šฐํŠธ๋ฅผ HTML ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (์ •์  ํ˜ธ์ŠคํŒ…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.)

๊ณง๋ฐ”๋กœ ๋ชจ๋“œ๋ณ„ ์ฐจ์ด๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ํ™•์‹คํžˆ ์•Œ์ˆ˜ ์žˆ์„ ๊ฒƒ.

5.1.1. ๋ชจ๋“œ universal

// package.json
module.exports = {
  mode: "universal",
  ...
}
yarn generate

nuxt-generate-universal

generateํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด๋‹ˆ vue-cli์˜ build ๋ช…๋ น์–ด์ฒ˜๋Ÿผ dist ํด๋”๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์‚ดํŽด๋ณด๋‹ˆ ๋‚ด๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ๋งํฌ(index, main, sub)๋ณ„๋กœ ํด๋”์™€ html ํŒŒ์ผ์ด ์ƒ๊ฒผ๊ณ  ํ•ด๋‹น html ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋ฉด ์•ˆ์— ๋‚ด์šฉ์ด ์ฐจ์žˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ •์  ํŒŒ์ผ๋“ค์„ ์›น์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๋ฉด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์ง„๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ build ํ–ˆ์„ ๋•Œ์™€๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. html์— ์ด๋ฏธ ๋‚ด์šฉ์ด ๊ทธ๋ ค์ ธ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์„ Pre-Rendering์ด๋ผ๊ณ  ํ•œ๋‹ค. ์„œ๋ฒ„๋ฅผ ๋„์›Œ๋†“์ง€ ์•Š๊ณ  ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋†“์Œ์œผ๋กœ์จ SEO์— ์œ ๋ฆฌํ•œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

spa ๋ชจ๋“œ๋„ ์ด์–ด์„œ ํ™•์ธํ•ด๋ณด์ž.

5.1.2. ๋ชจ๋“œ spa

// package.json
module.exports = {
  mode: "spa",
  ...
}
yarn generate
// ๋˜๋Š”
yarn generate --spa

nuxt-generate-spa

universal ๋ชจ๋“œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ html์— ๋‚ด์šฉ์ด ์ฑ„์›Œ์ ธ์žˆ์ง€ ์•Š๋‹ค. SPA์˜ ํŠน์ง•์ด๋‹ค. ํ•˜์ง€๋งŒ dist ํด๋”๋ฅผ ๋ณด๋ฉด route ๋ณ„๋กœ index ํŒŒ์ผ์ด ์ƒ๊ฒจ์žˆ๋‹ค.

์‚ฌ์‹ค build ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ๋•Œ spa ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด generate ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด dist๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, ์‚ฌ์‹ค ๋‘˜ ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๋‚˜์ค‘์— ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค.

์š”์•ฝ

๊ตฌ๋ถ„SPAUniversalStatic Web
modespauniversalspa
universal
๋ช…๋ น์–ดnuxt build โ€”spa
nuxt generate โ€”spa
nuxt buildnuxt generate โ€”spa
nuxt generate
ํŠน์ง•Nuxt๋Š” html์ด 1๊ฐœ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ง„์ž…์ ์ด ๋‹ค๋ฆ„SSR์„ ์œ„ํ•œ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•จpre-rendering๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ
๋™์ž‘์ตœ์ดˆ view(๋‚ด์šฉ์ด ๋นˆ html) ์ ‘๊ทผ ํ›„ SPA๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘์ตœ์ดˆ ์ง„์ž…์ ์„ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ํ›„ ์ดํ›„์—๋Š” SPA์ฒ˜๋Ÿผ ๋™์ž‘์ตœ์ดˆ ์ง„์ž…์ ์„ ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง๋œ ํŽ˜์ด์ง€๋กœ ์ ‘๊ทผ ํ›„ ์ดํ›„์—๋Š” SPA์ฒ˜๋Ÿผ ๋™์ž‘
ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ์•ˆ๋ณด์ž„๋ณด์ž„spa ๋ชจ๋“œ: ์•ˆ๋ณด์ž„
universal ๋ชจ๋“œ: ๋ณด์ž„
์„œ๋ฒ„start ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”
์ •์  ํŒŒ์ผ ํ˜ธ์ŠคํŒ…์€ ๋ถˆํ•„์š”
ํ•„์š”๋ถˆํ•„์š”
SEO๋ถˆ๋ฆฌ์œ ๋ฆฌspa ๋ชจ๋“œ: ๋ถˆ๋ฆฌ
universal ๋ชจ๋“œ: ์œ ๋ฆฌ

์œ„์˜ ์„œ๋ฒ„๋Š” ํ˜ธ์ŠคํŒ…์„ ์œ„ํ•œ ์„œ๋ฒ„๋ฅผ ์–˜๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ SSR์„ ์œ„ํ•œ ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค

  • ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ SEO์— ์œ ๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์‡ผํ•‘๋ชฐ, ๋ธ”๋กœ๊ทธ, SNS, ๊ฒŒ์‹œํŒ๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค๋ผ๋ฉด universal ๋ชจ๋“œ๋กœ build & start๋ฅผ ์ด์šฉํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.
  • ์ผ๋ถ€ ํŽ˜์ด์ง€๋งŒ SEO๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ฑฐ๋‚˜ ๋˜๋Š” ํ”„๋กœ๋ชจ์…˜, ๊ธฐ์—…์†Œ๊ฐœ ํ™ˆํŽ˜์ด์ง€ ๋“ฑ ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ์ ๋‹นํ•œ ๊ฒฝ์šฐ์—๋Š” generate๋กœ pre-rendering์„ ์ด์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๊ฒ ๋‹ค.
  • ๋‚ด๋ถ€์šฉ ์„œ๋น„์Šค, ๋กœ๊ทธ์ธ์ด ํ•„์ˆ˜๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, SEO๊ฐ€ ํ•„์š”์—†๋Š” ๊ฒฝ์šฐ์—๋Š” SPA๋ฅผ ์ด์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ๋‹จ, Nuxt์˜ SPA๋Š” ๋ผ์šฐํŠธ๋ณ„๋กœ html์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— vue-cli๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ์ ์ ˆํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๊ณ ๋ คํ•ด์„œ ์“ฐ์ž.

๐Ÿ“‘ ์ •๋ฆฌ

Nuxt์˜ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋ฉฐ ์•Œ์•„๋ณด์•˜๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ SPA์™€ SSR์˜ ์ฐจ์ด๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ์„ ๋ฟ, ์‹ค์ œ๋กœ Nuxt๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š”์ง€๋Š” ๋ชฐ๋ž๋‹ค. Pre-Rendering์ด๋ž€ ๋ญ”์ง€, SSR์— ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š” ์–ธ์ œ์ธ์ง€, SPA๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด์„œ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์„œ๋น„์Šค์˜ ํŠน์ง•์— ๋งž๊ฒŒ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.