[Vue.js & Nuxt.js]Vuex๋ž€?

2022. 4. 1. 15:52ใ†Front-End ์ž‘์—…์‹ค/๊ธฐํƒ€ ์ฐธ๊ณ  ์ž๋ฃŒ

728x90
๋ฐ˜์‘ํ˜•

 

 

๐Ÿš€ Vuex

    ๐Ÿ”ฝ  ๊ฐœ์š”

Vuex(๋ทฐ์—‘์Šค)๋ž€ Application ์ƒํƒœ ๊ด€๋ฆฌ(State Management)๋ฅผ ๋•๋Š” Library์ธ ๊ฒƒ์ด์—์š”.

๋จผ์ € ์ƒํƒœ(State)๋ž€ Vue์˜ data ์†์„ฑ๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์ด์—์š”.
์—ฌ๊ธฐ์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋ž€ ํ˜„๋Œ€ FE(Front End) Framework์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ Pattern์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด์—์š”.
Vue.js์—์„œ๋Š” Vuex๋ผ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ Pattern์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” Component์˜ ์ˆซ์ž๊ฐ€ ๋งŽ์•„์กŒ์„ ๋•Œ, Component ๊ฐ„ Data ์ „๋‹ฌ์ด๋‚˜, ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์ด์—์š”.
Data ์ „๋‹ฌ์„ ๋” ๋ช…์‹œ์ ์ด๊ณ , ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ์ƒํƒœ ๊ด€๋ฆฌ๋ž๋‹ˆ๋‹ค.


Vuex๋ž€ Vue.js์˜ ์ƒํƒœ ๊ด€๋ฆฌ Pattern์ด์ž Library์ธ ๊ฒƒ์ด์—์š”. ์•„๋ž˜๋Š” Vuex์˜ ๊ฐœ๋…์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋„์‹ํ™”ํ•œ ๊ทธ๋ฆผ์ธ ๊ฒƒ์ด์—์š”.

์ถœ์ฒ˜ : https://joshua1988.github.io/vue-camp/vuex/concept.html#%E1%84%87%E1%85%B2%E1%84%8B%E1%85%A6%E1%86%A8%E1%84%89%E1%85%B3-%E1%84%89%E1%85%A9%E1%84%80%E1%85%A2


์œ„์—์„œ ๋ณด์ด๋“ฏ์ด ํ™”๋ฉด(View) -> ํ™”๋ฉด์—์„œ์˜ Event ๋ฐœ์ƒ(Actions) -> Data Change(State)์˜ Data๊ฐ€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•์ธ ๊ฒƒ์ด์—์š”.

 

 

        ๐Ÿ“ฆ Vuex ๊ธฐ์ˆ  ์š”์†Œ

Vuex์˜ ์ฃผ์š” ๊ธฐ์ˆ  ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์ด์—์š”.

โ— state
โ— getters
โ— mutations
โ— actions

 



๊ทธ๋ ‡๋‹ค๋ฉด Vue data ์†์„ฑ๊ณผ '์ƒํƒœ'๋Š” ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ์š”?

 

Component ๊ฐ„ Data ์ „๋‹ฌ ๊ด€๊ณ„๋„

์œ„ ๊ทธ๋ฆผ์€ `id`๋ผ๋Š” Data๋ฅผ `Loing` Form Component์—์„œ `Main` Component๋กœ ์ „๋‹ฌํ•˜๋Š” Component ๊ฐ„ ๊ด€๊ณ„๋„ ์ธ ๊ฒƒ์ด์—์š”. `Loing` Form Component๋ฅผ ํฌํ•จ ๋ชจ๋“  Component์—์„œ `id`๋ผ๋Š” Data(์ƒํƒœ - State)๋ฅผ ์„œ๋กœ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๋งŒ์•ฝ `Loing` Form์—์„œ ์ž…๋ ฅ ๋ฐ›์€ `id`๋ฅผ `Main` Component์— ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋ฉด `Loing` Form Component์—์„œ `Main` Component๋กœ Data ์†์„ฑ `id`๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ๊ฒƒ์ด์—์š”. ๊ทธ๋Ÿฌ๋ฉด `id`๋Š” ์ƒ์œ„ Component์ธ `Loing` Component์™€ ์ตœ์ƒ์œ„ Component๋ฅผ ๊ฑฐ์ณ ๋‹ค์‹œ ์ตœ์ƒ์œ„์˜ ํ•˜์œ„ Component์ธ `Main` Component๋กœ ์ „๋‹ฌ ๋  ๊ฒƒ์ด์—์š”. ์ด์ฒ˜๋Ÿผ ํŠน์ • Data๋ฅผ ์—ฌ๋Ÿฌ Component๊ฐ€ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ `์ƒํƒœ(State)`๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ฐธ๊ณ ๋กœ ์ด ๊ฐœ๋…์€ `React.js`์—๋„ ๋™์ผํ•˜๊ฒŒ ์กด์žฌํ•˜๋Š” ๊ฐœ๋…์ธ ๊ฒƒ์ด์—์š”.

๊ทธ๋ ‡๋‹ค๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

Component๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฌธ์ œ์ 

์•ž์—์„œ ์‚ดํŽด ๋ณธ ๊ทธ๋ฆผ๊ณผ ์œ„ ๊ทธ๋ฆผ์˜ ์ฐจ์ด์ ์€ `Loing` Form Component์—์„œ `Main` Component๋กœ Data๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ, `Loing` Component์™€ ์ตœ์ƒ์œ„ Component ์‚ฌ์ด์— ๋„ˆ๋ฌด ๋งŽ์€ Component๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—์š”.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด `props`๋กœ Data๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, `Loing` Form Component์™€ ์ตœ์ƒ์œ„ ์‚ฌ์ด์— ์žˆ๋Š” ๋ชจ๋“  Component์— `props`๋ฅผ ์„ค์ •ํ•ด ์ค˜์•ผ ํ•  ๊ฒƒ์ด์—์š”. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด Data ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ธฐ๋ผ๋„ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์—„์ฒญ๋‚œ ๊ณ ์ƒ์ด ๋’ท ๋”ฐ๋ฅผ ๊ฒƒ์ด์—์š”.

์ด ๋•Œ, `props`๋ง๊ณ , `Event Bus`๋ฅผ ์ด์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ƒ-ํ•˜์œ„ ๊ฐ„ Data ์ „๋‹ฌ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ , ํ•œ ๋ฒˆ์— `Loing` Form Component์—์„œ `` Component๋กœ Data๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด ์‰ฝ๊ฒŒ Data๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ด์—์š”. ํ•˜.์ง€.๋งŒ ์—ฌ๊ธฐ์„œ ์ƒ์‹œ๋Š” ๋ฌธ์ œ์ ์€ ๋‹จ๋ฐฉํ–ฅ Data ํ๋ฆ„์ด ์•„๋‹Œ ์…€ ์ˆ˜ ์—†์ด ๋งŽ์€ Data ํ๋ฆ„(Countless Ways Data Flow)์ด ๋ฐœ์ƒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด์—์š”.Main

 

Data ํ๋ฆ„ ๊ทœ์น™์ด ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์€ ๋ชจ์Šต

๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ์š”!

์•ž์˜ ๊ตฌ์กฐ์ฒ˜๋Ÿผ ๋ช‡ ๊ฐœ ๋˜์ง€ ์•Š๋Š” Component ๊ฐ„ Data ํ†ต์‹ ๋„ ์–ด๋””์—์„œ ์™€์„œ ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šด๋ฐ, ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ์˜ Component๋ฅผ ๊ฐ€์ง„ Application์„ ์ œ์ž‘ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์—„์ฒญ๋‚œ ๊ณ ํ†ต์— ์‹œ๋‹ฌ๋ฆฌ๊ฒŒ ๋  ๊ฒƒ์ด์—์š”.

์ด๋Ÿด ๋•Œ ํ•„์š”ํ•œ ๊ฒŒ ๋ฐ”๋กœ `์ƒํƒœ ๊ด€๋ฆฌ`์ธ ๊ฒƒ์ด์—์š”. Application์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  Data๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ ํฌ๊ธฐ๊ฐ€ ํฐ Application์˜ Data ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด `์ƒํƒœ ๊ด€๋ฆฌ`์˜ ๋ชฉ์ ์ธ ๊ฒƒ์ด์—์š”.

 

 

 

 

        ๐Ÿ“ฆ Vuex ๊ตฌ์กฐ๋„

์ถœ์ฒ˜ : https://joshua1988.github.io/vue-camp/vuex/concept.html#%E1%84%87%E1%85%B2%E1%84%8B%E1%85%A6%E1%86%A8%E1%84%89%E1%85%B3-%E1%84%83%E1%85%B3%E1%86%BC%E1%84%85%E1%85%A9%E1%86%A8

 

Data์˜ ํ๋ฆ„์€ Actions -> Mutations -> State ์ˆœ์„œ๋กœ ํ˜๋Ÿฌ๊ฐ€๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ  Vuex ์„ค์น˜ํ•˜๊ธฐ

CDN

<script src="https://unpkg.com/vuex"></script>

 

 

NPM

npm install vuex --save

 

Yarn

yarn add vuex

Module System๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `Vue.use()`๋ฅผ ํ†ตํ•ด Vuex๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export const store = new Vuex.Store({
	// .....
});

Vue Store ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ES6 import/export ๋ฌธ๋ฒ•์œผ๋กœ main.js File์— ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์— ์ฃผ์ž…ํ•ด ์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

// main.js
import Vue from 'vue';
import { store } from './store.js';

new Vue({
  store: store
});

 

 

yarn add vuex

์ฃผ๋‹ˆํ•˜๋ž‘์€ `yarn`์„ ์ด์šฉํ•ด์„œ ์„ค์น˜ ํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

 

 

 

 

๋ฐ˜์‘ํ˜•

 

 

 

 

๐Ÿš€ Nuxt.js์˜ Vuex

    ๐Ÿ”ฝ  Vuex in Nuxt

        ๐Ÿ“ฆ ๊ฐœ์š”

Nuxt.js์—์„œ Vuex๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Project Package์˜ Root Level์— store๋ผ๋Š” Package๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ๋ฐ‘์— ~~.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.


 

์œ„์™€ ๊ฐ™์ด ํ•ด ์ฃผ๋ฉด Vuex Library๊ฐ€ Import ๋˜๋ฉด์„œ Vuex๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
๋งŒ์•ฝ Project Package์— store๊ฐ€ ์—†๋‹ค๋ฉด Vuex Library๋Š” ์ž๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋œ๋‹ค.
์—ฌ๊ธฐ์„œ ๋น„ํ™œ์„ฑํ™”๋ž€ Build File์— ํฌํ•จ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธ.




 

 

        ๐Ÿ“ฆ Vuex ์‹œ์ž‘ํ•˜๊ธฐ

Vuex๋Š” Vue.js์˜ ์ƒํƒœ ๊ด€๋ฆฌ Library์ด์ž Pattern์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
Nuxt.js์—์„œ Vuex๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” /store/index.js File์„ ๋งŒ๋“ค๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// store/index.js
export const state = () => ({
  user: {}
})

export const mutations = {
  setUser(state, user) {
    state.user = user;
  }
}

export const actions = {
  async fetchUser(context) {
    const response = await axios.get('users/1');
    context.commit('setUser', response.data);
  }
}


๊ธฐ์กด Single Page Application๊ณผ ๋‹ค๋ฅด๊ฒŒ ์œ„์™€ ๊ฐ™์ด ๊ธฐ๋ณธ Code๋งŒ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด Nuxt.js Library ๋‚ด๋ถ€์ ์œผ๋กœ Vuex Library Import์™€ Configuration ์ž‘์—…์„ ์ง„ํ–‰ ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Vuex Library๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ž‘์„ฑํ•˜๋˜ ์•„๋ž˜ ์„ค์ • Code๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”.

// ์•„๋ž˜ ์„ค์ • ์ฝ”๋“œ๋Š” Nuxt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •ํ•ด ์คŒ
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

new Vuex.Store({
  // ...
})

์•ž์—์„œ ์•ˆ๋‚ดํ•œ /store/index.js File์˜ ๋‚ด์šฉ์€ Vue Component ๋‚ด๋ถ€์—์„œ ๊ธฐ๋ณธ์— Vuex๋ฅผ ์ ‘๊ทผํ•˜๋˜ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์š”.


<template>
  <div>
    <p>{{ $store.state.user }}</p>
    <button @click="displayUser"></button>
  </div>
</template>

<script>
export default {
  methods: {
    displayUser() {
      const user = { name: '๋„‰์ŠคํŠธ' };
      this.$store.commit('setUser', user);
    }
  }
}
</script>



        ๐Ÿ“ฆ Vuex Module

store Package ๋ฐ‘์— ์ƒ์„ฑํ•œ index.js๋Š” Vuex์˜ ๋ชจ๋“ˆํ™” ๊ด€์ ์—์„œ Root Module์ด ๋œ๋‹ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ index.js๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค๋ฅธ ์ด๋ฆ„์˜ Java Script File์„ ์ƒ์„ฑํ•˜๋ฉด Vuex์˜ ๋ชจ๋“ˆ์ด ๋˜๋Š” ๊ฒƒ์ด์—์š”. products.js File๋กœ ๊ณต๋ถ€๋ฅผ ํ•ด ๋ณผ๊ฒŒ์š”.

// store/products.js
export const state = () => ({
  items: []
})

export const mutations = {
  addItems(state, item) {
    state.items.push(item);
  }
}


์œ„ Code๋Š” ๋งˆ์น˜ Single Page Application์˜ ์•„๋ž˜ Code์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

// Vue CLI๋กœ ์ƒ์„ฑํ•œ ํ”„๋กœ์ ํŠธ์—์„œ Vuex๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

new Vuex.Store({
  state: () => ({
    user: {}
  }),
  // ...
  modules: {
    products: {
      namespaced: true,
      state: () => ({
        items: []
      }),
      mutations: {
        addItems(state, item) {
          state.items.push(item);
        }
      }
    }
  }  
})





 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•