Frontend Academy · 강의

Vue를 위한 Pinia: defineStore와 storeToRefs

defineStore로 Pinia 저장소를 정의하고 컴포넌트에서 사용하며, 상태를 구조 분해할 때도 반응성을 유지하도록 storeToRefs를 사용합니다.

레슨 3/413개 단계

Vue를 위한 Pinia: defineStore와 storeToRefs은(는) CoddyKit의 무료 Frontend Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Frontend Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Pinia란 무엇입니까?

Pinia는 Vue 3의 공식 상태 관리 라이브러리입니다. Vuex를 대신하며, 더 단순하고 타입 안전하며 DevTools와 통합된 API를 제공합니다. Composition API와 비슷한 방식으로 사용할 수 있습니다.

Pinia 설치

Pinia 플러그인을 설치하고 Vue 앱에 등록하십시오.

npm install pinia

// main.ts
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';

const app = createApp(App);
app.use(createPinia());
app.mount('#app');

defineStore — Composition API 방식

defineStore는 스토어를 만듭니다. Composition API 방식에서는 컴포저블과 마찬가지로 ref, computed, 함수를 직접 사용합니다.

// stores/counter.ts
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0);
  const doubled = computed(() => count.value * 2);
  function increment() { count.value++; }
  return { count, doubled, increment };
});

defineStore — Options 방식

Options 방식은 Vue의 Options API를 본뜹니다. 반응형 데이터에는 state(), computed와 같은 기능에는 getters, methods와 같은 기능에는 actions를 사용합니다.

export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  getters: {
    doubled: (state) => state.count * 2,
  },
  actions: {
    increment() { this.count++; },
    async fetchAndSet(id: string) {
      this.count = await fetchCount(id);
    }
  }
});

구성 요소에서 스토어 사용

setup() 내부에서 스토어 훅을 호출하십시오. 스토어는 반응형 객체이므로 상태를 읽고 액션을 직접 호출할 수 있습니다.

<script setup>
import { useCounterStore } from '@/stores/counter';

const store = useCounterStore();
</script>

<template>
  <p>{{ store.count }}</p>
  <button @click="store.increment">+</button>
</template>

storeToRefs — 안전한 구조 분해

스토어를 직접 구조 분해하면 상태와 getter의 반응성을 잃어 일반 값이 됩니다. 반응성을 유지하며 구조 분해하려면 storeToRefs()를 사용하십시오.

import { storeToRefs } from 'pinia';

const store = useCounterStore();

// Actions can be destructured normally (they're functions):
const { increment } = store;

// State and getters need storeToRefs:
const { count, doubled } = storeToRefs(store);

$patch — 일괄 업데이트

store.$patch()는 여러 상태 변경을 하나의 작업으로 적용합니다. 서로 관련된 업데이트를 일괄 처리할 때 유용합니다.

store.$patch({
  count: 10,
  name: 'Updated'
});

// Or with a function for complex logic:
store.$patch(state => {
  state.items.push(newItem);
  state.total += newItem.price;
});

$subscribe — 스토어 변경 감시

store.$subscribe(callback)은 모든 스토어 변경에 반응합니다. 전체 스토어를 대상으로 하는 Vue의 watch와 비슷합니다.

Pinia 플러그인

Pinia 플러그인은 모든 스토어를 확장합니다. 일반적인 용도는 상태를 localStorage에 저장하거나, 디버깅 기록을 추가하거나, 서비스를 주입하는 것입니다.

import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';

const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);

Pinia DevTools

Pinia는 Vue DevTools와 통합됩니다. 스토어 상태를 검사하고, 어떤 작업이 호출되었는지 확인하며, 상태 스냅샷 사이를 시간 이동할 수 있습니다.

여러 스토어

도메인마다 하나의 스토어를 만드십시오(useAuthStore, useCartStore, useNotificationStore). 스토어는 서로를 가져와 사용할 수 있습니다. Pinia의 평면 구조(중첩 모듈 없음) 덕분에 이 작업이 간단합니다.

빠른 확인

Pinia 스토어를 구조 분해 할당할 때 storeToRefs()를 사용해야 하는 이유는 무엇입니까?

복습: Pinia

defineStore는 스토어를 생성합니다. Composition API 또는 Options API 방식으로 작성할 수 있습니다. useXxxStore() 훅으로 접근합니다. 반응형 구조 분해 할당에는 storeToRefs()를 사용합니다. 일괄 업데이트에는 $patch()를 사용합니다. 상태 영속화 및 기타 확장에는 플러그인을 사용합니다. DevTools와 통합됩니다. 도메인마다 하나의 스토어를 사용하며 Vuex 방식의 중첩 모듈은 없습니다.

무료로 시작

AI 튜터와 함께 HTML을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
41
레슨
163

자주 묻는 질문

“Vue를 위한 Pinia: defineStore와 storeToRefs” 강의는 무료인가요?

네 — “Vue를 위한 Pinia: defineStore와 storeToRefs” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Frontend Academy 강의 전체를 잠금 해제할 수 있습니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Vue를 위한 Pinia: defineStore와 storeToRefs”에서 뭘 배우나요?

defineStore로 Pinia 저장소를 정의하고 컴포넌트에서 사용하며, 상태를 구조 분해할 때도 반응성을 유지하도록 storeToRefs를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Frontend Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Frontend Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“Vue를 위한 Pinia: defineStore와 storeToRefs” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Frontend Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Frontend Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Redux Toolkit: createSlice와 configureStore
  2. 가벼운 React 상태 관리를 위한 Zustand
  3. Vue를 위한 Pinia: defineStore와 storeToRefs
  4. 전역 상태와 로컬 상태를 선택하는 기준
← Frontend Academy(으)로 돌아가기