Posts (Vue.js) Vuex 저장소 모듈로 분리하기 (modules)
Post
Cancel

(Vue.js) Vuex 저장소 모듈로 분리하기 (modules)

어플리케이션의 규모가 커질수록 저장소에 넣고 관리해야 할 상태가 많아지고 그 구조 또한 복잡해집니다.
쇼핑몰을 만든다고 가정 했을 때 product 이라는 이름의 상태는 중복된 의미를 가질 수 있습니다.

  • 메인 리스트의 product
  • 장바구니 리스트의 product
  • 관심상품의 product

이 경우 저장소 내 트리형태 또는 네이밍으로 구분하여 상태 정의를 할 수 있겠지만 우리는 좀 더 가독성있고 관리를 편하게 하기위해 각 product 을 구분할 방법을 찾게 됩니다.
그 방법이 바로 Vuex 의 모듈(modules) 입니다.
저장소를 모듈로 분리하면 그 모듈은 별도의 state, getters, mutations, action 을 가지게 됩니다.

지역 상태(state) 와 루트 상태(rootState)

firstModules 이라는 모듈을 정의하고 Vuex 저장소에 first 로 매핑하였습니다.
이제부터 first 모듈 내 state 는 본인의 지역 상태이고, Vuex.store 최상단에 정의된 루트 상태는 rootState 로 접근할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const firstModule = {
  state: {
    product : { name: '나는 지역 상품' }
  },
  getters: {
    getProduct(state) {
        // ✨첫번째 인자로 모듈의 지역 state 를 받는다
        return `${state.product.name} 입니다`
    },
    getRootProduct(state, getters, rootState) {
        // ✨첫번째 인자로 모듈의 지역 state 를 받는다
        // ✨두번째 인자로 모듈의 지역 getters 를 받는다
        // ✨세번째 인자로 루트의 상태 rootState 를 받는다
        return `${rootState.product.name} 입니다`
    }
  },
  mutations: (...),
  actions: (...),
}

const store = new Vuex.store({
  state: {
    product : { name: '나는 루트 상품' }
  },
  getters: (...),
  mutations: (...),
  actions: (...),
  modules: {
    first: firstModule,
  }
})

모듈에 별도 상태를 가지도록 state, getters, mutations, actions 를 정의해 보았습니다.
그렇다면 변이를 발생시키기 위해 모듈의 각 핸들러 함수에는 어떻게 접근할 수 있을까요?

네임스페이스 옵션 (namespace)

먼저 모듈의 네임스페이스(namespace)의 개념을 간단하게 살펴보겠습니다
우리가 모듈로 저장소를 분리하게되면 각 모듈은 기본으로 전역 네임스페이스 로 등록 되됩니다.
그렇기 때문에 각 모듈은 독립적으로 동작 하지 않고, B 모듈의 변이를 통해 A 모듈이 영향을 받을 수 있습니다. 우리는 독립적인 모듈 작성을 위해 모듈을 매핑할 때 namespaced: true 옵션을 줘서 네임스페이스를 지정할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
const store = new Vuex.store({
  state: {
    product : { name: '나는 루트 상품' }
  },
  getters: (...),
  mutations: (...),
  actions: (...),
  modules: {
    namespaced: true, // 네임스페이스 옵션 설정
    first: firstModule,
  }
})

네임스페이스 옵션을 줬을 때 저장소의 상태 구조가 어떻게 변하는지 다음 포스팅에서 좀 더 자세히 다뤄보도록 하겠습니다. 🙂

This post is licensed under CC BY 4.0 by the author.

(Vue.js) Vuex 상태관리자 시작하기 (3) - actions, mapActions 헬퍼

(Webpack) 웹팩 - 모듈 번들러와 로더

Comments powered by Disqus.