Vuex μ‹œμž‘ν•˜κΈ° 3 - Actions 와 폴더 ꡬ쑰화

λ“€μ–΄κ°€λ©°

이 글은 Vuex μ‹œμž‘ν•˜κΈ° 1, Vuex μ‹œμž‘ν•˜κΈ° 2에 이어 Vuex 의 λ§ˆμ§€λ§‰ 뢀뢄인 Actions 와 폴더 ꡬ쑰화 방법을 μ†Œκ°œν•©λ‹ˆλ‹€. μ§€λ‚œ κΈ€μ—μ„œλŠ” mutations κΉŒμ§€ λ‹€λ€˜μŠ΅λ‹ˆλ‹€.

Actions λž€?

Mutations μ—λŠ” 순차적인 λ‘œμ§λ“€λ§Œ μ„ μ–Έν•˜κ³  Actions μ—λŠ” λΉ„ 순차적 λ˜λŠ” 비동기 처리 λ‘œμ§λ“€μ„ μ„ μ–Έν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ μ™œ 처리 둜직의 성격에 따라 Mutations κ³Ό Actions 둜 λ‚˜λˆ  등둝해야 ν• κΉŒ?

Mutations 에 λŒ€ν•΄ 잠깐 μ§šμ–΄λ³΄λ©΄, Mutations 의 μ—­ν•  μžμ²΄κ°€ State 관리에 μ£Όμ•ˆμ μ„ 두고 μžˆλ‹€. μƒνƒœκ΄€λ¦¬ μžμ²΄κ°€ ν•œ 데이터에 λŒ€ν•΄ μ—¬λŸ¬ 개의 μ»΄ν¬λ„ŒνŠΈκ°€ κ΄€μ—¬ν•˜λŠ” 것을 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•¨μΈλ° Mutations 에 비동기 처리 λ‘œμ§λ“€μ΄ ν¬ν•¨λ˜λ©΄ 같은 값에 λŒ€ν•΄ μ—¬λŸ¬ 개의 μ»΄ν¬λ„ŒνŠΈμ—μ„œ 변경을 μš”μ²­ν–ˆμ„ λ•Œ, κ·Έ λ³€κ²½ μˆœμ„œ νŒŒμ•…μ΄ μ–΄λ ΅κΈ° λ•Œλ¬Έμ΄λ‹€.

μ΄λŸ¬ν•œ 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 비동기 처리 λ‘œμ§μ€ Actions 에 동기 처리 λ‘œμ§μ€ Mutations 에 λ‚˜λˆ  κ΅¬ν˜„ν•œλ‹€.

λ”°λΌμ„œ, setTimeout() μ΄λ‚˜ μ„œλ²„μ™€μ˜ http 톡신 처리 같이 κ²°κ³Όλ₯Ό λ°›μ•„μ˜¬ 타이밍이 μ˜ˆμΈ‘λ˜μ§€ μ•Šμ€ λ‘œμ§μ€ Actions 에 μ„ μ–Έν•œλ‹€.

Actions 등둝

Vuex 에 Actions λ₯Ό λ“±λ‘ν•˜λŠ” 방법은 λ‹€λ₯Έ 속성과 μœ μ‚¬ν•˜λ‹€. actions λ₯Ό μ„ μ–Έν•˜κ³  action method λ₯Ό μΆ”κ°€ν•΄μ€€λ‹€.

// store.js
export const store = new Vuex.Store({
  // ...
  mutations: {
    addCounter: function (state, payload) {
      return state.counter++;
    }
  },
  actions: {
    addCounter: function (context) {
      // commit 의 λŒ€μƒμΈ addCounter λŠ” mutations 의 λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•œλ‹€.
      return context.commit('addCounter');
    }
  }
});

μƒνƒœκ°€ λ³€ν™”ν•˜λŠ” κ±Έ μΆ”μ ν•˜κΈ° μœ„ν•΄ actions λŠ” κ²°κ΅­ mutations 의 λ©”μ„œλ“œλ₯Ό 호좜(commit) ν•˜λŠ” ꡬ쑰가 λœλ‹€.

// store.js
export const store = new Vuex.Store({
  actions: {
    getServerData: function (context) {
      return axios.get("sample.json").then(function() {
        // ...
      });
    },
    delayFewMinutes: function (context) {
      return setTimeout(function () {
        commit('addCounter');
      }, 1000);
    }
  }
});

μœ„μ²˜λŸΌ HTTP get μš”μ²­μ΄λ‚˜ setTimeout κ³Ό 같은 비동기 처리 λ‘œμ§λ“€μ€ actions 에 μ„ μ–Έν•΄μ€€λ‹€.

Actions μ‚¬μš©

μ•žμ—μ„œλŠ” mutations λ₯Ό μ΄μš©ν•˜μ—¬ counter λ₯Ό ν•˜λ‚˜μ”© λŠ˜λ Έλ‹€. μ΄λ²ˆμ—” actions λ₯Ό μ΄μš©ν•΄λ³΄μž. actions λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” μ•„λž˜μ™€ 같이 dispatch() λ₯Ό μ΄μš©ν•œλ‹€.

// App.vue
methods: {
  // Mutations λ₯Ό μ΄μš©ν•  λ•Œ
  addCounter() {
    this.$store.commit('addCounter');
  }
  // Actions λ₯Ό μ΄μš©ν•  λ•Œ
  addCounter() {
    this.$store.dispatch('addCounter');
  }
},

전체 κ΅¬μ‘°λ„μ—μ„œ dispatch 의 λ™μž‘μ„ 보면

vuex-actions

Actions 에 인자 κ°’ λ„˜κΈ°κΈ°

Actions 에 인자λ₯Ό λ„˜κΈ°λŠ” 방법은 Mutations 와 μœ μ‚¬ν•˜λ‹€.

<!-- by 와 duration λ“±μ˜ μ—¬λŸ¬ 인자 값을 λ„˜κΈΈ 경우, κ°μ²΄μ•ˆμ— key - value ν˜•νƒœλ‘œ μ—¬λŸ¬ 값을 λ„˜κΈΈ 수 μžˆλ‹€ -->
<button @click="asyncIncrement({ by: 50, duration: 500 })">Increment</button>
export const store = new Vuex.Store({
  actions: {
    // payload λŠ” 일반적으둜 μ‚¬μš©ν•˜λŠ” 인자 λͺ…
    asyncIncrement: function (context, payload) {
      return setTimeout(function () {
        context.commit('increment', payload.by);
      }, payload.duration);
    }
  }
})

mapActions

mapGetters, mapMutations 헬퍼 ν•¨μˆ˜λ“€κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ mapActions 도 λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

import {mapActions} from 'vuex';

export default {
  methods: {
    ...mapActions([
      'asyncIncrement',
      'asyncDecrement'
    ])
  },
}

폴더 ꡬ쑰화 & Namespacing

쀑간 크기 μ΄μƒμ˜ λ³΅μž‘ν•œ 앱을 μ œμž‘ν•  λ•Œ getters & mutations & actions 의 이름을 μœ μΌν•˜κ²Œ μ •ν•˜μ§€ μ•ŠμœΌλ©΄ namespace 좩돌이 λ‚œλ‹€. λ”°λΌμ„œ, λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ types.js 둜 각 μ†μ„±μ˜ 이름듀을 λΉΌκ³  store.js 와 각 μ»΄ν¬λ„ŒνŠΈμ— import ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방법이 μžˆλ‹€. ν˜Ήμ€ modules λΌλŠ” ν΄λ”λ‘œ λ§Œλ“€μ–΄ 각 λ‹¨μœ„λ³„λ‘œ νŒŒμΌμ„ μͺΌκ°œμ„œ κ΄€λ¦¬ν•˜λŠ” 방법도 μžˆλ‹€.

vuex-folder-structure

생각보닀 λ³΅μž‘ν•˜λ―€λ‘œ 앱이 μ»€μ„œ μ€‘ν˜• μ΄μƒμ˜ μ•±μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ”κ²Œ 쒋을 λ“―ν•˜λ‹€. κ°„λ‹¨ν•œ ν™”λ©΄ κ°œλ°œμ—λŠ” 였히렀 배보닀 배꼽이 클 수 μžˆλ‹€.

마무리

μ§€λ‚œ 2개의 κΈ€κ³Ό ν•¨κ»˜ 총 3편의 Vuex κ΄€λ ¨ 글을 톡해, Vue 둜 앱을 κ°œλ°œν•  λ•Œ 더 효율적으둜 μ½”λ“œμ™€ 데이터λ₯Ό 관리할 수 μžˆλŠ” μƒνƒœκ΄€λ¦¬μ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ€‘ν˜• μ΄μƒμ˜ μ•±μ—λŠ” ν•„μˆ˜μ μœΌλ‘œ μ¨μ•Όν•˜λŠ” 보쑰 라이브러리라고 보싀 수 μžˆλŠ”λ°μš”. Vuex κ°€ κ°€μ Έλ‹€ μ£ΌλŠ” 이점도 ν¬μ§€λ§Œ, 정말 κ°„λ‹¨ν•œ 화면을 λ§Œλ“€ λ•ŒλŠ” 였히렀 초기 μ„ΈνŒ…ν•˜λŠ”λ° μ‹œκ°„μ΄ 많이 걸릴 수 μžˆμœΌλ‹ˆ 유의 ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€ :)

Vuex μ‹œμž‘ν•˜κΈ° 1 - μƒνƒœκ΄€λ¦¬ μ†Œκ°œ & States
Vuex μ‹œμž‘ν•˜κΈ° 2 - Getters & Mutations

글보닀 더 μ‰½κ²Œ λ°°μš°λŠ” 온라인 κ°•μ˜

μ’€ 더 μΉœμ ˆν•˜κ³  μƒμ„Έν•œ μ„€λͺ…을 μ›ν•˜μ‹ λ‹€λ©΄ μ•„λž˜ κ°•μ’Œλ₯Ό μ΄μš©ν•΄λ³΄μ‹œλŠ” 것도 쒋을 것 κ°™μ•„μš” πŸ˜„

μΈν”„λŸ° 온라인 κ°•μ˜ : Vue.js μ‹œμž‘ν•˜κΈ° / Vue.js 쀑급 / Vue.js μ™„λ²½ κ°€μ΄λ“œ
μΈν”„λŸ° 온라인 κ°•μ˜ : Vue.js 끝μž₯λ‚΄κΈ° / ν”„λŸ°νŠΈμ—”λ“œ 개발자λ₯Ό μœ„ν•œ μ›ΉνŒ© / PWA μ‹œμž‘ν•˜κΈ°
μΈν”„λŸ° 온라인 κ°•μ˜ : νƒ€μž…μŠ€ν¬λ¦½νŠΈ μž…λ¬Έ / μ‹€μ „ ν”„λ‘œμ νŠΈλ‘œ λ°°μš°λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ / Vue.js + TypeScript μ™„λ²½ κ°€μ΄λ“œ