# state vs data

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํ…Œ์ดํŠธ(application state)๋Š” ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํ…Œ์ดํŠธ๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” data์™€ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” state๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋ฒ”์œ„์™€ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹

data ์†์„ฑ์—๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. data ์†์„ฑ์— ์„ ์–ธ๋œ ๊ฐ’์€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด data๋ฅผ ์ •์˜ํ•˜๊ณ , ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<div>{{ message }}</div>
new Vue({
  data: {
    message: 'Hello Vue.js'
  }
})

Vuex์˜ state์—๋Š” ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. state์— ์„ ์–ธ๋œ ๊ฐ’์€ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ์ ‘๊ทผํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. state์— ์ •์˜ํ•œ ๋ณ€์ˆ˜๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<div>{{ this.$store.state.message }}</div>
new Vuex.Store({
  state: {
    message: 'Hello Vue.js'
  }
})

# ๊ฐ’ ๋ณ€๊ฒฝ ๋ฐฉ์‹

data ์†์„ฑ์— ์„ ์–ธ๋œ ๊ฐ’์€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. data๋Š” ๋ทฐ์˜ ๋ฐ˜์‘์„ฑ(Reactivity)์ด ๋ฐ˜์˜๋œ ์†์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด Vue๊ฐ€ ๋ฐ”๋กœ ๊ฐ์ง€ํ•˜์—ฌ ํ™”๋ฉด์— ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

<template>
  <div>{{ count }}</div>
  <button @click="increment">+</button>
</template>
new Vue({
  data: {
    count: 0
  },
  methods: {
    increment() {
      this.count += 1;
    }
  }
})

state์— ์„ ์–ธ๋œ ๊ฐ’์€ ๋ฎคํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template>
  <div>{{ this.$store.state.count }}</div>
  <button @click="increase">+</button>
</template>
// count.vue
new Vue({
  methods: {
    increase() {
      this.$store.commit('increment');
    }
  }
})
// store.js
new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count += 1;
    }
  }
})

# Vuex๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

Vuex๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋งŒ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํ…Œ์ดํŠธ ์ฆ‰, data ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ data๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, prop ์†์„ฑ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก, ์ด๋Ÿฐ ๋ฐฉ์‹์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์Šคํ…Œ์ดํŠธ๋Š” Vuex๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Vuex์˜ store๋ฅผ ํ†ตํ•ด state๋ฅผ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด, ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณต์œ ํ•˜๋Š” state์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Vuex์˜ state๋„ Vue ์ธ์Šคํ„ด์Šค์˜ data์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ทฐ์˜ ๋ฐ˜์‘์„ฑ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— state์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ฐ”๋กœ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.