# ์ ๋๋ฒ์ค(Universal) ๋ชจ๋๋?
์ด๋ฒ ๊ธ์์๋ Nuxt์ ๋ ๋๋ง ๋ชจ๋ ์ค ํ๋์ธ ์ ๋๋ฒ์ค ๋ชจ๋์ ๊ฐ๋ ๊ณผ ๋์ ์๋ฆฌ์ ๋ํด์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
# Nuxt ๋ชจ๋
Nuxt๋ฅผ ์ฒ์ ์ค์นํ ๋ ๋ค์์ ๋ ๊ฐ์ง ๋ ๋๋ง ๋ชจ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
- Universal
- Single Page App
๊ณต์๋ฌธ์ (opens new window)์์๋ ์ ๋๋ฒ์ค ๋ชจ๋๋ฅผ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ค๋น๊ฒ์ด์ (Client Side Navigation)์ ์กฐํฉ์ผ๋ก ์ค๋ช ํ๊ณ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ค๋น๊ฒ์ด์ ์ด๋ ๋ธ๋ผ์ฐ์ ์์ ํ์ด์ง ๊ฐ ์ด๋์ ํด๋ผ์ด์ธํธ ์ชฝ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ฐํ ์ผ๋ก ์ด๋ํ๋ ๋ฐฉ์์ ์๋ฏธํฉ๋๋ค. ์น ์๋น์ค ํ์ด์ง๋ฅผ ์ต์ด๋ก ์ ๊ทผํ ๋๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๋ฐฉ์์ผ๋ก ํ๋ฉด์ ๊ทธ๋ ค์ฃผ์ง๋ง ์ดํ์ ํด๋น ์๋น์ค ๋ด์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ฐํ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋๋ฒ์ค ๋ชจ๋์ ๋๋ค.
์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ์กด์ Vue๊ฐ ์ ๊ณตํ๋ ๋ฐฉ์๊ณผ ๋์ผํ๋ ๋ณธ๋ฌธ์์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค.
# ์ ๋๋ฒ์ค ๋ชจ๋์ ๋ฑ์ฅ
์ด์ ํฌ์คํธ์ธ Server Side Rendering์์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฐจ์ด๋ฅผ ๋ฐฐ์ ์ต๋๋ค. ์์ฝํ๋ฉด ๊ธฐ์กด์ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์์ง ์ต์ ํ(Search Engine Optimization) ๋ฌธ์ ์ ํ์ด์ง ๋ ๋๋ง ์๋ ๋ฌธ์ ๋ฅผ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ด ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ด ์์ ์ด์์ต๋๋ค.
ํ์ง๋ง ์น์ ์ญ์ฌ๋ฅผ ๋ณด๋ฉด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์๋ก์ด ๊ฐ๋ ์ด ์๋๋๋ค. ๋์ค์ ์ธ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฑ์ฅํ๊ธฐ ์ ๊น์ง๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ฉํฐ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ธ์์ต๋๋ค. ๋ค๋ง, ํ๋ฉด ์ ์ฒด ๋๋ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์๋ฒ ์ธก ๋ ๋๋ง์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊น๋นก์์ด ๋ฐ์ํ ์๋ฐ์ ์์๊ณ , ๊ฒฐ๊ตญ ๊น๋นก์์ด ์๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ๊ธฐ๋ฐ์ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ ค๋๊ฒ ๋์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ SEO๋ฅผ ํฌ๊ธฐํ๊ณ ๋ค์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ผ๋ก ํ๊ทํด์ผ ํ ๊น์? ์๋๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ธฐํ๊ณ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ๊ณ ์งํด์ผ ํ ๊น์? ๋์ ์ฅ๋จ์ ์ ๋ถ๋ช ํ๊ธฐ ๋๋ฌธ์ ํ์ชฝ๋ง ์ ํํ๋ฉด ๋ฐ๋์ ๊ธฐํ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
๊ทธ๋์ Nuxt๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ๋ชจ๋ ์ ํํ๊ธฐ๋ก ํ์ต๋๋ค. Nuxt ์ฑ์ ์ฒซ ๋ฐฉ๋ฌธํ ๋๋ ์๋ฒ์์ ๊ทธ๋ฆฌ๊ณ ์ดํ ํ์ด์ง ๊ฐ ์ด๋์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ๊ทธ๋ฆฌ๊ธฐ๋ก ๋ง์ด์ฃ . ์ด๋ฅผ ์ํด์ Nuxt๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ํ์ด๋๋ ์ด์ (Client Side Hydration)๊ณผ ์ฝ๋ ๋ถํ (Code Splitting), ํ๋ฆฌํจ์นญ(Prefetching)์ ํ์ฉํ๊ณ ์์ต๋๋ค.
# ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ํ์ด๋๋ ์ด์
ํ์ด๋๋ ์ด์ ์ ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ ์ HTML์ ์ฌ์ฉ์์ ์ํธ์์ฉํ ์ ์๋ ๋ค์ด๋๋ฏน DOM์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ๋๋ฒ์ค ๋ชจ๋์์ Nuxt ์ฑ์ ์ฌ์ฉ์๊ฐ ์ต์ด ์ ๊ทผ์ ํ๋ฉด ์๋ฒ๋ก๋ถํฐ ์ ์ HTML์ ๋ฐ๋ ๋์์ HTML์ ๋ค์ด๋๋ฏน DOM์ผ๋ก ๋ฐ๊ฟ์ค ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ํจ๊ป ๋ฐ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์์จ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ํตํด ์ด๋ฏธ ๊ทธ๋ ค์ง ์ ์ HTML์ ๋ฆฌ๋ ๋๋ง(Re-rendering) ์์ด ์ฌ์ฉ์์ ์ํธ์์ฉ ํ ์ ์๋ ๋ค์ด๋๋ฏน DOM ์ํ๋ก ๋ฐ๊ฟ์ค๋๋ค.
# ์ฝ๋ ๋ถํ
์ฝํธ ๋ถํ ์ ๋ง ๊ทธ๋๋ก ์ฝ๋ ์ ์ฒด๋ฅผ ๋ก๋ํ์ง ์๊ณ ๋ถํ ํด์ ํ์์ ๋ง๊ฒ ๋ฒ๋ค๋ก ๋๋ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ์ํ ๋ฒ๋ค๋ง ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ๋ก๋ฉ ์๋๊ฐ ๋นจ๋ผ์ง๋ ์ฅ์ ์ด ์์ต๋๋ค.
Nuxt ์ฑ์์๋ ์ต์ด ์ ๊ทผํ ๋ ์๋ฒ๋ก๋ถํฐ ์ ์ HTML์ ๋ฐ์์ง๋ง, ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ๋๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ๋ ๋๋ง์ ํฉ๋๋ค. ์ด๋ ๋ ๋๋ง์ฉ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ด ํ์ํ๋ฐ, ์ ๋๋ฒ์ค ๋ชจ๋์์๋ ์๋ ์ฝ๋ ๋ถํ ์ ํตํด ๋น์ฅ ๋ฐฉ๋ฌธํ ํ์ด์ง์ ๋ ๋๋ง์ ํ์ํ ๋ฒ๋ค๋ง ์๋ฒ๋ก๋ถํฐ ๊ฐ์ ธ์ต๋๋ค.
TIP
์ฐธ๊ณ ๋ก, ๋ค์ด๋ก๋ํ ๋ฒ๋ค๋ค์ ์บ์ฑ์ด ๋ผ์ ์ฌํ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ์ฌ์์ฒญํ ํ์๊ฐ ์์ต๋๋ค.
# ํ๋ฆฌํจ์นญ
๊ทธ๋ ๋ค๋ฉด Nuxt๋ ๋ ๋๋ง์ ๋น์ฅ ์ค๋นํด์ผ ํ๋ ํ์ด์ง๋ฅผ ์ด๋ป๊ฒ ๊ตฌ๋ถํ๊ณ ์์๊น์? ์ฌ์ฉ์๊ฐ <NuxtLink>
๋ฅผ ํด๋ฆญํ๋ฉด ์ด๋ํ ํ์ด์ง๋ฅผ ์ํ ๋ ๋๋ง์ฉ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์์ฌ๊น์? ์๋ฒ์์ ์์ ํ ๋ ๋๋ง๋ HTML ํ์ผ์ ๋ถ๋ฌ์ค๋ ๊ฒ๋ณด๋ค ๋ ๋๋ง์ ํ์ํ ๋ฒ๋ค๋ง ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ ๋น ๋ฅด๊ฒ ์ง๋ง ๊ทธ๋๋ ๋คํธ์ํฌ ์ง์ฐ์ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋์ Nuxt๋ ์ข ๋ ๋งค๋๋ฌ์ด ํ์ด์ง ์ด๋์ ์ํด์ ํ๋ฉด์ ๋ณด์ด๋ <NuxtLink>
๋ค์ ํํด์ ํด๋น ํ์ด์ง๋ค์ ๋ ๋๋งํ๋๋ฐ ํ์ํ ํ์ผ๋ค์ ๋ฏธ๋ฆฌ ์๋ฒ์ ์์ฒญํฉ๋๋ค. ์ค์ ๋ก ์ธํฐ์น์
์ต์ ๋ฒ(Intersection Observer)๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ทฐํฌํธ(Viewport)์ ์ด๋ํ ํ์ด์ง ๋งํฌ๊ฐ ๋ณด์ด๊ธฐ๋ง ํ๋ฉด ์๋ฒ์ ๋ฐ๋ก ๋ฒ๋ค์ ์์ฒญํฉ๋๋ค. ๋๋ถ์ ์ฌ์ฉ์๊ฐ ๋งํฌ๋ฅผ ์ธ์งํ๊ณ ํด๋ฆญํ๊ธฐ๋ ์ ์ ์ด๋ฏธ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ํ ์ค๋น๊ฐ ๋์ด์๋ ๊ฒ์ด์ฃ . ์ด๋ ๊ฒ ์ฌ์ฉ์๊ฐ ํจ์นญ์ ์๊ตฌํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ํจ์นญํ๊ธฐ ๋๋ฌธ์ ํ๋ฆฌํจ์นญ์ด๋ผ๊ณ ํฉ๋๋ค.
์๋์ ์์์ ๋ทฐํฌํธ์ ์๋ก์ด <NuxtLink>
๊ฐ ๋ฑ์ฅํ ๋๋ง๋ค ์๋ฒ๋ก๋ถํฐ ๋ ๋๋ง์ ํ์ํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ์์ค๋ ์ฅ๋ฉด์
๋๋ค. ์ด ๋๋ถ์ ๋ณด์๋ ๊ฒ์ฒ๋ผ ๋น ๋ฅด๊ฒ ํ์ด์ง๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
์์ ๋ฐ๋ชจ ์ฌ์ดํธ๋ Prefetching Demo (opens new window)์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
# ์ ๋๋ฒ์ค ๋ฐฐํฌ
์์์ ์ค๋ช ํ ๋ด์ฉ๋ค์ ์์ฝํ๋ฉด ์ ๋๋ฒ์ค ๋ชจ๋๋ ํ์ด๋๋ ์ด์ , ์ฝ๋ ๋ถํ , ํ๋ฆฌํจ์นญ์ ํตํด ์น ์๋น์ค ํ์ด์ง ์ฒซ ์ ๊ทผ ์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฌ์ฉํ๊ณ ์ดํ ํ์ด์ง ๊ฐ ์ด๋์๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฌ์ฉํ๋ ๋ชจ๋๋ผ๋ ๊ฒ์ ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก, ์ ๋๋ฒ์ค์ ๋ฐฐํฌ ๋์ ์ค์ ์ ๋ฐ๋ผ ์๋ฒ ์ธก์์ ๋ ๋๋งํ๋ ๋ฐฉ์์ธ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ๋น๋ ๋จ๊ณ์์ ํ๋ฆฌ๋ ๋๋ง(Pre-rendering)ํ๋ ๋ฐฉ์์ธ ์ ์ ์ฌ์ดํธ ์ ๋ค๋ ์ด์
(Static Site Generation)์ผ๋ก ํ ๋ฒ ๋ ๋๋ฉ๋๋ค. ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ํด๋ผ์ด์ธํธ ์ธก์ผ๋ก๋ถํฐ ์์ฒญ์ด ์ฌ ๋๋ง๋ค ๋ ๋๋ง์ ํ์ํ ๋ฐ์ดํฐ๋ค์ ์๋ฒ์์ asyncData
์ fetch
๋ฅผ ํตํด ์๋กญ๊ฒ ๊ฐ์ ธ์์ ํ์ด์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค.
// nuxt.config.js
export default {
target: 'server' // ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
}
๋ฐ๋ฉด์ ์ ์ ์ฌ์ดํธ ์ ๋ค๋ ์ด์ ์ ๋น๋ ๋จ๊ณ์์ ๋ ๋๋ง์ ํ์ํ ๋ฐ์ดํฐ๋ค์ ๊ฐ์ ธ์ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํด๋๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๊ธฐ ์ ์ ์ด๋ฏธ ์ ์ HTML์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ดํ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ์ค๋ฉด ์๋ฒ์์ ๋ฆฌ๋ ๋๋ง์์ด ๋น๋ ๋จ๊ณ์์ ์ด๋ฏธ ๋ง๋ค์ด์ง ์ ์ HTML์ ๋ฐํํ๋ฏ๋ก ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค.
// nuxt.config.js
export default {
target: 'static' // ์ ์ ์ฌ์ดํธ ์ ๋ค๋ ์ด์
}
์ด๋ฌํ ์ฑ์ง๋ค ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณํ๋ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ค๋ฉด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ด ์ ํฉํ๊ณ ๋ธ๋ก๊ทธ์ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ฐ๋์ง ์๋ ๊ฒฝ์ฐ์๋ ์ ์ ์ฌ์ดํธ ์ ๋ค๋ ์ด์ ์ด ๋ ์ ํฉํฉ๋๋ค.
๋ ์์ธํ ๋ด์ฉ์ Nuxt ๋ฐฐํฌ์์ ํ์ธํ ์ ์์ต๋๋ค.