Vue.js๋ž€..?

Jung taeWoongยท2021๋…„ 3์›” 15์ผ
2

vue.js

๋ชฉ๋ก ๋ณด๊ธฐ
1/9
post-thumbnail

๐Ÿค” Vue.js๋ž€..?

MVVM ํŒจํ„ด์˜ ๋ทฐ๋ชจ๋ธ(ViewModel) ๋ ˆ์ด์–ด์— ํ•ด๋‹นํ•˜๋Š” ํ™”๋ฉด(View)๋‹จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • MVVM ํŒจํ„ด์„ ์‚ฌ์šฉ
  • Virtual DOM ์‚ฌ์šฉ
  • React, Angular์— ๋น„ํ•ด ๋งค์šฐ ์ž‘๊ณ  ๊ฐ€๋ฒผ์šฐ๋ฉฐ ๋ณต์žก๋„๊ฐ€ ๋‚ฎ์Œ.
  • Template์™€ Componenet๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ View Layer๋ฅผ ์ •๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ

๐Ÿ˜Ž Vue.js๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ์ด์œ 

  • Angular์˜ data binding ํŠน์„ฑ๊ณผ react์˜ virtual dom ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ํŠน์ง•์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๋ฌธ๋ฒ•์ด ๊ฐ„ํŽธํ•˜๊ณ  ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • react์™€ angular์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๊ณ  ๋น ๋ฅด๋‹ค.
  • react์˜ ์žฅ์ ๊ณผ angular์˜ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

MVVM ํŒจํ„ด..?

Model - View - ViewModel์˜ ์ค„์ž„๋ง๋กœ ๋ฐฑ์—”๋“œ ๋กœ์ง๊ณผ UI์˜ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ํŒจํ„ด
View ์—ญํ•  === DOM
Model ์—ญํ•  === JavaScript
ViewModel์—ญํ•  === ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ฆ‰์‹œ ๋ทฐ์— ๋ฐ˜์˜

  • ViewModel์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ง์ ‘ Model๊ณผ View๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.
    *But ViewModel์ด ์ค‘๊ฐ„์—์„œ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์ด MVVM ๋ชจ๋ธ

Reactivity(๋ฐ˜์‘์„ฑ)

Vue ์ธ์Šคํ„ด์Šค์— JavaScript ๊ฐ์ฒด๋ฅผ data ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด Vue๋Š” ๋ชจ๋“  ์†์„ฑ์— Object.defineProperty๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ getter/setters๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด๋Š” Vue๊ฐ€ ES5๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์—†๋Š” IE8 ์ดํ•˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ด๋‹ค.

  • ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๊ฐ€ ๊ธฐ๋ก๋  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ getter/setter ํ˜•์‹์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์นœ์ˆ™ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด vue-devtools๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์— ํ•ด๋‹น watcher ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด ์ธ์Šคํ„ด์Šค๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ข…์†์ ์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๋™์•ˆ ์ˆ˜์ •๋œ ๋ชจ๋“  ์†์„ฑ์„ ๊ธฐ๋กํ•œ๋‹ค.
๋‚˜์ค‘์— ์ข…์†์ ์ธ setter๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ ๋˜๋ฉด watcher์— ์•Œ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค.

๋ทฐ ์ธ์Šคํ„ด์Šค

์ธ์Šคํ„ด์Šค๋Š” ๋ทฐ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์ˆ˜๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

์ธ์Šคํ„ด์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

new Vue();

์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ์Šคํ„ด์Šค ์•ˆ์— ์–ด๋–ค ์†์„ฑ๊ณผ API๊ฐ€ ์žˆ๋Š”์ง€ ์ฝ˜์†” ์ฐฝ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

const vm = new Vue();
console.log(vm);
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ Vue ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ด์œ ๋Š” Vue๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์— ๋ฏธ๋ฆฌ ํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ Vue ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด๋‚ธ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋“ค์ด ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ

์ธ์Šคํ„ด์Šค ์†์„ฑ๊ณผ API

์ธ์Šคํ„ด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ๊ณผ API

new Vue({
  el: ,
  template: ,
  data: ,
  methods: ,
  created: ,
  watch: ,
});
  • el: ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ทธ๋ ค์ง€๋Š” ํ™”๋ฉด์˜ ์‹œ์ž‘์  (ํŠน์ • HTML ํƒœ๊ทธ)
  • template: ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์š”์†Œ (HTML, CSS ๋“ฑ)
  • data: ๋ทฐ์˜ ๋ฐ˜์‘์„ฑ(Reactivity)๊ฐ€ ๋ฐ˜์˜๋œ ๋ฐ์ดํ„ฐ ์†์„ฑ
  • methods: ํ™”๋ฉด์˜ ๋™์ž‘๊ณผ ์ด๋ฒคํŠธ ๋กœ์ง์„ ์ œ์–ดํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • created: ๋ทฐ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด๊ณผ ๊ด€๋ จ๋œ ์†์„ฑ
  • watch: data์—์„œ ์ •์˜ํ•œ ์†์„ฑ์ด ๋ณ€ํ™”ํ–ˆ์„ ๋•Œ ์ถ”๊ฐ€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ •์˜ํ•˜๋Š” ์†์„ฑ

Life Cycle..?

  • Vue ์ธ์Šคํ„ด์Šค ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ•ด์ฒดํ•˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •
  • ํฌ๊ฒŒ ์ƒ์„ฑ(CREATE) -> DOM์— ๋ถ€์ฐฉ(MOUNT) -> ์—…๋ฐ์ดํŠธ(UPDATE) -> ํ•ด์ฒด(DESTROY) 4๊ฐ€์ง€ ๊ณผ์ •์ด ์žˆ๋‹ค.

Life Cycle ๋‹จ๊ณ„

1. beforeCreate

  • Vue ์ธ์Šคํ„ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ์งํ›„์— ๋ฐœ์ƒ
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ์ถ”๊ฐ€๋˜๊ธฐ ์ „์ด๋ผ this.$el ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ๋˜ํ•œ data, methods๋“ฑ์—๋„ ์ ‘๊ทผ ๋ถˆ๊ฐ€

2. created

  • data๋ฅผ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์ถ”์  ๊ฐ€๋Šฅ
  • computed, methods, watch ๋“ฑ์ด ํ™œ์„ฑํ™”๋˜์–ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ
  • DOM์—๋Š” ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ์ƒํƒœ

3. beforeMount

  • DOM์— ๋ถ€์ฐฉ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋จ
  • Virtual DOM์ด ์ƒ์„ฑ๋˜์–ด ์žˆ์œผ๋‚˜ ์‹ค์ œ DOM์— ๋ถ€์ฐฉ๋˜์ง€ ์•Š์€ ์ƒํƒœ

4. mounted

  • Virtual DOM์˜ ๋‚ด์šฉ์ด ์‹ค์ œ DOM์— ๋ถ€์ฐฉ๋˜๊ณ  ๋‚œ ์ดํ›„ ์‹คํ–‰๋จ
  • ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

5. beforeUpdate

  • ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” data ๊ฐ’์˜ ๋ณ€ํ™” ์ง์ „์— ํ˜ธ์ถœ
  • ๋ณ€ํ™” ๊ฐ’์„ ์ด์šฉํ•ด Virtual DOM์„ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์ „
  • ์ด ๋‹จ๊ณ„์—์„œ ๊ฐ’๋“ค์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ณ€ํ™”์‹œํ‚ค๋”๋ผ๋„ ๋ Œ๋”๋ง์„ ์ถ”๊ฐ€๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

6. updated

  • Virtual DOM์„ ๋ Œ๋”๋ง ํ•˜๊ณ  ์‹ค์ œ DOM์ด ๋ณ€๊ฒฝ๋œ ์ดํ›„์— ํ˜ธ์ถœ
  • ๋ณ€๊ฒฝ๋œ data๊ฐ€ DOM์—๋„ ์ ์šฉ๋œ ์ƒํƒœ
  • ์ด ๋‹จ๊ณ„์—์„œ data๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ผ์œผํ‚ฌ์ˆ˜ ์žˆ์–ด ์ ˆ๋Œ€ ๊ธˆ๋ฌผ

7. beforeDestroy

  • ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ฒด๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋จ
  • ํ•ด์ฒด๋˜๊ธฐ ์ด์ „์ด๋ฏ€๋กœ ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ๋ผ์ง€๊ธฐ ์ „์— ํ•ด์•ผํ•  ์ผ๋“ค์„ ์ด ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ

8. destroyed

  • ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ฒด๋˜๊ณ  ๋‚œ ์งํ›„์— ํ˜ธ์ถœ
  • ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ & ์š”์†Œ์— ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ํ•˜์œ„ Vue ์ธ์Šคํ„ด์Šค ์—ญ์‹œ ์‚ญ์ œ๋จ

๋ถ€๋ชจ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋‹จ๊ณ„ ์ˆœ์„œ

1. (parent) beforeCreate

2. (parent) created

3. (parent) beforeount

4. (child) beforeCreate

5. (child) created

6. (child) beforeMount

7. (child) mounted

8. (parent) mounted

profile
Front-End ๐Ÿ˜ฒ

0๊ฐœ์˜ ๋Œ“๊ธ€