๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/Vue.js

Vue.js ๊ธฐ๋ณธ ๊ฐœ๋… / ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  / ๊ฐ€์ƒ ๋”

by 1mj 2022. 3. 17.

Vue.js ๋ž€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(์ดํ•˜ js) ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

MVVM ํŒจํ„ด์˜ ViewModel ๋ ˆ์ด์–ด์— ํ•ด๋‹นํ•˜๋Š” ํ™”๋ฉด๋‹จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด DOM์— ๋‹ค์‹œ ๋Œ€์ž…ํ•ด์ค˜์•ผ ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋˜ ์ผ๋ฐ˜์ ์ธ ์›น ๊ฐœ๋ฐœ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ, ๋ฐ์ดํ„ฐ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํ™”๋ฉด์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ”๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

  • MVVM ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • Virtual DOM์„ ์‚ฌ์šฉํ•œ๋‹ค.(React์˜ ๊ฐ€์ƒ ๋” ์ฑ„ํƒ)
  • ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•œ๋‹ค.(Angular์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ฑ„ํƒ)
  • Template์™€ Component๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

์™œ Vue.js ๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

1. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ๊ฐ„ํŽธํ•˜๋‹ค.

์•„๋ž˜ HTML ์ฝ”๋“œ์—์„œ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

<div>
	<h2 id="message">hello</h2>
</div>

 

์ด์™€ ๊ฐ™์ด ์—˜๋ฆฌ๋จผํŠธ์˜ id๋กœ DOM์— ์ ‘๊ทผํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

<script>
	var elMessage = document.getElementById('message');
	elMessage.innerText = 'bye';
</script>

 

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

 

ํ”„๋ก ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ธ React์—์„œ๋Š” state๋ฅผ, Vue์—์„œ๋Š” data๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด DOM์€ ์•Œ์•„์„œ ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์— ์“ฐ์˜€๋Š”์ง€ ๊ธฐ์–ตํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

2. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค.

ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๋ทฐ์˜ ๋‹จ์œ„๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ์–ด ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ™”๋ฉด์„ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ์ผ๊ด„์ ์ธ ํŒจํ„ด์œผ๋กœ ๊ฐœ๋ฐœ, ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๋น ๋ฅด๋‹ค.

Angular๋Š” Typescript๋ฅผ ์จ์•ผ ํ•˜๊ณ  React๋Š” ๊ธฐ์กด js ๋ฌธ๋ฒ•์„ ์ž˜ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๋ฐ˜๋ฉด vue๋Š” js๋ฅผ ์ž˜ ์•Œ์ง€ ๋ชปํ•ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  HTML ๋ Œ๋”๋งํ•˜๋Š” ์‹œ๊ฐ„์ด ๋น ๋ฅด๋‹ค.


MVVM ํŒจํ„ด

ํ™”๋ฉด์„ ๋ชจ๋ธ(Model) - ๋ทฐ(View) - ๋ทฐ ๋ชจ๋ธ(ViewModel)๋กœ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํ™”๋ฉด ์š”์†Œ๋“ค์„ ์ œ์–ดํ•˜๋Š” ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ ์ œ์–ด ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•˜๋‹ค.

์›น ํŽ˜์ด์ง€๋Š” View ์—ญํ• ์„ ํ•˜๋Š” DOM๊ณผ Model ์—ญํ• ์„ ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

ViewModel ๋ ˆ์ด์–ด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ง์ ‘ ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. (ex.document.getElementById('id').appendChild(newNode);)โ€‹

Vue.js๋Š” ๋” ๋ฆฌ์Šค๋„ˆ์™€ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•˜์—ฌ ๋”๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  1. Vue.js์—์„œ ๋ทฐ ๋‹จ์˜ DOM ์ด๋ฒคํŠธ ๊ฐ์ง€
  2. ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์š”์ฒญ
  3. ๊ฒฐ๊ณผ๋กœ ๋ฐ›์€ Model ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ํ™”๋ฉด ๋ณ€๊ฒฝ

 

๋’ท๋‹จ์˜ DB ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง๊ณผ ์•ž๋‹จ์˜ ํ™”๋ฉด ๋™์ž‘ ๊ด€๋ จ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋’ท๋‹จ์—์„œ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ์— ๋‹ด์•„ ๋ทฐ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์ค‘๊ฐ„ ์ง€์ ์ด ViewModel์ด๋‹ค.


๊ฐ€์ƒ ๋” (Virtual DOM)

๋จผ์ € DOM์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. DOM์ด๋ž€ Document Object Model๋กœ์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ชจ๋ธ์„ ์˜๋ฏธํ•œ๋‹ค.

 

์ „์ฒด์ ์ธ ์›น ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ๊ณผ์ •์€ ์ด๋ ‡๋‹ค.

  1. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ํƒœ๊ทธ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์Šคํƒ€์ผ ์‹œํŠธ์—์„œ CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์Šคํƒ€์ผ ๊ทœ์น™์„ ๋งŒ๋“ ๋‹ค.
  2. ๋” ํŠธ๋ฆฌ์™€ ์Šคํƒ€์ผ ๊ทœ์น™์ด ํ•ฉ์ณ์ ธ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  3. ์ƒ์„ฑ๋œ ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๊ณ  ๊ทธ๋ฆฌ๊ธฐ ๊ณผ์ •์ด ์ง„ํ–‰๋œ๋‹ค.
  4. ๋ Œ๋”๋ง ์—”์ง„์€ ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด HTML์„ ํŒŒ์‹ฑํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐฐ์น˜์™€ ๊ทธ๋ฆฌ๊ธฐ ๊ณผ์ •์„ ์‹œ์ž‘ํ•˜์—ฌ ์ ์  ํ™”๋ฉด์ด ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ Œ๋”๋ง ์—”์ง„ ์ข…๋ฅ˜
- ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ: ์›นํ‚ท(Webkit) ์—”์ง„ ์‚ฌ์šฉ
- ํŒŒ์ด์–ดํญ์Šค: ๊ฒŒ์ฝ”(Gecko) ์—”์ง„ ์‚ฌ์šฉ

 

๋ธŒ๋ผ์šฐ์ €๋Š” DOM์„ ์ด์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•œ๋‹ค.

 

ํ™”๋ฉด์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด ๋”์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๊ณ  ์ด๋Š” ๋” ํŠธ๋ฆฌ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ๋ Œ๋” ํŠธ๋ฆฌ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์ƒ ๋”(Virtual DOM)์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

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


์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ View์™€ Model์„ ๋ฌถ์–ด ์œ ๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

- ๋‹จ๋ฐฉํ–ฅ

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ํ•ญ์ƒ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋ฐฉํ–ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ๋” ๊ตฌ์กฐํ™”๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

- ์–‘๋ฐฉํ–ฅ

๋ฐ˜๋ฉด, ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๊ฐ’๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋™๊ธฐํ™”๋˜์–ด ํ•œ ์ชฝ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค๋ฅธ ํ•œ ์ชฝ๋„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.


์ฐธ๊ณ ์ž๋ฃŒ ๋ฐ ์ถœ์ฒ˜ ๐Ÿ™‡‍โ™‚๏ธ

https://wikidocs.net/17701

https://kim6394.tistory.com/217

https://mkil.tistory.com/435

 

๋Œ“๊ธ€