์๋ฌธ
Vuex๋ฅผ ํตํด ๊ตฌ์ฑ ์์ ๊ฐ์ ๋ฐ์ดํฐ ํต์ ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ง๋ง Vue ํ๋ก์ ํธ ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ ๋ค๋ฅธ ์ข์ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋๊ตฌ ์ธ Pinia๊ฐ ์์ต๋๋ค. Vuex์ ๋นํด Pinia์์๋ Vuex๋ฅผ ์ ๊ฑฐํ์ฌ ๋ฐ๋ชฉ ํ์ฐ๋ฅผ ๊ฐ์ ธ ์์ ์ ์ฅ์๋ก ์ ์ฅํ ์ ์๋๋กํฉ๋๋ค! ์ต์ ๋์ง ์์ ๋ฐฉ์ข ๋ด๋ถ ....
์์, ์ฐ์ ์ค๋์ ๋ฐ๋ชจ์ ํจ๊ณผ๋ฅผ ๋ณด์, ๋ฐ๋ชจ๋ ์ด๋ ต์ง ์๊ณ Pinia์ ์ดํด์ ์ค์ ์ ๋ก๋๋ค.
์ค๋์ ์๋ก์ด ์น๊ตฌ์ธ ํผ๋์์ ๋ํด ์์๋ณด๋ TodoList ๊ฐ๋จํ ๋ฐ๋ชจ๋ฅผ ํตํด ์์๋ณด์ธ์!
ํ๋ก์ ํธ ์ด๊ธฐํ vue Cli| Vite
์ค๋์ ์ฌ์ ํ Vue ํ๋ก์ ํธ์ด์ง๋ง, ์ฐ๋ฆฌ ๋ชจ๋๋ vite๊ฐ Vue ํ์์ ๊ฐ๋ฐํ ์ฐจ์ธ๋ ์ค์บํด๋ฉ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด Vite์ Vue Cli ์ค์บํด๋ฉ์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น์?
๊ฐ๋จํ ๋งํด์ Cli๋ ๋ ธ์ธ์ ๊ฐ๊น๊ณ Vue์์ ํ์ด ๋ฌ์ผ๋ฉฐ Vue ๋ง ์ง์ํ๋ฉฐ ์ฝํ ์ธ ๊ฐ ํ๋ถํ๊ณ ํ๋ก์ ํธ ๊ฐ๋ฐ์ ์ํด ์ ๊ณ ๋ ค๋์ด ์์ผ๋ฉฐ ์ ์ ๋ฐฅ์ ๋จน์ด๋ ๊ฒ์ ๊ฐ๊น๋ค๋ ๊ฒ์ ๋๋ค.
Vue ํ์ Vite๋ฅผ Vue์ ๊ตญํ๋์ง ์๋ ๋ฒ์ฉ ๋น๋ ๋๊ตฌ๋ก ๋ง๋ค๊ธฐ ์ํด ๋ ๊ฐ๋ณ๊ณ ์ปดํฉํธํ๋ฉฐ, ES6 ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ES6 ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ์ฝ๋๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ง์ ํจํค์งํ์ฌ ์ฌ์ฉํ ํ์๊ฐ ์๋ Vite๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค . ๋ฐ๋ผ์ ํจํค์ง ๊ณผ์ ์์ ์ค๋ณต๋๋ ์ฝ๋ ํ์ฑ ํ๋ก์ธ์ค๋ฅผ ์ ๊ฑฐํ์ฌ ํ๋ก์ ํธ๋ฅผ ๋ ์ํํ๊ณ ๋น ๋ฅด๊ฒ ์คํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๊ท๋ชจ ํ๋ก์ ํธ์์๋ Vite ์ค์บํด๋ฉ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
Vite ํ๋ก์ ํธ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ, VueCli์์ ์ฐจ์ด์ , ์ ํ ๋ฐฉ๋ฒ์ ๋ํ ์ฃผ์ ์๊ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋์ ํํ ๋ฆฌ์ผ์ ๊ฒ์ํ ํ ๋ ์ง์ ํ๋ ์ดํด ๋ณด์ธ์!
ํผ๋์ ์์ํ๊ธฐ
1. ์ฌ๊ธฐ์๋ node.js์์ ์ ๊ณตํ๋ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ํตํด Pinia ์ข ์ ์์๋ฅผ ์ง์ ๋ค์ด๋ก๋ํ๋๋ก ์ ํํฉ๋๋ค.
๋ฌผ๋ก yarn๊ณผ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ ํํ์ฌ
2. ์ค์น๊ฐ ์๋ฃ๋๋ฉด ๋ชจ๋์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์์ํ ์ฐจ๋ก์ ๋๋ค.
ํ ์ผ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ชจ๋์ ๋น๋ํ๊ธฐ ์ํด ํ๋ก์ ํธ์ ์คํ ์ด ๋๋ ํฐ๋ฆฌ์ todo.js ํ์ผ์ ๋ง๋ค์์ต๋๋ค.
js// vue 3์ ref ํจ์์ Pinia์ defineStore ํจ์ ๊ฐ์ ธ์ค๊ธฐ import { ref } from 'vue' import { defineStore } from 'pinia' // defineStore ํจ์๋ก "todo"๋ผ๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ชจ๋ ์ ์ํ๊ธฐ export const useTodoStore = defineStore("todo", () => { // ref ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ์์ ๊ฐ์ฒด ์์๋ฅผ ํฌํจํ๋ ๋ฐ์ํ ๋ฐ์ดํฐ ๋ณ์ todos ์์ฑํ๊ธฐ const todos = ref([ { txt: '์ธ์์ ๊ธฐ๋ณต์ด ์ ๋ถ๊ฐ ์๋๋ค'} ]) // ํ ์ผ ๋ฐฐ์ด์ ์ ๊ฐ์ฒด ์์๋ฅผ ์ถ๊ฐํ๋ addTodo๋ผ๋ ํจ์๋ฅผ ์ ์ํฉ๋๋ค. const addTodo = () => { todos.value.push({ txt: ' }) } // ์ ์๋ ๋ฐ์ดํฐ ๋ณ์์ ํจ์๋ฅผ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐํํ๊ธฐ return { todos, addTodo } })
3. ๋ฐ์ํ ๋ฐ์ดํฐ์ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํ ์ ์์ต๋๋ค!
๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ณ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ ์ฉ ๊ตฌ์ฑ ์์ ํ์ผ์ธ src ๋๋ ํฐ๋ฆฌ์ ๊ตฌ์ฑ ์์ ํ์ผ ์๋์ TodoList.vue ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ญ๋๋ค.
js// vue 3์ ref ํจ์์ Pinia์ defineStore ํจ์ ๊ฐ์ ธ์ค๊ธฐ import { ref } from 'vue' import { defineStore } from 'pinia' // defineStore ํจ์๋ก "todo"๋ผ๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ชจ๋ ์ ์ํ๊ธฐ export const useTodoStore = defineStore("todo", () => { // ref ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ์์ ๊ฐ์ฒด ์์๋ฅผ ํฌํจํ๋ ๋ฐ์ํ ๋ฐ์ดํฐ ๋ณ์ todos ์์ฑํ๊ธฐ const todos = ref([ { txt: '์ธ์์ ๊ธฐ๋ณต์ด ์ ๋ถ๊ฐ ์๋๋ค'} ]) // ํ ์ผ ๋ฐฐ์ด์ ์ ๊ฐ์ฒด ์์๋ฅผ ์ถ๊ฐํ๋ addTodo๋ผ๋ ํจ์๋ฅผ ์ ์ํฉ๋๋ค. const addTodo = () => { todos.value.push({ txt: ' }) } // ์ ์๋ ๋ฐ์ดํฐ ๋ณ์์ ํจ์๋ฅผ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐํํ๊ธฐ return { todos, addTodo } })
4. ์ปดํฌ๋ํธ๋ ๊ฒฐ๊ตญ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋ ๊ฒ์ด๋ฏ๋ก App.vue์ ์ฌ์ฉํ๋๋ก ๋ฑ๋กํ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํฉ๋๋ค!
App.vue์์ TodoList ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ TodoStore ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํ ์ผ ๋ฐฐ์ด์์ ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ addTodo ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ์ํ๋ฉด ํ๋ก์ ํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค!
xml<template> <!-- TodoList๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๊ณ , ํ ์ผ์ ๋ฐฐ์ด์ todoStore์ ์ ๋ฌํ๊ณ , props๋ฅผ ํตํด addTodo ๋ฉ์๋๋ฅผ ์ ๋ฌํฉ๋๋ค.> <div> <TodoList :todos="todoStore.todos" :addTodo="todoStore.addTodo" /> </div> </template> <script setup> import TodoList from './components/TodoList.vue' import { useTodoStore } from './store/todos.js' // todoStore๋ผ๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ ์ธ์คํด์ค ๋ง๋ค๊ธฐ const todoStore = useTodoStore() </script> <style scoped> /* ์ ํ์ ์คํ์ผ, ์ฌ๊ธฐ์์ ์ปดํฌ๋ํธ์ ๋ก์ปฌ ์คํ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.*/ </style>
์์ฝ
์ด ํ๋ก์ ํธ์์๋ ๋ฐ์ดํฐ ์ํ ๊ด๋ฆฌ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ํ์ API๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด๋ Vuex๋ก ์์ฑํ ์์ ๋ฐ๋ชจ์ ๋นํด Pinia๊ฐ ํจ์ฌ ๋ ๊ฐ๋จํ ์ํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฌผ๋ก ์ํ, ๊ฒํฐ, ์ก์ ๋ฑ Pinia์ API๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ ์๋ ์๊ณ , Pinia์ defineStore๋ฅผ ๋์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ฌ๋ฌ ๊ฐ์ ์คํ ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ด ๋น์ฆ๋์ค ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ์ ํฉํฉ๋๋ค. ๋ํ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํํฌ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ด ๋ ํ๋์ ์ ๋๋ค.
๋ฌผ๋ก ์ต์ข ๋ถ์์์ ๋ ๊ฐ์ง๊ฐ ๊ฐ๋ฐ ๋๊ตฌ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ผ ๋ฟ์ด๋ฉฐ ์จ๋ผ์ธ ์ต์ข ํ๋ก์ ํธ ํจํค์ง์ ์ฌ์ ํ ์์ํ HTML & CSS & JS์ด๊ธฐ ๋๋ฌธ์ ์์ ์ ๋น์ฆ๋์ค ์๊ตฌ์ ๋ฐ๋ผ Vuex์ pinia๋ฅผ ์ ํํด์ผํ๋ ๋์ง์ ๋๋ค.
์ค๋์ ๋ด์ฉ์ ๋ง๋ฌด๋ฆฌํ๋ฉฐ ์ธ ๊ฐ์ง ์์ ์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
ํผ๋์ ์คํ ์ด์ ์ ์ฅ๋ ๋ฐ์ดํฐ.
- ํ๋ฐํธ์๋์์๋ store ๋๋ ํฐ๋ฆฌ์ todo.js ํ์ผ์ ์์ฑํ๊ณ defineStore ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ด๋ฆฌ ํจ์์ธ useTodoStore๋ฅผ ๊ฐ์ ธ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด Pinia๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- useTodoStore๋ฅผ ํธ์ถํ์ฌ ํ ์ผ ๋ฑ์ ์ํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์ปดํฌ๋ํธ.
import { useTodoStore } from './store/todo.js';ํตํด Vue ์ปดํฌ๋ํธ์์ useTodoStore ํจ์๋ฅผ ๋์ ํ ์ ์์ต๋๋ค.- ํ ์ผ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ useTodoStore๋ฅผ ํตํด ๊ฐ์ ธ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํฉ๋๋ค.
ํผ๋์์ ์ฅ์ .
- Pinia๋ defineStore ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ด๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ํ์ฌ ์ํ๋ฅผ ๋ณด๋ค ๊ฐ๋จํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ์ต์ ํํฌ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ฌ์ฉํฉ๋๋ค(์: useTodoStore๋ฅผ ํตํด ์ํ ๊ฐ์ ธ์ค๊ธฐ).
- ๋ฐ์ดํฐ์ UI ๊ตฌ์ฑ ์์๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๊ตฌ์ฑ ์์๊ฐ ๋ ๊น๋ํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฌ์์ง๋๋ค.
์ด๊ฒ์ผ๋ก ์ค๋์ ๊ธ์ ์ฌ๊ธฐ๊น์ง์ ๋๋ค.
๋ง๋ค๊ธฐ๊ฐ ์ฝ์ง ์์ผ๋ ์ด ๊ธ์ด ๋์์ด ๋์๋ค๊ณ ์๊ฐ๋๋ฉด ์ข์์๋ฅผ ๋๋ฌ์ฃผ์ธ์!
์์ธํ ์ฝ์ด๋ณด์ธ์.
: Gitee



