# Vuex in Nuxt
๋์คํธ์์ ๋ทฐ์์ค(Vuex)๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ํ๋ก์ ํธ ํด๋์ ๋ฃจํธ ๋ ๋ฒจ์ store ํด๋๋ฅผ ์์ฑํ๊ณ ๊ทธ ๋ฐ์ js ํ์ผ์ ์์ฑํฉ๋๋ค.

์ด๋ ๊ฒ ํ๋ฉด Vuex ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ํฌํธ ๋๋ฉด์ ๋ทฐ์์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
TIP
๋ง์ฝ ํ๋ก์ ํธ ํด๋์ store ํด๋๊ฐ ์๋ค๋ฉด ๋ทฐ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ผ๋ก ๋นํ์ฑํ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋นํ์ฑํ๋ ๋น๋ ํ์ผ์ ํฌํจ๋์ง ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
# ๋ทฐ์์ค ์์ํ๊ธฐ
๋ทฐ์์ค๋ Vue.js์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ ํจํด์ ์๋ฏธํฉ๋๋ค. ๋ทฐ์์ค๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅธ๋ค๋ฉด Vuex ์๊ฐ ๊ธ์ ๋จผ์ ํ์ตํ๊ณ ์ดํ ๋ด์ฉ์ ํ์ตํ์ธ์.
๋์คํธ์์ ๋ทฐ์์ค๋ฅผ ์์ํ๊ธฐ ์ํด์๋ store/index.js ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๊ฐ์ ๋ด์ฉ์ ์
๋ ฅํด์ผ ํฉ๋๋ค.
// 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);
}
}
๊ธฐ์กด ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ๋ ๋ค๋ฅด๊ฒ ์์ ๊ฐ์ด ๊ธฐ๋ณธ ์ฝ๋๋ง ์์ฑํด ์ฃผ๋ฉด ๋์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ผ๋ก ๋ทฐ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์ค์ ์์ ์ ์งํํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ทฐ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฃฐ ๋ ์์ฑํ๋ ์๋ ์ค์ ์ฝ๋๊ฐ ํ์ํ์ง ์์ต๋๋ค.
// ์๋ ์ค์ ์ฝ๋๋ Nuxt ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ผ๋ก ์์ฑํ๊ณ ์ค์ ํด ์ค
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
new Vuex.Store({
// ...
})
์์์ ์๋ดํ store/index.js ํ์ผ์ ๋ด์ฉ์ ๋ทฐ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ธฐ์กด์ ๋ทฐ์์ค๋ฅผ ์ ๊ทผํ๋ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
<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>
# ๋ทฐ์์ค์ ๋ชจ๋ํ
store ํด๋ ๋ฐ์ ์์ฑํ index.js๋ ๋ทฐ์์ค์ ๋ชจ๋ํ ๊ด์ ์์ ๋ฃจํธ ๋ชจ๋์ด ๋ฉ๋๋ค. ๋ง์ฝ index.js ๋ฅผ ์์ฑํ๊ณ ๋ค๋ฅธ ์ด๋ฆ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ๋ฉด ๋ทฐ์์ค์ ๋ชจ๋์ด ๋ฉ๋๋ค. products.js ํ์ผ์ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
// store/products.js
export const state = () => ({
items: []
})
export const mutations = {
addItems(state, item) {
state.items.push(item);
}
}
์ ์ฝ๋๋ ๋ง์น ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ์ฝ๋์ ๊ฐ์ด ๋์ํฉ๋๋ค.
// 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);
}
}
}
}
})
# nuxtServerInit
nuxtServerInit ์์ฑ์ ๋์คํธ์ universal ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ ์ก์
ํจ์์
๋๋ค.
// store/index.js
actions: {
nuxtServerInit(context, { req }) {
if (req.session.user) {
context.commit('user', req.session.user)
}
}
}
์ ํจ์๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์คํ ์ด์ ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํด ๋๊ฑฐ๋ ์๋ฒ์์๋ง ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค. ๋ง์ฝ, ์๋ฒ์์ ์ธ์ ์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ์ด๊ณ ์ธ์ ์ ์ฐ๊ฒฐ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์คํ ์ด์ ์ ์ฅํด์ผ ํ ๋ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์คํ ์ด์ ๋ฏธ๋ฆฌ ๋ด์๋์ ์ ์์ต๋๋ค.
nuxtServerInit ์ก์
ํจ์์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์คํ ์ด์ ์ปจํ
์คํธ (opens new window) ์ ๋ณด๋ฅผ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด์
๋๋ค. ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ๋์คํธ์ ์ปจํ
์คํธ (opens new window) ์ ๋ณด๊ฐ ๋ด๊ธด ๊ฐ์ฒด์
๋๋ค.
// store/index.js
actions: {
nuxtServerInit(storeContext, nuxtContext) {
storeContext.commit('๋ฎคํ
์ด์
ํจ์๋ช
');
if (process.server) {
const { req, res, beforeNuxtRender } = nuxtContext;
}
}
}
์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ nuxtContext๋ asyncData ๋ฉ์๋์ context (opens new window) ํ๋ผ๋ฏธํฐ์ ๊ฐ์ต๋๋ค.
โ Data Fetching Middleware โ