[Vue+Nuxt.js] Nuxt.js ๊ธฐ๋ณธ

2022. 5. 17. 21:28ใ†Front-End ์ž‘์—…์‹ค/Nuxt.js

728x90
๋ฐ˜์‘ํ˜•

 

Git Hub

 

 

 

๐Ÿ—‚ ๋ชฉ์ฐจ

โ— [Vue+Nuxt.js] Nuxt.js ๊ธฐ๋ณธ 
โ—[Vue+Nuxt.js] Nuxt.js ์‹œ์ž‘ํ•˜๊ธฐ 
โ— [Vue+Nuxt.js] Nuxt.js Data ํ˜ธ์ถœ ๋ฐฉ์‹๊ณผ API ์—ฐ๋™  
โ—[Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์šฉํ•˜์—ฌ ์‡ผํ•‘ ์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€์™€ ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
โ— [Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์šฉํ•˜์—ฌ ์‡ผํ•‘ ์ƒํ’ˆ ๊ฒ€์ƒ‰ UI ๊ฐœ๋ฐœ
โ—[Vue+Nuxt.js] Vuex๋ฅผ ์ด์šฉํ•˜์—ฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ Page ๋งŒ๋“ค๊ธฐ
โ— [Vue+Nuxt.js] Vuex ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ์ดˆ๊ธฐํ™” ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

 

 

๐Ÿ—‚ ๋ถ€๋ก

โ— [FrontEnd] HMR(Hot Module Replacement)
โ— [Nuxt.js] ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•

โ— V-Model ๋™์ž‘ ์›๋ฆฌ์™€ ํ™œ์šฉ ๋ฐฉ๋ฒ•
โ— [Nuxt.js] NuxtServerInit

 

 

๐Ÿ—‚ ๋‚ด๊ฐ€ ๋งŒ๋‚œ Error

โ— [vuex] expects string as the type, but found undefined.

 

 

 

 

 

 

๐Ÿš€ Nuxt.js๋ž€?

    ๐Ÿ”ฝ  ๊ฐœ์š”

Nuxt ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€

Nuxt๋ž€ Vue.js์˜ Framework์ž…๋‹ˆ๋‹ค.

Vue.js๋Š” JavaScript์˜ Framework์ธ๋ฐ, ์ด๊ฒƒ์— ๋˜ Framework๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์ฐธ๊ณ ๋กœ Framework์™€ Library์˜ ๊ฐ„๋‹จํ•œ ์ฐจ์ด์ ์€ ์–ผ๋งˆ๋‚˜ ์ž์œ ๋„๊ฐ€ ๋†’๋ƒ์ธ๋ฐ, Framework๊ฐ€ ์ž์œ ๋„๊ฐ€ ๋‚ฎ์€ ํŽธ์ด๊ณ , ๊ทธ ๋ง์ธ ์ฆ‰, ์ •ํ•ด์ ธ ์žˆ๋Š” ๊ฒƒ์ด ๋งŽ์•„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Nuxt๋Š” Vue.js๋กœ ๋น ๋ฅด๊ฒŒ ์›น์„ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ธ๋ฐ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ž‘ํ•  ๋•Œ ํ•„์š”ํ•œ Vuex, Router, Axios์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑํ•˜์—ฌ ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (Single Page Application), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(Server Side Rendering), ์ •์  ์›น ์‚ฌ์ดํŠธ(Static Generated Website)๋ฅผ ์‰ฝ๊ฒŒ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ธ ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
Server Side Rendering์ด๋ž€? ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ์„œ๋ฒ„์—์„œ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์„œ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๋กœ ๋ณด๋‚ธ ๋’ค ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹.

 

 

๋ฐ˜์‘ํ˜•

 

 

 

    ๐Ÿ”ฝ  ํŠน์ง•

Nuxt.js์˜ ํŠน์ง•์„ ์š”์•ฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ— ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง ๋ฐฉ์‹
โ— ๊ทœ๊ฒฉํ™”๋œ Packge(ํด๋”) ๊ตฌ์กฐ (layout, sotre, middleware, plugins ๋“ฑ)
โ— pages ํด๋” ๊ธฐ๋ฐ˜ ์ž๋™ ๋ผ์šฐํŒ… ์„ค์ •
โ— ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…
โ— ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์š”์ฒญ ์†์„ฑ
โ— ES6/ES6+ ๋ณ€ํ™˜
โ— ์›นํŒฉ์„ ๋น„๋กฏํ•œ ๊ธฐํƒ€ ์„ค์ •

 

 

 

 

    ๐Ÿ”ฝ  Server Side Rendering

        ๐Ÿ“ฆ ๊ฐœ์š”

Vue Single Page Application์€ Server Side Rendering์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…์ธ Client Side Rendering ๋ฐฉ์‹์ธ ๊ฒƒ์ด์—์š”.

Server Side Rendering ๋ฐฉ์‹์€ ์˜ˆ์ „๋ถ€ํ„ฐ ์ด์–ด์ ธ ๋‚ด๋ ค์˜ค๋Š” ์ „๋ž˜๋™ํ™”์™€ ๊ฐ™์ด ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฒ•์ด์—์š”.

 

 

        ๐Ÿ“ฆ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ฐฉ์‹์„ ์“ฐ๋Š” ๋ชฉ์ ์€ ํฌ๊ฒŒ `๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”`์™€ `๋น ๋ฅธ ํŽ˜์ด์ง€ ๋žœ๋”๋ง`์„ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.
๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๋ž€ ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„์™€ ๊ฐ™์€ ๊ฒ€์ƒ‰ ์‚ฌ์ดํŠธ์—์„œ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ์ด์šฉ์ž์—๊ฒŒ ๋งŽ์ด ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™” ํ•˜๋Š” ๊ธฐ๋ฒ•์ธ ๊ฒƒ์ด์—์š”. ํŠนํžˆ, SNS์—์„œ ๋งํฌ๋ฅผ ๊ณต์œ ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์›น ์‚ฌ์ดํŠธ์˜ ์ •๋ณด๋ฅผ ์ด๋ฏธ์ง€์™€ ์„ค๋ช…์œผ๋กœ ํ‘œ์‹œํ•ด์ฃผ๋Š” OG(Open Graph) Tag๋ฅผ Page ๋ณ„๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง์ด ํšจ์œจ์ ์ด๋ž๋‹ˆ๋‹ค.

`๋น ๋ฅธ ํŽ˜์ด์ง€ ๋žœ๋”๋ง` ๋นˆ ํŽ˜์ด์ง€๊ฐ€ ์ „๋‹ฌ ๋˜์—ˆ์„ ๋•Œ, CSR ๋ฐฉ์‹์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์‹ฌํžˆ ๋‚ด์šฉ์„ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ํ• ํ…๋ฐ, SSR ๋ฐฉ์‹์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ Server์—์„œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด์—์š”. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ์—์„œ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด์šฉ์ž๋Š” ์ €๊ฐ€ํ˜• ์ปดํ“จํ„ฐ๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ์„์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ์ปดํ“จํ„ฐ์—์„œ๋Š” CSR ๋ฐฉ์‹์—์„œ ์ผ์„ ํ•˜๋Š”๊ฒŒ ๋Š๋ฆด ์ˆ˜ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. Server๋Š” ํฌ๊ณ , ๊ฐ€์šฉ์„ฑ์ด ๋†’์€ ์žฅ๋น„๋‹Œ๊นŒ Server์—์„œ ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฉด ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๊ฒ ์ง€์š”!

 

์ถœ์ฒ˜ : https://joshua1988.github.io/vue-camp/nuxt/ssr.html#%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5-%E1%84%89%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B3-%E1%84%85%E1%85%A6%E1%86%AB%E1%84%83%E1%85%A5%E1%84%85%E1%85%B5%E1%86%BC%E1%84%80%E1%85%AA-%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%86%AB%E1%84%90%E1%85%B3-%E1%84%89%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B3-%E1%84%85%E1%85%A6%E1%86%AB%E1%84%83%E1%85%A5%E1%84%85%E1%85%B5%E1%86%BC-%E1%84%8E%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%A5%E1%86%B7

 

๋˜ํ•œ, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ฐฉ์‹์€ ๋นˆ HTML Page๋ฅผ ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ทธ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๊ทธ๋ ค ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์ด์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ํ™”๋ฉด์— ์œ ์˜๋ฏธํ•œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ์‹œ๊ฐ„์ด ๋นจ๋ผ์ง€๋Š” ๊ฒƒ์ด์—์š”.

 

 

        ๐Ÿ“ฆ ๋‹จ์ 

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹จ์ ์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”? ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ฐฉ์‹์€ `Node.js`์™€ ๊ฐ™์€ Backend๋ฅผ ์•Œ์•„์•ผ ํ•˜๊ณ , ์„œ๋ฒ„์ชฝ ํ™˜๊ฒฝ ๊ตฌ์„ฑ๊ณผ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ๋นŒ๋“œ์— ๋Œ€ํ•œ ์ด์• ๊ฐ€ ํ•„์š”ํ•ด์š”. ์ง„์ž… ์žฅ๋ฒฝ์ด ์ข€ ๋†’๋‹ค๋Š” ๊ฒŒ ๋‹จ์ ์ผ ์ˆ˜ ์žˆ๊ฒ ์ง€์š”.

๋˜ํ•œ, `Node.js` ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ๊ด€๋ จ API๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. `Vue Single Page Application`์˜ Life Cycle Hook๊ณผ๋Š” ๋‹ค๋ฅธ ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ Node.js)์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— `beforeCreate`, `created`์—์„œ `window`, `document`์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ต๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜ : https://joshua1988.github.io/vue-camp/nuxt/ssr.html#%E1%84%89%E1%85%A5%E1%84%87%E1%85%A5-%E1%84%89%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B3-%E1%84%85%E1%85%A6%E1%86%AB%E1%84%83%E1%85%A5%E1%84%85%E1%85%B5%E1%86%BC%E1%84%8B%E1%85%B3%E1%86%AF-%E1%84%8B%E1%85%AB-%E1%84%8A%E1%85%B3%E1%86%AF%E1%84%81%E1%85%A1

 

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
Server Side Rendering์˜ ๊ฒฝ์šฐ Component๊ฐ€ ์ตœ์ดˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์ด ๋ธŒ๋ผ์šฐ์ € ์ƒ์ด ์•„๋‹ˆ๋ผ Node.js ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์— beforeCreate๋‚˜ created์—์„œ ๋ธŒ๋ผ์šฐ์ € ๊ฐ์ฒด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  beforeMount๋‚˜, mounted์—์„œ window์™€ document๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

    ๐Ÿ”ฝ  Client Side Rendering

        ๐Ÿ“ฆ ๊ฐœ์š”

URL์ด ๋ณ€๊ฒฝ์ด ๋˜๋ฉด Event(hashchange Event)๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ , ์ด๊ฒƒ์ด ๋ฐ”๋กœ Vue Router์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹ ์ฆ‰, ์ „์ฒด์ ์ธ SPA(Single Page Application)๋Š” ์ด๋Ÿฐ Event๋ฅผ ํ†ตํ•ด ๋™์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ Event๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด SPA์˜ ํŠน์ง•์ธ ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ ๋‘˜์˜ ์ฐจ์ด์ 

๋จผ์ € Client Side Rendering์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Vue Cli๋กœ ์ƒ์„ฑ๋œ Project์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ๊ฒƒ์ด์—์š”.

์•„๋ž˜๋Š” Vue CLI๋กœ ์ƒ์„ฑํ•œ Project ๊ธฐ๋ณธ Code์—์š”.

// src/main.js
import Vue from "vue";
import App from "./App.vue";

new Vue({
	render: (h) => h(App),
}).$mount("#app);

 

์œ„ Code๋Š” Vue์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” Code์ธ๋ฐ, ์ด ๊ฐ์ฒด๋Š” ์•„๋ž˜ index.html ํŒŒ์ผ์˜ app ID๋ฅผ ๊ฐ–๋Š” Tag์— ๋ถ€์ฐฉ์ด ๋˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

<!-- public/index.html -->
<!DOCTYPE html>
<html lang="">
  <head>
    <!-- ... -->
  </head>
  
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

 

CLI๋กœ Project๋ฅผ ์ƒ์„ฑํ•œ ๋’ค `npm run serve`๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ™•์ธํ•˜๋ฉด Vue ๊ธฐ๋ณธ Page๊ฐ€ ๋œฐ ๊ฒƒ์ธ๋ฐ, ์ด ๋•Œ ๊ฐœ๋ฐœ์ž Panel์˜ `Network` Tab์—์„œ `Doc`์œผ๋กœ ํ•„ํ„ฐ๋งํ•œ ๊ฒฐ๊ณผ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ค€๋น„ํ•ด ๋ณด์•˜์–ด์š”.

 

 

์„œ๋ฒ„์—์„œ ๋„˜๊ฒจ๋ฐ›์€ HTML Code์—๋Š” `body` Tag ๋ณธ๋ฌธ์— `<div id="app"></div>` ๋ฐ–์— ์—†์ง€๋งŒ, ํ™”๋ฉด์—๋Š” `Welcome To Your Vue.js App` Text์™€ Image๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์ด๊ฒƒ๋“ค ๋ชจ๋‘ Client(๋ธŒ๋ผ์šฐ์ €)์—์„œ ๋™์ž‘ํ•œ `Vue.js`๊ฐ€ ๊ทธ๋ ค์ค€ ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค. ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™”๋ฉด์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ ค๋‚ธ ๊ฒƒ์ด์—์š”.

์„œ๋ฒ„ ์‚ฌ์ด๋“œ์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋Š” ๋ฐ”๋กœ ์–ด๋””์„œ ํ™”๋ฉด์— ๋ณด์ผ ๋‚ด์šฉ์„ ๊ทธ๋ฆฌ๋Š๋ƒ์˜ ์ฐจ์ด์ธ ๊ฒƒ์ด์—์š”. ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์€ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์€ ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋‹ค ๊ทธ๋ ค ๋ธŒ๋ผ์šฐ์ €์— ๋˜์ ธ์ฃผ๋Š” ๋ฐฉ์‹์ธ ๊ฒƒ์ด์—์š”.

 

์ถœ์ฒ˜ : https://joshua1988.github.io/vue-camp/nuxt/ssr.html#%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%86%AB%E1%84%90%E1%85%B3-%E1%84%89%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B3-%E1%84%85%E1%85%A6%E1%86%AB%E1%84%83%E1%85%A5%E1%84%85%E1%85%B5%E1%86%BC

 

 

        ๐Ÿ“ฆ Client Side Rendering

https://careers.google.com/

 

๋จผ์ € CSR ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Vue.js๋กœ ๋งŒ๋“ค์–ด์ง„ Google์˜ Careers Homepage๋ฅผ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•ด์š”.

๊ฐœ๋ฐœ์ž ๋„๊ตฌ(F12 Key)์—์„œ `Network` Tab์— ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Filter๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

 

 

์ผ๋‹จ ์ง€๊ธˆ์€ `All` Filter (์•„๋ฌด Filter๋ฅผ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค.) ์ƒํƒœ์ธ๋ฐ, ์—ฌ๊ธฐ์„œ `Doc(Document)` Tab์„ ์„ ํƒํ•ด์„œ Server์—์„œ ๋ฐ›์•„์˜จ Data๋ฅผ ํ™•์ธํ•ด ๋ณผ ๊ฒƒ์ด์—์š”.

 

 

์—ฌ๊ธฐ์„œ ๋งจ ์œ„์— careers.google.com Document์˜ Response(์‘๋‹ต)์„ ์„ ํƒํ•ด์„œ ํ™•์ธ ํ•ด ๋ณด๋ฉด

 

 

์ด๋ ‡๊ฒŒ ์‘๋‹ต์ด ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„์˜ 93๋ฒˆ์งธ ์ค„ `<div id="app-root"></div>`๋ฅผ ๋ณด๋ฉด div Tag์•ˆ์— ์–ด๋–ค ๋‚ด์šฉ๋„ ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ๋ฐ, ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์š”์†Œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณด๋ฉด ์ •๋ง ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ๋งŽ์€ Tag๋“ค์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋ž˜์•ผ์ง€ ํ™”๋ฉด์ด ๋‚˜์˜ฌํ…Œ๋‹Œ๊นŒ์š”!

์ฆ‰, ์œ„์—์„œ ๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์ด SPA(Single Page Application)๋‚˜, CSR(Client Side Rendering) ๋ฐฉ์‹์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ html์„ ๋ฐ›์•„์™”์„ ๋•Œ, `<div id="app-root"></div>`์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 

 

        ๐Ÿ“ฆ Server Side Rendering

์ด๋ฒˆ์—๋Š” ์บกํ‹ดํŒ๊ต๋‹˜์˜ Blog๋ฅผ ํ•œ๋ฒˆ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ํ™•์ธํ•ด ๋ณผ๊ฒŒ์š”.

 

์œ„์˜ CSR๊ณผ์˜ ์ฐจ์ด์ ์€ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ๋ณด๋ฉด CSR๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ชจ๋“  Text, html Tag ๋“ฑ์˜ ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

    ๐Ÿ”ฝ Nuxt.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€์ 

Nuxt.js๋กœ ๊ฐœ๋ฐœํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ : Nuxt.js ์‹œ์ž‘ํ•˜๊ธฐ - ์ธํ”„๋Ÿฐ

                  Cracking Vue.js

 

 

 

728x90
๋ฐ˜์‘ํ˜•