๐จ ๊ทธ๋์์ ์คํด
๋๋ ๊ทธ๋์ 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>
๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.


3. ํ๋ก์ ํธ ๋น๋
package.json์๋ ์คํฌ๋ฆฝํธ๊ฐ ์์ฑ๋์ด ์๋๋ฐ, serve๋ ๊ฐ๋ฐ์ฉ ์ฑ์ ์คํ์ํฌ ๋, lint๋ ์ฝ๋ ์คํ์ผ๋ง๊ณผ ๊ด๋ จํ ์คํฌ๋ฆฝํธ์ด๋ build ๋ช
๋ น์ด๋ฅผ ์คํํด๋ณด์.
yarn build
๋น๋๋ฅผ ๋ง์น๋ฉด ํ๋ก์ ํธ ํด๋์๋ dist ํด๋๊ฐ ์๊ฒจ์๊ณ ํด๋ ์์๋ ๋น๋๋ ์น์ ๋ด์ฉ๋ฌผ์ด ๋ค์ด์์ ๊ฒ์ด๋ค.

์ ๊ฒฐ๊ณผ๋ฌผ์ ์๋ฒ์ ์ ๋ก๋ํ๋ฉด SPA๋ ๋ฐฐํฌ๋๊ณ ๋ฐ๋ก ์ ์ํ ์ ์๋ค. ์ด๋ฐ ๊ณผ์ ์ ํตํด SPA๋ ๋ฐฐํฌ๊ฐ ๊ฐ๋จํ๋ค๋ ์ฅ์ ์ด ์์ ์ ์๋ ๊ฒ์ด๋ค.
๋น๋๋ ์ฑ์ ์คํ์์ผ๋ณด์.
// ํ๋ก์ ํธ ๋ฃจํธ์์ ๋ช
๋ น์ด ์ฌ์ฉ
npx serve dist
npx serve๋ช ๋ น์ด๋ ๊ฐ๋จํ ์น์๋ฒ๋ฅผ ์ค์ ์์ด ๋ฐ๋ก ์คํํ ์ ์๊ฒ ๋์์ค๋ค. npx์ serve๋ ๋ฐ๋ก ์ฐพ์๋ณด๊ฑฐ๋ ์ผ๋จ ๋์ด๊ฐ๋๋ก ํ์.
4. ๊ฒฐ๊ณผ ํ๋ฉด

npx serve dist๋ฅผ ํตํด ์น์ฑ์ ์คํ์ํค๊ณ ํด๋น ์ฃผ์๋ก ๋ค์ด๊ฐ๋ฉด ์น์ด ์คํ๋ ๊ฑธ ํ์ธํ ์ ์๋ค. ๋ํ, ํฌ๋กฌ ์ฝ์(์ด๋ฏธ์ง๋ ๋ค์ด๋ฒ ์จ์ผ)์ ํตํด ๊ฒ์ฌ๋ฅผ ํ๋ฉด body ํ๊ทธ ์์ ํ๋ฉด์ ๊ตฌ์ฑํ๋ ํ๊ทธ๋ค์ด ์์์ ์ ์ ์๋ค.
์ด๋ฒ์ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ง์ฐ์ค ์ฐํด๋ฆญ ํ์ฌ ํ์ด์ง ์์ค๋ณด๊ธฐ๋ฅผ ํตํด ์ดํด๋ณด์.

์์ ํ๋ฉด์ ํ์ด์ง ์์ค ๋ณด๊ธฐ๋ฅผ ํตํด ๋ณธ ํ๋ฉด์ด๋ค. ์ด๋ฏธ์ง์ ์ค๋ฅธ์ชฝ ์๋ <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 ํ๋ ์์ํฌ๋ฅผ ์ ํํ๋ค.

2. ๋ชจ๋
Nuxt์๋ ๋ ๊ฐ์ง ํ๋ก์ ํธ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ค.
- spa
- universal
์ ๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ํตํด Nuxt๋ SPA์ SSR ๊ทธ๋ฆฌ๊ณ Static Web์ ๊ตฌํํ ์ ์๋ค. ๋ชจ๋๋ ํ๋ก์ ํธ์ nuxt.config.js์์ ๊ฐ์ ๋ฐ๊ฟ์ค๋ ๋๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ <๋ช
๋ น์ด> --spa๋ผ๋ ์ต์
์ ๋ถ์ฌ์ค์ผ๋ก์จ๋ ์คํ์ด ๊ฐ๋ฅํ๋ค.

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

dev ๋ช
๋ ์ด๋ฅผ ์คํ์ํค๊ธฐ ์ ๊ณผ์ ์ฐจ์ด๋ ํ๋ก์ ํธ์ .nuxt๋ผ๋ ํด๋๊ฐ ์๊ฒผ๋ค๋ ๊ฒ์ด๋ค. vue-cli์ dist์ ๊ฐ์ ์ญํ ์ ํ๋ ๊ฒ. ์ผ๋จ ์๋ฒ๊ฐ ๋์์ก์ผ๋ ์ ์ํด๋ณด์. (http://localhost:3000)


์ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ์ฐจ์ด๋ฅผ ์๊ฒ ์ง๋ง, ์ด์ vue-cli๋ฅผ ์ด์ฉํ์ ๋์๋ ๋ค๋ฅด๊ฒ ํ์ด์ง ์์ค ๋ณด๊ธฐ์๋ ๋ฏธ๋ฆฌ ์์ฑ๋ ์ฝ๋๋ค์ด ๋ณด์ด๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด SSR์ด ์ ์ฉ๋์๋ค๋ ๊ฒ์ ์ ์ ์๊ณ , ์ด์ด์ ๋ฏธ๋ฆฌ ์ถ๊ฐํด๋ ๋ค๋ฅธ ํ์ด์ง(http://localhost:3000/sub)๋ ๊ฐ์์ง ํ์ธํด๋ณด์.


๋ค๋ฅธ route(URL)๋ฅผ ๊ฐ์ง ํ์ด์ง๋ ๋ง์ฐฌ๊ฐ์ง์ธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
3.1.2. ๋ชจ๋ spa
์ด๋ฒ์ spa ๋ชจ๋๋ก dev ๋ช
๋ น์ด๋ฅผ ์คํํด๋ณด์.
// package.json
module.exports = {
mode: "spa",
...
}
yarn dev
// ๋๋
yarn dev --spa


spa ๋ชจ๋๋ก ์คํ์ ์์ผฐ๋๋, ๋ณด์ฌ์ง๋ view๋ ๊ฐ์ง๋ง ํ์ด์ง ์์ค ๋ณด๊ธฐ์์ universal ๋ชจ๋์์ ์ฐจ์ด๋ฅผ ๋๋ ์ ์๋ค.
3.1.3. ์ ๋ฆฌ
ํ๋ก์ ํธ ๋ชจ๋๋ฅผ universal๊ณผ spa์ค ์ด๋ค ๋ชจ๋๋ฅผ ์ ํํ๋๋์ ๋ฐ๋ผ ๊ฐ๋ฐ์๋ฒ๋ฅผ ์คํํ์ ๋์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋์์ ์ ์ ์๋ค.
4. build & start
build์ start ๋ช
๋ น์ด๋ ๋ฌถ์ด์ ํ์ธํด๋ณด์. vue-cli์ build์ ๊ฐ์ ์ญํ ์ ํ ํ
๋ฐ ๋ค๋ง buildํ ๊ฒฐ๊ณผ๋ฌผ์ start ๋ช
๋ น์ด๋ก ์คํ์ ์ํฌ ์ ์๋ค. production(๋ฐฐํฌ) ์ฉ ์์ ์ธ์งํ์.
build์ start ๋ช
๋ น์ด๋ฅผ ๊ณต์ํํ์ด์ง์์๋ ์ด๋ ๊ฒ ์ค๋ช
ํ๊ณ ์๋ค.
- build
Webpack์ ํตํด ์ดํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ฉฐ, CSS์ JS๋ฅผ ์ต์ํํ๋ ์์ ์ ์งํํฉ๋๋ค.(ํ๋ก๋์ ์ฉ์ผ๋ก)- start
ํ๋ก๋์ ๋ชจ๋๋ก ์๋ฒ๋ฅผ ์์ํฉ๋๋ค.๏ผnuxt build๋ฅผ ์คํํ ํ์๏ผ
build์ start ๋ช
๋ น์ด๋ ๋ชจ๋ ๋ณ ์ฐจ์ด๋ฅผ ํ์ธํด๋ณด์.
4.1.1. ๋ชจ๋ universal
// package.json
module.exports = {
mode: "universal",
...
}
yarn build

dev ๋ช
๋ ์ด๋ฅผ ์ฌ์ฉํ์ ๋์๋ ๋ค๋ฅด๊ฒ, .nuxtํด๋ ์์ distํด๋๊ฐ ์ถ๊ฐ๋ก ์๊ฒผ๋ค. ํด๋น ํ์ผ๋ค์ ์ด์ฉํด ์๋ฒ๋ฅผ ๋์ด๋ค๋ ๊ฒ ์ ๋๋ง ์๊ณ ๋์ด๊ฐ์. (์ฌ์ค ์ ๋ชจ๋ฅธ๋ค.) ์ด์ด์ start๋ฅผ ๋ณด์.
yarn start

ํฐ๋ฏธ๋์ ๋ณด๋ฉด production ๋ชจ๋๋ก ์๋ฒ๊ฐ ์ฌ๋ผ๊ฐ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.


์ ์ด๋ฏธ์ง๋ฅผ ์ดํด๋ณด๋ฉด 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์ ํ๋ฆ์ ๋ฐ๋ฅธ๋ค. ์๋์ ์ด๋ฏธ์ง๋ฅผ ํ์ธํด๋ณด์.

๋จผ์ URL๋ก ์ ๊ทผ์ ์๋ํ๋ฉด ํ๋ฉด์ด ๊น๋นก๊ฑฐ๋ฆฌ๋ฉฐ ๋ค์ ๊ทธ๋ ค์ง๋ ๊ฒ์ ์ฝ์์ ํตํด ํ์ธํ ์ ์๋ค.

๊ทธ๋ฌ๋ ์ด๊ธฐ ์ง์ ์ดํ์ ์ฑ ๋ด ๋งํฌ๋ฅผ ํตํด ์ด๋ํ๋ฉด ๋ฐ๋ ํ๋ฉด ๋ถ๋ถ๋ง ๋ ๋๋ง์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ ํ์ด์ง๊ฐ SSR์ด ๋๋ ์ฅ์ ๋, ๊ทธ ์ดํ์๋ SPA์ ์ฅ์ ๋ํ ๊ฐ์ง ์ ์๋ค.
์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ข๊ฒ ๋ค.
4.1.2. ๋ชจ๋ spa
// package.json
module.exports = {
mode: "spa",
...
}
yarn build
// ๋๋
yarn build --spa

universal ๋ชจ๋์๋ ๋ค๋ฅด๊ฒ, serverํด๋์ ๊ตฌ์ฑ์ด ์ข ๋ค๋ฅธ ๊ฒ์ด ๋ณด์ธ๋ค. ์ด๋ฒ์๋ start๋ฅผ ํตํด ํ์ธํด๋ณด์.
yarn start
// ๋๋
yarn start --spa
mode๋ฅผ
spa๋ก ๋ฐ๊พธ์ง ์์๋ค๋ฉด--spa์ต์ ์ ๊ผญ ๋ถ์ฌ์ฃผ์ด์ผ ํจ. ๊ทธ๋ ์ง ์์ผ๋ฉด ์คํ์ด ๋์ง ์๋๋ค!


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

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

universal ๋ชจ๋์๋ ๋ค๋ฅด๊ฒ html์ ๋ด์ฉ์ด ์ฑ์์ ธ์์ง ์๋ค. SPA์ ํน์ง์ด๋ค. ํ์ง๋ง dist ํด๋๋ฅผ ๋ณด๋ฉด route ๋ณ๋ก index ํ์ผ์ด ์๊ฒจ์๋ค.
์ฌ์ค build ๋ช
๋ น์ ์ฌ์ฉํ ๋ spa ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด generate ํ ๊ฒ๊ณผ ๊ฐ์ด dist๊ฐ ์๊ธฐ๋๋ฐ, ์ฌ์ค ๋ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค. ๋์ค์ ์์๋ด์ผ๊ฒ ๋ค.
์์ฝ
| ๊ตฌ๋ถ | SPA | Universal | Static Web |
|---|---|---|---|
| mode | spa | universal | spa universal |
| ๋ช ๋ น์ด | nuxt build โspa nuxt generate โspa | nuxt build | nuxt 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๋ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์์ง์ ๋ํด์ ์ ์ดํดํ๊ณ ์์ด์ผ ํ๋ค. ๊ทธ๋์ผ ๊ตฌํํ๋ ค๋ ์๋น์ค์ ํน์ง์ ๋ง๊ฒ ์ ์ ํ ๋ฐฉ๋ฒ์ ๊ณ ๋ฅผ ์ ์๊ฒ ๋ค.