[Vue.js] Vuex api (1) Get Started

catetoยท2021๋…„ 1์›” 28์ผ
0
post-thumbnail
post-custom-banner

์ด ๋ฌธ์„œ๋Š” ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด Vuex ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ฒˆ์—ญํ•œ ๊ฒƒ์œผ๋กœ ์ด๋ฏธ ํ•œ๊ตญ์–ด api๊ฐ€ ์กด์žฌํ•จ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿš€https://vuex.vuejs.org/kr/๐Ÿš€

๋ทฐ์—‘์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? (๋ทฐ๋ฒ„์ „ 2๋ฅผ ์œ„ํ•œ ๋ทฐ์—‘์Šค 3)

๋ทฐ์—‘์Šค๋Š” 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์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ์ถ”์ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ก์„ ๋ณด์žฅํ•˜๋ฉฐ ์šฐ๋ฆฌ์—๊ฒŒ ๋” ๋‚˜์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ store

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๋ถ€ํ„ฐ ํ•œ๋ฒˆ ์•Œ์•„๋ณด์ž.

profile
Curious for Everything
post-custom-banner

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