์ž‘์„ฑ: 2026-03-04 05:39:06์ˆ˜์ •: 2026-03-04 05:39:06

Nuxt ๋Œ€์‹œ๋ณด๋“œ ํ”„๋กœ์ ํŠธ ์‹œ๋ฆฌ์ฆˆ (3): Pinia๋ฅผ ์ด์šฉํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์„ค๊ณ„

๋Œ€์‹œ๋ณด๋“œ์—์„œ๋Š” ์‚ฌ์ด๋“œ๋ฐ”์˜ ์ ‘ํž˜ ์ƒํƒœ๋‚˜ ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณต์œ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Pinia๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊น”๋”ํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. ์ „์—ญ UI ์ƒํƒœ ๊ด€๋ฆฌ (App Store)

์‚ฌ์ด๋“œ๋ฐ”์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

// stores/app.ts
import { defineStore } from 'pinia'
 
export const useAppStore = defineStore('app', () => {
  // ์ƒํƒœ (State)
  const isSidebarCollapsed = ref(false)
  const theme = ref<'light' | 'dark'>('light')
 
  // ์•ก์…˜ (Actions)
  function toggleSidebar() {
    isSidebarCollapsed.value = !isSidebarCollapsed.value
  }
 
  function toggleTheme() {
    theme.value = theme.value === 'light' ? 'dark' : 'light'
  }
 
  return { isSidebarCollapsed, theme, toggleSidebar, toggleTheme }
})

2. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ด€๋ฆฌ (Auth Store)

์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์Šคํ† ์–ด์ž…๋‹ˆ๋‹ค.

// stores/auth.ts
export const useAuthStore = defineStore('auth', () => {
  const user = ref({
    name: '๊ด€๋ฆฌ์ž',
    role: 'ADMIN',
    avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Admin'
  })
 
  const isLoggedIn = computed(() => !!user.value)
 
  return { user, isLoggedIn }
})

3. ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

Setup ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง๊ด€์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

<script setup>
import { useAppStore } from '@/stores/app'
 
const appStore = useAppStore()
</script>
 
<template>
  <button @click="appStore.toggleSidebar">
    {{ appStore.isSidebarCollapsed ? '์—ด๊ธฐ' : '๋‹ซ๊ธฐ' }}
  </button>
</template>

4. Pinia ์„ค๊ณ„ ํŒ

  1. ๋ชจ๋“ˆํ™”: ํ•˜๋‚˜์˜ ํฐ ์Šคํ† ์–ด๋ณด๋‹ค๋Š” app, auth, project ๋“ฑ ๊ด€์‹ฌ์‚ฌ๋ณ„๋กœ ์Šคํ† ์–ด๋ฅผ ๋‚˜๋ˆ„์„ธ์š”.
  2. SSR ๊ณ ๋ ค: Nuxt์—์„œ Pinia๋ฅผ ์“ธ ๋•Œ๋Š” ์„œ๋ฒ„์—์„œ๋„ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๋„๋ก @pinia/nuxt ์„ค์ •์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. Persistence: ์ƒํƒœ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ›„์—๋„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด pinia-plugin-persistedstate ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์„ธ์š”.

5. ๊ฒฐ๋ก 

์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ์ƒํƒœ๋“ค์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ค„ ๋Œ€์‹œ๋ณด๋“œ ๋ ˆ์ด์•„์›ƒ์„ ์‹ค์ œ๋กœ ์ฝ”๋”ฉํ•ด ๋ณผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.