๐ฅVueJS, VueX ๋ฐ VueX Persisted State๋ฅผ ์ฌ์ฉํ ์๊ตฌ ์ ์ฅ์ ๐ฅ
์ด ๋น ๋ฅธ ์์ ์์๋ vuex ๋ฐ vuex-persistedstate๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ฒ์ ์ผ์ผํค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค!
VueJS ํ๋ก์ ํธ๋ฅผ ์ด๋ฏธ ์์ฑํ๋ค๊ณ ๊ฐ์ ํ๋ฉด
vuex
์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ์ถ๊ฐ ์ข
์์ฑ์ด ํ์ํฉ๋๋ค.npm install --save vuex
์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
โโโ index.html
โโโ main.js
โโโ components
โ โโโ App.vue
์์ ์์ฑ์ ์์ํ๋ ค๋ฉด
store
๋ฐ components
์ ๋์ผํ ์์ค์ main.js
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.๊ทธ๋ฐ ๋ค์ ์๋ก ์์ฑ๋
store
๋๋ ํ ๋ฆฌ ๋ด๋ถ์ index.js
๋ฅผ ์์ฑํ ๊ฒ์
๋๋ค. ์ด๋ ๋งค์ฅ ๊ตฌ์ฑ์ ์ํ ์ฐธ์กฐ ์ง์
์ ์ด ๋ ๊ฒ์
๋๋ค.๋ด๋ถ
store/index.js
ํ์ผ์์ ์คํ ์ด๋ฅผ ์์ฑํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ด๋ณด๋ผ ๊ฒ์
๋๋ค.import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.Store({
});
export default store
๊ทธ๊ฒ ๋ค์ผ! ์ฐ๋ฆฌ ๊ฐ๊ฒ๋ฅผ ๋ง๋ค์์ต๋๋ค!
์ด์ ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
โโโ index.html
โโโ main.js
โโโ components
โ โโโ App.vue
โโโ store
โโโ index.js
๋ค์ ๋จ๊ณ๋ ๋งค์ฅ์ ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด
main.js
ํ์ผ ๋ด๋ถ์์ ์ฐธ์กฐํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.import Vue from 'vue'
import App from './components/App'
import store from './store';
Vue.config.productionTip = false
new Vue({
el: '#app',
store,
template: '<App/>',
components: { App }
})
๋๋ผ์ด! ๊ทธ๋ฌ๋ ์ค์ ๋ ผ๋ฆฌ๋ ์ด๋ป์ต๋๊น?
์ด์ ์ผ๋ถ ์ฌ์ฉ์ ID ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ(์ฌ์ฉ์ ID๋ฅผ ์ค์ ํจ) ๋ฐ ๋ก๊ทธ์์(์ฌ์ฉ์ ID๋ฅผ null๋ก ์ค์ ํจ)์ด ์์ต๋๋ค.
๋จผ์
modules
ํด๋์ store
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ๋ณธ ๋
ผ๋ฆฌmodules
๋ ์ผ๋ถ ์ปจํ
์คํธ์ ๋ฐ๋ผ ์ ์ฅ์๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ผ ํ์ผ๊ณผ ๊ด๋ฆฌํ ์ ์๋ ์ด๋ํ ์ ์ฅ์๋ก ๋๋ ์ ์์ต๋๋ค.modules
๋ด๋ถ์์ ์ด์ ํ์ํ ๋ชจ๋ ๋
ผ๋ฆฌ๋ก account.js
๋ฅผ ๋ง๋ค ์ฐจ๋ก์
๋๋ค.const state = {
userId: null
};
const mutations = {
logout(state) {
state.userId = null;
},
login(state, userId) {
state.userId = userId;
}
};
export default {
state,
mutations
}
๊ทธ๋์, ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์์ต๋๊น?
๋จผ์
userId
๋ผ๋ ๋จ์ผ ๋ณ์๋ก store ์์ฑ์ ์ ์ธํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก null
์
๋๋ค.๋ค์์ผ๋ก
mutations
๋ฐ login
์ ๋ ๊ฐ์ง ๊ฐ๋จํ ํจ์๊ฐ ์๋ logout
๋ผ๋ ํญ๋ชฉ์ด ์์ต๋๋ค. ๊ธฐ๋ณธ ์์ด๋์ดvuex
๋ ์์ ์ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ๋ค๋ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฌํ ํจ์๋ ์ปค๋ฐ ์์๋ง ํธ์ถ๋ฉ๋๋ค.์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
โโโ index.html
โโโ main.js
โโโ components
โ โโโ App.vue
โโโ store
โโโ index.js
โโโ modules
โโโ account.js
ํ์ง๋ง ์๋ก ์์ฑ๋
account.js
์ ๋ํด ๋งค์ฅ์์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ์ ์ธํด์ผ ํฉ๋๋ค!์ฐ๋ฆฌ
store/index.js
๋ด๋ถ์์ ํด๋ด
์๋ค:import Vue from 'vue'
import Vuex from 'vuex'
import account from './modules/account'
Vue.use(Vuex);
const store = new Vuex.Store({
modules: {
account,
}
});
export default store
๋ณด์๋ค์ํผ, ์ฐ๋ฆฌ๋ ๋จ์ํ
account.js
๋ฅผ ๊ฐ์ ธ์ ์คํ ์ด์ ๋ชจ๋ ๋ด์์ ์ฐธ์กฐํ์ต๋๋ค. ์ฌ์ด!์ฐ๋ฆฌ์ ๋๋ผ์ด ๊ฐ๊ฒ๋ฅผ ์ํํด ๋ณผ ์๊ฐ์ ๋๋ค!
๋ด๋ถ
App.vue
:<template>
<div>
<div>{{this.userId}}</div>
<button @click="login()">Login as Nick</button>
<button @click="logout()">Logout</button>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'app',
computed: mapState({
userId: state => state.account.userId
}),
methods: {
login() {
this.$store.commit('login', 'Nick')
},
logout() {
this.$store.commit('logout')
}
},
}
</script>
์ด ์์ ์์๋ ๊ธ๋ก๋ฒ ์ํ๋ฅผ ๋ก์ปฌ ์ ์ฅ์ ์์ฑ์ผ๋ก ๋ณํํ ์ ์๋
mapState
vue ์์ฑ ๋ด๋ถ์ vuex
์์ computed
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ ์ญ ์ ์ฅ์์์ ๋ณ๊ฒฝ๋ ์ฌํญ์ด ์์ผ๋ฉด ๊ตฌ์ฑ ์์ ์์ฑ์์๋ ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก this.userId
์ปจํ
์คํธ์ ๊ธ๋ก๋ฒ ์ ์ฅ์์์ ์ง์ ๋งคํ๋๋ account
๋ฅผ ๊ฐ๋จํ ์ฌ์ฉํ ์ ์์ต๋๋ค.๋ค์์ผ๋ก
login
๋ฐ logout
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ด์ ๋ณผ ์ ์๋ฏ์ด ์คํ ์ด๋ฅผ ์์ ํ๊ธฐ ์ํด ์ด์ ์ account mutations
์์ฑ์ ์ง์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค.๋๋ฐ! ์ฐ๋ฆฌ๊ฐ ํด๋์ด!
ํ์ง๋ง... ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด...
์, ๋ถํํ๋ ์ง์๋์ง ์์ต๋๋ค.
Chrome์์
Application/Local Storage
๋ฅผ ์ด๋ฉด ์ฐ๋ฆฌ์ userId
ํ์ ์ด ์์ต๋๋ค.๊ทธ๋ฌ๋ vuex-persistedstate๋ผ๋ ์๋ฃจ์ ์ด ์์ต๋๋ค!
์ํ๋ฅผ ๋ก์ปฌ ์ ์ฅ์์ ์ ์งํ ์ ์๋ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด ๋ณด๊ฒ ์ต๋๋ค.
npm install --save vuex-persistedstate
๋ฐ๋๋ผ ๊ตฌ์ฑ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฌ๊ทธ์ธ ๋ด๋ถ
store/index.js
๋ก ์ฐธ์กฐํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.import Vue from 'vue'
import Vuex from 'vuex'
import account from './modules/account'
import createPersistedState from "vuex-persistedstate";
Vue.use(Vuex);
const store = new Vuex.Store({
modules: {
account,
},
plugins: [createPersistedState()]
});
export default store
์ด์ ๋ก๊ทธ์ธํ ํ ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์ ์ฅ์์ ์ ์ง๋ฉ๋๋ค!
์ํ์ด, ํด๋์ด! ์ด์ ๋น์ ์ ์ฑ์ ์ง์ ์ผ๋ก ๋ฌผ๊ฑด์ ์ ์ฅํ ์ ์์ต๋๋ค!
๋ ๋ง์ ์ฐธ์กฐ๋ฅผ ๋ณด๋ ค๋ฉด ์ฌ๊ธฐ๋ก ์ด๋ => https://vuex.vuejs.org/
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฅVueJS, VueX ๋ฐ VueX Persisted State๋ฅผ ์ฌ์ฉํ ์๊ตฌ ์ ์ฅ์ ๐ฅ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/nickitax/persistent-store-with-vuejs-vuex-and-vuex-persisted-state-354nํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค