Vue.js + AI 마법 45강: [시즌3] 중앙 제어실의 다중 관제탑! (Pinia Multi-Store 모듈화 패턴)

안녕하세요! 가족과 함께하는 스마트 라이프입니다. 어제 우리는 데이터가 사라지지 않도록 실시간으로 장부에 기록하는 마법의 자동 영수증($subscribe)을 발전소에 성공적으로 장착했습니다. 그런데 우리 마법 성이 우주만큼 넓어지고 손님들이 많아지면, 단 하나의 발전소 금고 안에 유저 이름, 수학 점수, 영어 점수, 환경 설정 데이터를 한꺼번에 섞어 보관하기가 아주 복잡해집니다. 보물이 엉키면 대마법사라도 실수를 하기 마련이죠! 오늘은 성의 목적에 맞게 여러 개의 관제탑을 세워 지혜롭게 분할 관리하는 다중 관제탑, Multi-Store(멀티 스토어 모듈화) 마법을 소개합니다!

[IMAGE_1]

1. Monolithic 스토어의 한계: 하나의 금고에 다 넣기

처음에는 하나의 스토어(예: magicStore)만 있어도 충분했어요. 하지만 성의 영토가 확장되면서 관리할 데이터 장부가 수백 줄로 늘어나면 어떻게 될까요?

  • 데이터의 대충돌: 유저 정보를 고치려다가 실수로 수학 점수 기계를 건드려 버리는 아찔한 사고가 날 수 있어요.
  • AI 비서의 혼란: 장부가 하나로 너무 길어지면, 똑똑한 AI 비서도 필요한 데이터를 찾기 위해 위아래로 한참 헤매며 에너지를 낭비하게 됩니다.

2. Multi-Store: 도메인별로 독립된 전문 관제탑 세우기

이 복잡함을 지혜롭게 해결하는 방법이 바로 발전소를 성격에 맞게 쪼개는 모듈화(Modularity) 패턴입니다. Pinia는 여러 개의 발전소를 독립적으로 지을 수 있도록 완벽하게 지원해요.

  • 유저 정보 관제탑 (useUserStore): 오직 로그인한 손님의 이름, 아바타, 마법 등급 장부만 전담해서 보관하고 관리해요.
  • 퀴즈 점수 관제탑 (useQuizStore): 과목별 점수, 맞힌 문제 개수, 틀린 문제 리스트만 캡슐화해서 다스립니다.
  • 단독 책임 원칙: 관제탑들이 서로의 금고를 함부로 뒤섞지 않기 때문에, 하나의 관제탑을 수리하거나 개조해도 다른 관제탑은 아무런 타격 없이 안전하게 전력을 계속 공급할 수 있습니다.

3. 실전 마법: 독립된 다중 관제탑 조립하기

Vue.js에서 목적별로 스토어를 분리하고 개별 방(Component)에서 필요한 관제탑만 쏙쏙 골라 켜는 정석 주문서 양식입니다.

// 1. 유저 관제탑 (src/stores/userStore.js)
import { defineStore } from 'pinia';
export const useUserStore = defineStore('user', {
  state: () => ({ wizardName: '꼬마 마법사', isLogin: true })
});

// 2. 퀴즈 관제탑 (src/stores/quizStore.js)
import { defineStore } from 'pinia';
export const useQuizStore = defineStore('quiz', {
  state: () => ({ currentScore: 0 }),
  actions: {
    addScore(val) { this.currentScore += val; }
  }
});

// 3. 진짜 방 안에서 필요한 관제탑만 불러와 소통하기 (Room.vue)
<script setup>
import { storeToRefs } from 'pinia';
import { useUserStore } from '../stores/userStore.js';
import { useQuizStore } from '../stores/quizStore.js';

// 필요한 발전소 전화번호만 골라서 무선 연결해요!
const userStore = useUserStore();
const quizStore = useQuizStore();

const { wizardName } = storeToRefs(userStore);
const { currentScore } = storeToRefs(quizStore);
</script>

<template>
  <div class="multistore-room">
    <p>🧙‍♂️ 환영합니다, {{ wizardName }}님!</p>
    <p>현재 과목 점수: {{ currentScore }}점</p>
    <button @click="quizStore.addScore(10)">문제 풀기 🎯</button>
  </div>
</template>

[IMAGE_2]

4. 스마트 라이프를 위한 가족 코딩 팁

아이들에게 ‘주방의 양념통 정리’나 ‘학교 가방의 필통, 식판 파우치 분리’에 비유해 보세요. 가방 하나에 연필, 지우개, 국물이 흐를 수 있는 식판을 다 한꺼번에 섞어 넣으면 가방 안이 난리가 나는 것처럼, 목적에 맞게 작은 가방(Store)으로 나누어 넣어야 안전하고 깔끔한 보관이 가능한 거라고요. 아이와 함께 성장시키는 ‘에듀패드’의 영토 확장에 대입해 보세요. userStorequizStore를 분리해 주면, 아이는 복잡한 현실 세계의 거대한 데이터를 범주화(Categorization)하여 깔끔하게 정돈하는 ‘소프트웨어 공학의 핵심 눈’을 뜨게 됩니다.

마치며: 거대 왕국을 유연하게 통치하는 총사령관

오늘 우리는 무한히 확장되는 프로젝트에서도 소스코드가 꼬이지 않게 방어하는 최종 단계의 전역 상태 분할 통제 아키텍처를 정복했습니다! 정말 놀라운 도약입니다. 내일 이 시간에는 **’관제탑끼리 비밀 유선 연결하기 (Pinia Cross-Store Communication)’**라는 주제로, 분리된 유저 관제탑과 퀴즈 관제탑이 서로 소식을 주고받으며 “유저가 레벨업했으니 퀴즈 난이도를 자동으로 높여라!”라고 연동하는 스토어 간 상호작용 고급 마법을 배워볼게요! 내일 아침 9시에 만나요!