λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
개발/Vue.js

Vuex / μƒνƒœκ΄€λ¦¬ / Vuex νŒ¨ν„΄ 및 μš”μ†Œ

by 1mj 2022. 4. 5.

Vuex λž€?

Vue.js 의 μƒνƒœ 관리λ₯Ό μœ„ν•œ νŒ¨ν„΄μ΄μž λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•œ 쀑앙 집쀑식 μ €μž₯μ†Œ 역할을 ν•˜λ©° 예츑 κ°€λŠ₯ν•œ λ°©μ‹μœΌλ‘œ μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.

 

Vuex λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 경우

μ»΄ν¬λ„ŒνŠΈ 기반 ν”„λ ˆμž„μ›Œν¬λŠ” ν•œ 화면을 μž‘μ€ λ‹¨μœ„μ˜ μ»΄ν¬λ„ŒνŠΈ μ—¬λŸ¬ 개둜 μͺΌκ°œμ–΄ κ΅¬μ„±ν•œλ‹€. 예λ₯Ό λ“€μ–΄, λ·°μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ κ°„ 데이터 전달을 μœ„ν•΄ emit, props 등을 μ‚¬μš©ν•˜λŠ”λ° μ—¬κΈ°μ„œ λͺ‡ 가지 문제점이 μžˆλ‹€.

  • λ°μ΄ν„°μ˜ μ›€μ§μž„μ„ 확인할 수 μ—†λ‹€.
  • λΆ€λͺ¨-μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ 관계가 λ³΅μž‘ν•΄μ§€λ©΄ λ°μ΄ν„°μ˜ 이동을 νŒŒμ•…ν•˜κΈ° μ–΄λ ΅λ‹€.
  • μ»΄ν¬λ„ŒνŠΈλ‘œλΆ€ν„° 데이터λ₯Ό 전달받기 μœ„ν•΄ 쀑간에 거쳐야 ν•  μ»΄ν¬λ„ŒνŠΈκ°€ λ§Žμ•„μ§„λ‹€.

λ¨Όμ €, μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ κΉŠμ΄μ— 따라 props, emit 의 μˆ˜κ°€ λ§Žμ•„μ§€λ©° 관리에 어렀움이 생긴닀. κ²Œλ‹€κ°€ λΆ€λͺ¨-μžμ‹ 관계가 μ•„λ‹Œ λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ—κ²Œ 값을 전달할 수 μ—†λ‹€. vue μ—μ„œλŠ” 이 λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œ event bus 와 vuex λ₯Ό μ΄μš©ν•˜λŠ” 방법을 μ œμ‹œν•œλ‹€. 두 λ°©λ²•μ˜ 차이점은 vuex λŠ” μƒνƒœ 관리와 좔적이 κ°€λŠ₯ν•˜λ‹€λŠ” 것이닀. event bus λŠ” μ–΄λ””μ„œ 이벀트λ₯Ό λ³΄λƒˆκ³  λ°›μ•˜λŠ”μ§€ μ•ŒκΈ° μ–΄λ €μ›Œ 전달이 λͺ…μ‹œμ μ΄μ§€ μ•Šλ‹€.

 

μƒνƒœ κ΄€λ¦¬λŠ” μ™œ ν•„μš”ν• κΉŒ?

μž‘μ€ λ‹¨μœ„λ‘œ κ΅¬μ„±λœ μ—¬λŸ¬ 개의 μ»΄ν¬λ„ŒνŠΈκ°€ μ–΄λ–»κ²Œ ν†΅μ‹ ν•˜κ³  μ–΄λ–€ 데이터λ₯Ό μ „λ‹¬ν•˜λŠ”μ§€ μ‰½κ²Œ νŒŒμ•…ν•˜λ €λ©΄ 이λ₯Ό ν•œ κ³³μ—μ„œ κ΄€λ¦¬ν•˜λŠ” νŒ¨ν„΄μ΄ ν•„μš”ν•˜λ‹€. Vue μ—μ„œλŠ” vuex λΌλŠ” μƒνƒœ 관리 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터 전달과 이벀트 톡신을 ν•œ κ³³μ—μ„œ κ΄€λ¦¬ν•œλ‹€.

 

Vuex νŠΉμ§•

μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈκ°€ κ³΅μœ ν•˜λŠ” 데이터λ₯Ό ν•œ 곳에 μ €μž₯ν•˜λŠ” 쀑앙 집쀑식 store 와 μ €μž₯μ†Œμ˜ μƒνƒœκ°€ λ³€κ²½λ˜λ©΄ 효율적으둜 λŒ€μ‘ν•˜κ³  μ—…λ°μ΄νŠΈν•˜λŠ” λ°˜μ‘ν˜•μ˜ νŠΉμ§•μ„ 가진닀. μ €μž₯μ†Œμ˜ μƒνƒœλŠ” 직접 λ³€κ²½ν•  수 μ—†κ³  컀밋을 μ΄μš©ν•΄ λͺ¨λ“  μƒνƒœμ— λŒ€ν•΄ 좔적 κ°€λŠ₯ν•œ 기둝을 남긴닀.

  • 쀑앙 집쀑식 μ €μž₯μ†Œ
  • λ°˜μ‘ν˜• μ €μž₯μ†Œ μƒνƒœ
  • 컀밋을 μ΄μš©ν•œ 변이

 


Vuex  νŒ¨ν„΄

Vuex λŠ” React 의 Flux νŒ¨ν„΄μ—μ„œ κΈ°μΈν•˜μ˜€λ‹€. Flux νŒ¨ν„΄μ€ MVC νŒ¨ν„΄μ˜ μ–‘λ°©ν–₯ 데이터 νλ¦„μ˜ νŠΉμ§•κ³ΌλŠ” λ‹€λ₯΄κ²Œ 단방ν–₯ 데이터 흐름이닀.

MVC νŒ¨ν„΄ vs Flux νŒ¨ν„΄

  • actions: ν™”λ©΄μ—μ„œ λ°œμƒν•˜λŠ” 이벀트 λ˜λŠ” μ‚¬μš©μžμ˜ μž…λ ₯
  • dispatcher: 데이터λ₯Ό λ³€κ²½ν•˜λŠ” 방법, method, model 을 λ°”κΎΈκΈ° μœ„ν•œ μ—­ν• 
  • model: 화면에 ν‘œμ‹œν•  데이터
  • view: μ‚¬μš©μžμ—κ²Œ λ³΄μ΄λŠ” ν™”λ©΄, ν™”λ©΄μ—μ„œ λ‹€μ‹œ action 을 호좜

 

Vuex μš”μ†Œ

βœ”οΈ State (μƒνƒœ)

μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈκ°€ κ³΅μœ ν•  데이터

state λŠ” mutation 을 ν†΅ν•΄μ„œλ§Œ λ³€κ²½ν•˜λŠ” 것을 ꢌμž₯

μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” this.$store.state.μƒνƒœλͺ…μœΌλ‘œ μ‚¬μš©

// Vue
data: {
    message: 'Hello Vue.js'
}
// Vuex
state: {
    message: 'Hello Vue.js'
}

// Vue
<p>{{ message }}</p>
// Vuex
<p>{{ this.$store.state.message }}</p>

 

βœ”οΈ Actions

비동기 처리 λ‘œμ§μ„ μ„ μ–Έν•˜λŠ” λ©”μ„œλ“œ

데이터 μš”μ²­, Promise, async λ“±κ³Ό 같은 비동기 처리 μ„ μ–Έ

api 호좜과 κ·Έ 결과에 λŒ€ν•΄ return 및 mutations λ₯Ό μ‚¬μš©

μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” this.$store.dispatch('μ•‘μ…˜λͺ…') 으둜 μ‚¬μš©

// store.js
state: {
    num: 10
},
mutations: {
    doubleNumber(state) {
        state.num * 5;
    }
},
actions: {
    delayDoubleNumber(context) {     # context둜 store의 λ©”μ„œλ“œμ™€ 속성 μ ‘κ·Ό
        context.commit('doubleNumber'); # 트리거
    }
}


// App.vue
this.$store.dispatch('delayDoubleNumber');

 

βœ”οΈ Mutations (변이)

state 의 값을 λ³€κ²½ν•  수 μžˆλŠ” μœ μΌν•œ 방법

λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰λ¨

μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” this.$store.commit('변이λͺ…') 으둜 μ‚¬μš©

// store.js
state: {
    num: 10
},
mutations: {
   printNumbers(state) {
       return state.num;
  },
   sumNumbers(state, anotherNum) {
       return state.num + anotherNum;
  }
}


// App.vue
this.$store.commit('printNumbers');    //10
this.$store.commit('sumNumbers', 20);  //30

 

βœ”οΈ Getters/Computed

state 값을 μ ‘κ·Όν•˜λŠ” μ†μ„±μ΄μž computed() 처럼 미리 μ—°μ‚°λœ 값을 μ ‘κ·Όν•˜λŠ” 속성

state 에 λŒ€ν•œ 연산을 ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό view 에 바인딩함

// store.js
state: {
    num: 10
},
getters: {
    getNumber(state) {
        return state.num;
    },
    doubleNumber(state) {
        return state.num * 2;    
    }
}


<p>{{ this.$store.getters.getNumber }}</p>
<p>{{ this.$store.getters.doubleNumber }}</p>
// ν—¬νΌν•¨μˆ˜λ‘œ state μ ‘κ·Όν•˜λŠ” 법을 κ°„μ†Œν™”ν•  수 있음

 

참고자료 및 좜처 πŸ™‡‍♂️

http://www.incodom.kr/VueJS/Vuex

https://dev-jsk.tistory.com/75

 

λŒ“κΈ€