์ด ๋ฌธ์๋ ๊ณต๋ถ๋ฅผ ์ํด Vuex ๊ณต์ ๋ฌธ์๋ฅผ ๋ฒ์ญํ ๊ฒ์ผ๋ก ์ด๋ฏธ ํ๊ตญ์ด api๊ฐ ์กด์ฌํจ์ ์๋ ค๋๋ฆฝ๋๋ค.
๋ทฐ์์ค๋ vue.js ์์ฉํ๋ก๊ทธ๋จ์ ์ํ ์ํ ๊ด๋ฆฌ ํจํด + ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ํ๊ฐ ์ค์ง ์์ ๊ฐ๋ฅํ ์ํธ์์ฉ ์์์๋ง ์ ์ฉ๋๋ค๋ ๊ท์น์๋์์ ์ด๊ฒ์ ์์ฉํ๋ก๊ทธ๋จ์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ํ ์ค์ ์ ์ฅ์๋ก ์ ๊ณต๋ฉ๋๋ค. ์ด๊ฒ์ ๋ํ ๋ทฐ์ ๊ณต์ devtool ํ์ฅ๊ณผ ํตํฉ๋์ด์ ์ข ๋ ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ทฐ์ ์นด์ดํฐ ์ฑ์์ ๋ถํฐ ์์ํฉ์๋ค.
new Vue({
// state
data () {
return {
count: 0
}
},
// view
template: `
<div>{{ count }}</div>
`,
// actions
methods: {
increment () {
this.count++
}
}
})
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ฑ์
๋๋ค.
1. state : ์ฑ์ ์ด์ํ๋ ์์ฒ์
๋๋ค.
2. view : state์ ์ ์ธ์ ๋งคํ์
๋๋ค.
3. actions : view์์ ์ฌ์ฉ์์ input์ ๋ฐ๋ผ state๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ํ ๊ฐ๋จํ ์ปจ์
ํ๋ฉด์
๋๋ค.
ํ์ง๋ง ๋๋ก๋ ๋ค์ค์ ์ปดํฌ๋ํธ๊ฐ ๊ณตํต state๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ์ด ๊ฐ๋จํจ์ด ๋ฌด๋์ง๋๊ฐ ์์ต๋๋ค.
state :
๋ค์ค์ view๋ค์ ๊ฐ์ state ์กฐ๊ฐ์ ์์กดํฉ๋๋ค.
๋ค์ํ view์ action์์๋ ๊ฐ์ state ์กฐ๊ฐ๊ณผ ์ํธ์ํต์ด ํ์ํ ๋๊ฐ ์์ต๋๋ค.
์ฒซ๋ฒ์งธ ๋ฌธ์ ๋ ์ง๋๊ฐ๋ props๊ฐ ๊น๊ฒ ์๋ฆฌ์ก์ ์ปดํฌ๋ํธ์๊ฒ๋ ์์ฃผ ๋ฐ๋ณต๋ ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด ์์ ์ปดํฌ๋ํธ์์๋ ์๋ํ์ง ์์ต๋๋ค.
๋๋ฒ์งธ ๋ฌธ์ ๋ ์ฐ๋ฆฌ๋ ์์ฃผ ์ฐ๋ฆฌ ์ค์ค๋ก ์ง์ ๋ถ๋ชจ๋ ์์ ์ธ์คํด์ค์ ์์กดํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ธํด ์ํธ์ํต๊ณผ ๋ค์ค์ ๋๊ธฐํ๋ ๋ณต์ ๋ณธ state๋ฅผ ์ด๋ฒคํธ๋ก ์์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด ๋๊ฐ์ง์ ํจํด์ ๋ค๋ฃจ๊ธฐ ํ๋ค๊ณ ์ฝ๋๋ฅผ ์ ์งํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
๊ทธ๋ผ, ์ฐ๋ฆฌ๊ฐ ๊ณต์ ํ๋ state๋ฅผ ์ถ์ถํ์ฌ ๊ณต์ ํ๋ฉด ์ด๋จ๊น์? ๊ทธ๋ฆฌ๊ณ ์ ์ญ์ผ๋ก singleton์ผ๋ก ๊ด๋ฆฌํ๋๋ก ํ๋ฉด ์ด๋จ๊น์? ์ด๊ฒ์ผ๋ก ์ธํด ์ฐ๋ฆฌ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ ํ๋์ ํฐ view๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ปดํฌ๋ํธ๋ state๋ action์ ๋ฐ์์ํฌ ์ ์๊ฒ ๋์ง์. ์ฐ๋ฆฌ๊ฐ ํธ๋ฆฌ์ ์ด๋์ ์์นํด ์๋ ๊ฐ์์!
view์ state์ ๋ ๋ฆฝ์ฑ์ ์ฃผ์ฅํ๋ ๊ฐ์ ์ ์ธ ๋ฃฐ๊ณผ ์ํ ๊ด๋ฆฌ์ ์ฎ์ฌ์๋ ๊ฐ๋ ์ ๋ํด ๊ตฌ๋ถ์ง๊ณ ๋ถ๋ฆฌ์ํค๋ ๊ฒ์ผ๋ก ์ธํด ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ๊ตฌ์กฐ์ ์ด๊ณ ์ ์ง๊ฐ๋ฅํ๋๋ก ๋ง๋ญ๋๋ค.
์ด๊ฒ์ vuex์ ๋ํ ๊ธฐ๋ณธ ์์ด๋์ด์
๋๋ค. (flux์ redux์ the elm architectur์์ ์๊ฐ์ ์ป์)
๋ค๋ฅธ ํจํด๊ณผ ๋ค๋ฅด๊ฒ vuex๋ ํน๋ณํ vue.js์์ ๊ตฌํํ ์ ์๋๋ก ํ์ฌ ํจ์จ์ ์ธ ์
๋ฐ์ดํธ๋ฅผ ์ธ๋ถํ๋ ๋ฐ์์ฑ์ผ๋ก ๊ตฌํํ๋๋ฐ ์ด์ ์ ๊ฐ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
vuex๋ ์ฐ๋ฆฌ์๊ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ์์ฉํ๋ ์ฝ๋์ ๊ฐ๋ ์ผ๋ก ๋ค๋ฃฐ ์ ์๋๋ก ๋์์ค๋๋ค. ํ์ง๋ง ๊ฐ๋ ์ ๋ฐฐ์ฐ๋ ๊ฒ๊ณผ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋น์ฉ์ด ๋ค์ง์. ํ์ง๋ง ์ฅ๊ธฐ๊ฐ์ ์ฌ์ฉ์ ๋ํ ๊ธฐํ๋น์ฉ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
๋น์ ์ด ํฐ ์ค์ผ์ผ์ spa์ ๊ตฌ์ถํ์ง ์๊ณ ๋ฐ๋ก vuex๋ก ๋ฐ์ด๋ค์๋ค๋ฉด ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ณ ํ๋ ์ผ์ผ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์์ ํ ์ ์์ ๋๋ค. ๋ง์ฝ์ ๋น์ ์ ์ฑ์ด ์ฌํํ๋ฉด ๋น์ ์ vuex์์ด ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๊ฐ๋จํ ์ ์ฅ ํจํด์ด ๋น์ ์ด ํ์ํ ์ ๋ถ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ด ์ค๋ํ ์ค์ผ์ผ์ spa๋ฅผ ๊ฐ๋ฐํ๊ณ ์๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด vue ์ปดํฌ๋ํธ ๋ฐ์์ state๋ฅผ ๊ด๋ฆฌํ ๊น์ ๋ํ ๋ ๋์ ๊ธฐํ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ vuex๋ ๋น์ ์ ์์ฐ์ค๋ฌ์ด ๋ค์ ์คํ ์ด ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ redux์ ์ ์์ธ dan abramov์ ์ข์ ๊ตฌ์ ์ด ์์ต๋๋ค.
"Flux ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๊ฒฝ๊ณผ ๊ฐ์ต๋๋ค! ๋น์ ์ด ํ์ํ ๋๋ง ์์์ฐจ๋ฆฌ๊ฒ ๋ ๊ฒ์ ๋๋ค."
vuex ์์ฉํ๋ก๊ทธ๋จ์ ์ค์ฌ์ 'store'์
๋๋ค. 'store'์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ ์ ์ดํ๋ฆฌ์ผ์ด์
์ state๋ฅผ ๋ถ์ก๊ณ ์๋ ์ปจํ
์ด๋์
๋๋ค. ์ฌ๊ธฐ์ vuex store๊ฐ ๊ธฐ๋ณธ ์ ์ญ ๊ฐ์ฒด์ ๋ค๋ฅธ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค.
1. vuex store๋ ๋ฐ์์ ์
๋๋ค. ๋ทฐ ์ปดํฌ๋ํธ๊ฐ state๋ฅผ store์์ ๊ฒ์ํ ๋ store๋ค์ ๋ฐ์์ ์ด๊ณ ํจ์จ์ ์ผ๋ก store์ state๋ฅผ ๋ณ๊ฒฝํ ๊ฒ์
๋๋ค.
2. ๋น์ ์ ์ฆ๊ฐ์ ์ผ๋ก store์ state์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. store๋ค์ state๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋ช
์์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฐ์ commitํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ชจ๋ state์ ๋ณ๊ฒฝ์ ๋ํด ์ถ์ ๊ฐ๋ฅํ ๊ธฐ๋ก์ ๋ณด์ฅํ๋ฉฐ ์ฐ๋ฆฌ์๊ฒ ๋ ๋์ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ํ ์ดํด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์
๋๋ค.
vuex๋ฅผ ์ค์นํ ํ store๋ฅผ ์์ฑํด๋ณด์. ์ด๊ฒ์ ๊ต์ฅํ ์ง๊ด์ ์ด๋ค. ์ด๊ธฐ state ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ณ ๋ช๊ฐ์ง mutations๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ผ๋ก ๋๋๋ค!
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
})
์ ์ด์ , ๋น์ ์ state๊ฐ์ฒด์ store.state
์ ๊ฐ์ ํ์์ผ๋ก ์ ๊ทผํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ state๋ฅผ ๋ณํ์ํค๋ ํธ๋ฆฌ๊ฑฐ๋ store.commit
๋ฉ์๋๋ก ์ ๊ทผํ ์ ์๋ค.
store.commit('increment')
console.log(store.state.count) // -> 1
๋น์ ์ ๋ทฐ ์ปดํฌ๋ํธ์์ this.$store
์์ฑ์ ์ ๊ทผํจ์ ๋ฐ๋ผ ๋น์ ์ vue ์ธ์คํด์ค์ store๋ฅผ createํด์ผํ๋ค. vuex๋ 'inject'๋ผ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ฃจํธ ์ปดํฌ๋ํธ์ ๋ํ ๋ชจ๋ ์์ ์ปดํฌ๋ํธ์ store
์ต์
์ ์ ๊ณตํ๋ค.
new Vue({
el: '#app',
store: store,
})
//es6
new Vue({
el: '#app',
store
})
์ด์ ์ฐ๋ฆฌ๋ ์ปดํฌ๋ํธ์ method์์ mutation์ ์ปค๋ฐํ ์ ์๋ค.
methods: {
increment() {
this.$store.commit('increment')
console.log(this.$store.state.count)
}
}
store.state.count
๋ฅผ ๋ฐ๊พธ๋ ๋์ ์ฐ๋ฆฌ๊ฐ ์ปค๋ฐํจ์ผ๋ก์จ ๋ฐ๊พธ๋ ์ด์ ๋ ์ฐ๋ฆฌ๊ฐ ๋ช
์์ ์ผ๋ก ์ถ์ ํ๊ธฐ ์ํจ์ด๋ค. ์ด ๊ฐ๋จํ ์ฝ์์ ๋น์ ์ ์๋๊ฐ ๋ ๋ช
์์ ์ผ ์ ์๋๋ก ๋ง๋ ๋ค. ๊ทธ๋์ ๋น์ ์ด state๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝํ๋๋ก ๋ง๋ ๋ค. ๊ฒ๋ค๊ฐ ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋ชจ๋ mutation์ ๋ํด ๊ธฐ๋กํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, state์ ์ค๋
์ท์ ์ฐ๊ณ ๊ฒ๋ค๊ฐ ๋๋ฒ๊น
๊ณผ์ ์์ time travel๋ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
store์ state๋ฅผ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๊ฒ์ computed ์์ฑ ์์ ์๋ ์ํ๋ฅผ ๋ฐํํ๋ ๊ฒ์ ํฌํจํ๋ค.
์๋ํ๋ฉด store์ state๋ ๋ฐ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ณํ๋ฅผ ์ผ๊ธฐํ๋๊ฒ์ ๊ฐ๋จํ๊ฒ ์๊ธฐํ๋ฉด ์ปดํฌ๋ํธ ๋ฉ์๋์ ๋ณ๊ฒฝ๋ ๊ฐ์ ์ปค๋ฐํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด์ vuex์ ๋ํด state๋ถํฐ ํ๋ฒ ์์๋ณด์.