์์ฑ: 2026-03-04 05:39:06์์ : 2026-03-04 05:39:06
Nuxt ๋์๋ณด๋ ํ๋ก์ ํธ ์๋ฆฌ์ฆ (5): ๋ฐ์ดํฐ ์๊ฐํ ๋ฐ ํ์ด์ง ๊ตฌํ
์๋ฆฌ์ฆ์ ๋ง์ง๋ง ๋จ๊ณ์์๋ Naive UI์ DataTable๊ณผ ์์ฝ ์นด๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋์๋ณด๋ ๋ฉ์ธ ํ์ด์ง๋ฅผ ์์ฑํฉ๋๋ค.
1. ๋์๋ณด๋ ํ ํ์ด์ง (pages/index.vue)
์๋จ์๋ ์งํ ์์ฝ ์นด๋๋ฅผ, ํ๋จ์๋ ์์ธ ๋ฐ์ดํฐ ํ๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
<template>
<div class="flex flex-col gap-6">
<!-- 1. ์งํ ์์ฝ (Grid) -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<div v-for="item in summary" :key="item.title" class="card-base">
<div class="text-gray-500 text-sm">{{ item.title }}</div>
<div class="text-2xl font-bold mt-1">{{ item.value }}</div>
<div :class="item.diff > 0 ? 'text-green-500' : 'text-red-500'" class="text-xs mt-2">
{{ item.diff > 0 ? 'โฒ' : 'โผ' }} {{ Math.abs(item.diff) }}%
</div>
</div>
</div>
<!-- 2. ๋ฐ์ดํฐ ํ -->
<div class="card-base">
<h3 class="text-lg font-bold mb-4">์ต๊ทผ ํ๋ ๋ด์ญ</h3>
<n-data-table
:columns="columns"
:data="data"
:pagination="pagination"
:bordered="false"
/>
</div>
</div>
</template>
<script setup>
const summary = [
{ title: '์ด ๋ฐฉ๋ฌธ์', value: '128,430', diff: 12.5 },
{ title: '๋งค์ถ์ก', value: 'โฉ4,250,000', diff: -3.2 },
{ title: '์ ๊ท ๊ฐ์
', value: '1,204', diff: 24.8 },
{ title: '์ดํ๋ฅ ', value: '2.4%', diff: -1.5 },
]
const columns = [
{ title: 'ID', key: 'id' },
{ title: '์ฌ์ฉ์', key: 'name' },
{ title: 'ํ๋', key: 'action' },
{ title: '์๊ฐ', key: 'date' },
]
const data = [
{ id: 1, name: 'ํ๊ธธ๋', action: '๋ก๊ทธ์ธ', date: '2026-03-04 10:20' },
{ id: 2, name: '๊น์ฒ ์', action: '๊ฒฐ์ ์๋ฃ', date: '2026-03-04 10:25' },
// ... ๋ ๋ง์ ๋ฐ์ดํฐ
]
const pagination = { pageSize: 10 }
</script>2. Naive UI DataTable์ ๊ฐ์
- ์ฑ๋ฅ: ์๋ง ๊ฐ์ ํ๋ ๊ฐ์ ์คํฌ๋กค(Virtual Scroll)์ ํตํด ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
- ํ์ ์์ ์ฑ: ์ปฌ๋ผ ์ ์ ์ TypeScript๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ์ฌ ์ ์ง๋ณด์๊ฐ ์ฝ์ต๋๋ค.
- ํ์ฅ์ฑ: ๋ ๋๋ง ํจ์(
render)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์์ ๋ฒํผ์ด๋ ํ๊ทธ๋ฅผ ์ฝ๊ฒ ๋ฃ์ ์ ์์ต๋๋ค.
3. ๋์๋ณด๋ ๊ณ ๋ํ๋ฅผ ์ํ ์ ์
- ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋:
echarts๋chart.js๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํด ๋ณด์ธ์. - ๋คํฌ ๋ชจ๋: Naive UI์
darkTheme์ UnoCSS์dark:์ ๋์ฌ๋ฅผ ์ฐ๋ํ๋ฉด ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค. - ๊ถํ ์ ์ด: Pinia์
authStore์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ฉ๋ด ๋ ธ์ถ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์์ฑํด ๋ณด์ธ์.
4. ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ
์ง๊ธ๊น์ง Nuxt, Pinia, Naive UI, UnoCSS๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ์ธ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ๋ ์ ๊ณผ์ ์ ์ดํด๋ณด์์ต๋๋ค. ์ด ์กฐํฉ์ ๊ฐ๋ ์ฑ ๋์ ์ฝ๋์ ์๋์ ์ธ ์ฑ๋ฅ์ ๋์์ ์ ๊ณตํฉ๋๋ค.
์ด์ ์ฌ๋ฌ๋ถ๋ง์ ๋ฉ์ง ๊ด๋ฆฌ์ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์! ๐