๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/Vue.js

Vue.js - SPA, CSR,SSR,SEO,Vue.js์˜ ๊ฐœ๋…๊ณผ ์—ญํ• , MVVM

by DevIseo 2022. 5. 7.

๐Ÿ””INTRO

|SPA (Single Page Application)

  • Single Page Application (๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)
  • ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž์™€ ์†Œํ†ตํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ๋‹จ์ผ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ตœ์ดˆ์—๋งŒ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ์ดํ›„์—๋Š” ๋™์ ์œผ๋กœ DOM์„ ๊ตฌ์„ฑ
    • ์ฒ˜์Œ ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์€ ์ดํ›„๋ถ€ํ„ฐ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํ˜„์žฌ ํŽ˜์ด์ง€ ์ค‘ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋™์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•จ
  • ์—ฐ์†๋˜๋Š” ํŽ˜์ด์ง€ ๊ฐ„์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ํ–ฅ์ƒ
    • ๋ชจ๋ฐ”์ผ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๋Š” ํ˜„์žฌ ํŠธ๋ž˜ํ”ฝ์˜ ๊ฐ์†Œ์™€ ์†๋„, ์‚ฌ์šฉ์„ฑ, ๋ฐ˜์‘์„ฑ์˜ ํ–ฅ์ƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ๋™์ž‘ ์›๋ฆฌ์˜ ์ผ๋ถ€๊ฐ€ CSR(Client Side Rendering)์˜ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ„

 

 

|SPA ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

  • ๊ณผ๊ฑฐ ์›น ์‚ฌ์ดํŠธ๋“ค์€ ์š”์ฒญ์— ๋”ฐ๋ผ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์Œ
    • MPA (Multi Page Application)
  • ์Šค๋งˆํŠธํฐ์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”์˜ ํ•„์š”์„ฑ์ด ๋Œ€๋‘๋จ
    • ๋ชจ๋ฐ”์ผ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ์›น ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•ด์ง
  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Vue.js์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ(Front-End) ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋“ฑ์žฅ
    • CSR(Client Side Rendering), SPA(Single Page Application)์˜ ๋“ฑ์žฅ
  • 1๊ฐœ์˜ ์›น ํŽ˜์ด์ง€์—์„œ ์—ฌ๋Ÿฌ ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๋ฉฐ ๋ชจ๋ฐ”์ผ ์•ฑ๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณต

 

 

|CSR

  • Client Side Rendering
  • ์„œ๋ฒ„์—์„œ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” SSR ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ™”๋ฉด์„ ๊ตฌ์„ฑ
  • ์ตœ์ดˆ ์š”์ฒญ ์‹œ HTML, CSS, JS ๋“ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์™ธํ•œ ๊ฐ์ข… ๋ฆฌ์†Œ์Šค๋ฅผ ์‘๋‹ต๋ฐ›๊ณ  ์ดํ›„ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•ด JS๋กœ DOM์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹
  • ์ฆ‰, ์ฒ˜์Œ์—” ๋ผˆ๋Œ€๋งŒ ๋ฐ›๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ ์œผ๋กœ DOM์„ ๊ทธ๋ฆผ
  • SPA๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ Œ๋”๋ง ๋ฐฉ์‹

์žฅ์ 

  1. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ
    • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์ดˆ์— ํ•œ ๋ฒˆ ๋‹ค์šด๋กœ๋“œ ํ›„ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐฑ์‹ 
  2. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ํ–ฅ์ƒ
    • ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„๋งŒ์„ ๊ฐฑ์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ๋‹จ์ 
  • SSR์— ๋น„ํ•ด ์ „์ฒด ํŽ˜์ด์ง€ ์ตœ์ข… ๋ Œ๋”๋ง ์‹œ์ ์ด ๋А๋ฆผ
  • SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)์— ์–ด๋ ค์›€์ด ์žˆ์Œ (์ตœ์ดˆ ๋ฌธ์„œ์— ๋ฐ์ดํ„ฐ ๋งˆํฌ์—…์ด ์—†๊ธฐ ๋•Œ๋ฌธ)

 

 

|SSR(Server Side Rendering)

  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€๋ฅผ ๋ชจ๋‘ ๊ตฌ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
  • JS ์›น ํ”„๋ ˆ์ž„์›Œํฌ ์ด์ „์— ์‚ฌ์šฉ๋˜๋˜ ์ „ํ†ต์ ์ธ ๋ Œ๋”๋ง ๋ฐฉ์‹

์žฅ์ 

  1. ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„๊ฐ€ ๋น ๋ฆ„
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ปจํ…์ธ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ
  2. SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)์— ์ ํ•ฉ
    • DOM์— ์ด๋ฏธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‘์„ฑ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ

๋‹จ์ 

  • ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ „๋‹ฌ
  • ๋ฐ˜๋ณต๋˜๋Š” ์ „์ฒด ์ƒˆ๋กœ๊ณ ์นจ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋–จ์–ด์ง
  • ์ƒ๋Œ€์ ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์•„ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์ด ํด ์ˆ˜ ์žˆ์Œ

 

 

|CSR &SSR

  • ๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด๋Š” ์ตœ์ข… HTML ์ƒ์„ฑ ์ฃผ์ฒด๊ฐ€ ๋ˆ„๊ตฌ์ธ๊ฐ€์— ๋”ฐ๋ผ ๊ฒฐ์ •
  • ์ฆ‰, ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์— ๊ทธ๋ ค์งˆ(๋ Œ๋”๋ง) HTML์„ ์„œ๋ฒ„๊ฐ€ ๋งŒ๋“ ๋‹ค๋ฉด SSR / ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งŒ๋“ ๋‹ค๋ฉด CSR
  • SSR๊ณผ CSR์„ ๋‹จ์ˆœ ๋น„๊ตํ•˜์—ฌ ‘์–ด๋–ค ๊ฒƒ์ด ๋” ์ข‹๋‹ค’๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‚ด ์„œ๋น„์Šค ๋˜๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์— ๋งž๋Š” ๋ฐฉ๋ฒ•์„ ์ ์ ˆํ•˜๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”
  • ์˜ˆ๋ฅผ ๋“ค์–ด, Django์—์„œ Axios๋ฅผ ํ™œ์šฉํ•œ ์ข‹์•„์š”/ํŒ”๋กœ์šฐ ๋กœ์ง์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์€ Server์—์„œ ์™„์„ฑ๋œ HTML์„ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์กฐ (SSR)
  • ๋‹จ, ํŠน์ • ์š”์†Œ(์ข‹์•„์š”/ํŒ”๋กœ์šฐ)๋งŒ JS(AJAX & DOM์กฐ์ž‘)๋ฅผ ํ™œ์šฉ (CSR)
    • AJAX๋ฅผ ํ™œ์šฉํ•ด ๋น„๋™๊ธฐ ์š”์ฒญ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ง์ ‘ ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐ›์•„์˜ค๊ณ  JS๋ฅผ ํ™œ์šฉํ•ด DOM์„ ์กฐ์ž‘

|SEO (Search Engine Optimization) ; ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”

  • ์›น ํŽ˜์ด์ง€ ๊ฒ€์ƒ‰์—”์ง„์ด ์ž๋ฃŒ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋Š” ๋ฐฉ์‹์— ๋งž๊ฒŒ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ƒ์œ„์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ž‘์—…
  • ์ธํ„ฐ๋„ท ๋งˆ์ผ€ํŒ… ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜
  • ๊ตฌ๊ธ€์˜ ๋“ฑ์žฅ ์ดํ›„ ๊ฒ€์ƒ‰์—”์ง„๋“ค์ด ์ปจํ…์ธ ์˜ ์‹ ๋ขฐ๋„๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ธฐ์ดˆ ์ง€ํ‘œ๋กœ ์‚ฌ์šฉ๋จ
    • ๋‹ค๋ฅธ ์›น ์‚ฌ์ดํŠธ์—์„œ ์–ผ๋งˆ๋‚˜ ์ธ์šฉ๋˜์—ˆ๋‚˜๋ฅผ ๋ฐ˜์˜
    • ๊ฒฐ๊ตญ ํƒ€ ์‚ฌ์ดํŠธ์— ์ธ์šฉ๋˜๋Š” ํšŸ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ตœ์ ํ™”
  • Vue.js ๋˜๋Š” React ๋“ฑ์˜ SPA ํ”„๋ ˆ์ž„์›Œํฌ๋Š” SSR์„ ์ง€์›ํ•˜๋Š” SEO ๋Œ€์‘ ๊ธฐ์ˆ ์ด ์ด๋ฏธ ์กด์žฌ
    • SEO ๋Œ€์‘์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์„ ๋ณ„์  SEO ๋Œ€์‘ ๊ฐ€๋Šฅ
  • ํ˜น์€ ์ถ”๊ฐ€๋กœ ๋ณ„๋„์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•จ
    • Nuxt.js
      • Vue.js ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
      • SSR ์ง€์›
    • Next.js
      • React ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
      • SSR ์ง€์›

 

 

|Vue.js ์—ญํ• 

 

 

Why Vue.js?

  • Vanilla JS
    • ํ•œ ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์ด DOM์ƒ์— 100๊ฐœ ์กด์žฌ
    • ์ด ์œ ์ €๊ฐ€ ๋‹‰๋„ค์ž„์„ ๋ณ€๊ฒฝํ•˜๋ฉด, DB์˜ Update์™€ ๋ณ„๋„๋กœ DOM์ƒ์˜ 100๊ฐœ์˜ ์ž‘์„ฑ์ž ์ด๋ฆ„์ด ๋ชจ๋‘ ์ˆ˜์ •๋˜์–ด์•ผ ํ•จ
    • ‘๋ชจ๋“  ์š”์†Œ’๋ฅผ ์„ ํƒํ•ด์„œ ‘์ด๋ฒคํŠธ’๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ
  • Vue.js
    • DOM๊ณผ Data๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ 
    • Data๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด์— ์—ฐ๊ฒฐ๋œ DOM์€ ์•Œ์•„์„œ ๋ณ€๊ฒฝ
    • ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์‹ ๊ฒฝ ์จ์•ผ ํ•  ๊ฒƒ์€ ์˜ค์ง Data์— ๋Œ€ํ•œ ๊ด€๋ฆฌ (Developer Exp ํ–ฅ์ƒ)

 

 

Vue.js์˜ ๊ฐœ๋…

|MVVM Pattern

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์„ UI๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋””์ž์ธ ํŒจํ„ด
  • ๊ตฌ์„ฑ ์š”์†Œ
  1. Model
  2. View
  3. View Model

DOM === HTML            Vue===DOM๊ณผ Data์˜ ์ค‘๊ฐœ์ž            Model==={key:value}

  • Model
    • “Vue์—์„œ Model์€ JavaScript Object๋‹ค.”
    • Object === { key: value }
    • Model์€ Vue Instance ๋‚ด๋ถ€์—์„œ data๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์กด์žฌ
    • ์ด data๊ฐ€ ๋ฐ”๋€Œ๋ฉด View(DOM)๊ฐ€ ๋ฐ˜์‘
  • View
    • “Vue์—์„œ View๋Š” DOM(HTML)์ด๋‹ค.”
    • Data์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ์„œ ๋ฐ”๋€Œ๋Š” ๋Œ€์ƒ
  • ViewModel
    • “Vue์—์„œ ViewModel์€ ๋ชจ๋“  Vue Instance์ด๋‹ค.”
    • View์™€ Model ์‚ฌ์ด์—์„œ Data์™€ DOM์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌ
    • ViewModel์„ ํ™œ์šฉํ•ด Data๋ฅผ ์–ผ๋งˆ๋งŒํผ ์ž˜ ์ฒ˜๋ฆฌํ•ด์„œ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ์ง€(DOM)๋ฅผ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ

 

 

 

|Django & Vue.js ์ฝ”๋“œ ์ž‘์„ฑ ์ˆœ์„œ

  • Django
    • “๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„”
    • url → views → template
  • Vue.js
    • “Data๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด DOM์ด ๋ณ€๊ฒฝ”
    1. Data ๋กœ์ง ์ž‘์„ฑ
    2. DOM ์ž‘์„ฑ
  •  

'Development > Vue.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vue.js - Vue CLI  (0) 2022.05.09
Vue.js - SFC(Single File Component)  (0) 2022.05.09
Vue.js - Lifecycle Hooks  (0) 2022.05.07
Vue.js - Template Syntax  (0) 2022.05.07
Vue.js - Vue Instance  (0) 2022.05.07

๋Œ“๊ธ€