(ํ์ฌ ์ ๋ pnpm + React + TypeScript ํ๊ฒฝ์์ ๊ฐ๋ฐ ์ค์ ๋๋ค ๐ฉ๐ป๐ป)
๐ฅ Storybook ์ค์น
์ผ๋จ ํ๋ก์ ํธ ๋ฃจํธ์์ ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
pnpm dlx storybook@latest init
์ด๋ ๊ฒ ํ๋ฉด Storybook์ด ํ์ฌ ํ๋ก์ ํธ์ ํ๊ฒฝ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ,
.storybook ํด๋์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ ํ์ผ๋ค์ ์์ฑํด์ค๋ค.
์ ์ค์น๋์๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด, ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํด์ฃผ๋ฉด ๋๋ค.
pnpm run storybook
์ดํ ๋ธ๋ผ์ฐ์ ์์ http://localhost:6006 ์ ์ ์ํ๋ฉด Storybook UI๋ฅผ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.

๐ง Storybook ๊ธฐ๋ณธ ํ์ผ๋ค
๐ .storybook
์ด๊ฑฐ๋ ์คํ ๋ฆฌ๋ถ์ ํ๊ฒฝ์ค์ ๋๋ ํ ๋ฆฌ๋ก,
๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ ํ์ผ๋ค์ด ํฌํจ๋์ด ์๋ค.
1) main.ts
์ด๋ Storybook์ ํต์ฌ ์ค์ ํ์ผ๋ก,
์ด๋ค ์คํ ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ฌ์ง, ์ด๋ค ์ ๋์จ์ ์ฌ์ฉํ ์ง๋ฅผ ์ ์ํ๋ค.
Vite alias ๊ฐ์ ์ปค์คํฐ๋ง์ด์ง๋ ์ฌ๊ธฐ์์ ํ๋ฉด ๋๋ค !
๋ด ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ค์ ํด์ฃผ์๋ค.
import type { StorybookConfig } from '@storybook/react-vite';
const config: StorybookConfig = {
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
addons: [
'@chromatic-com/storybook',
'@storybook/addon-docs',
'@storybook/addon-onboarding',
'@storybook/addon-a11y',
'@storybook/addon-vitest',
],
framework: {
name: '@storybook/react-vite',
options: {},
},
};
export default config;
- stories
- ../src/**/*.mdx ๐๐ป src/ ์๋์ ์๋ ๋ชจ๋ .mdx ํ์ผ์ ์คํ ๋ฆฌ๋ก ์ธ์
- ../src/**/*.stories.@(js|jsx|mjs|ts|tsx) ๐๐ป src/ ์๋์ ์๋ *.stories.tsx ๊ฐ์ ํ์ผ์ ์คํ ๋ฆฌ๋ก ์ธ์
- ์ฆ, ์ฐ๋ฆฌ๊ฐ ์ปดํฌ๋ํธ ์์ Button.stories.tsx ๊ฐ์ ํ์ผ์ ๋๋ฉด ์คํ ๋ฆฌ๋ถ์ด ์๋์ผ๋ก ์ก์์ฃผ๊ฒ ๋๋ค.
- addons
- @chromatic-com/storybook ๐๐ป Storybook์ ๋ฐฐํฌ/์๊ฐ ํ ์คํธ ์๋น์ค์ธ Chromatic๊ณผ ์ฐ๊ฒฐํด์ฃผ๋ ์ ๋์จ
- @storybook/addon-docs ๐๐ป ๊ฐ ์คํ ๋ฆฌ์ ๋ํด Docs ํญ์ ๋ง๋ค์ด์ฃผ๋ ์ ๋์จ
- @storybook/addon-a11y ๐๐ป ์น ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ์ ๋ง๋์ง ์๋์ผ๋ก ์ฒดํฌํด์ฃผ๋ ์ ๋์จ
- @storybook/addon-vitest ๐๐ป Vitest ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์คํ ๋ฆฌ๋ถ๊ณผ ํตํฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ ๋์จ
- framework
- ์คํ ๋ฆฌ๋ถ์ด ์ด๋ค ๋น๋ ํด๊ณผ ํ๋ ์์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ ์ง๋ฅผ ๊ฒฐ์ ํด์ค๋ค.
2) preview.ts
์ด๊ฑฐ๋ ์คํ ๋ฆฌ๋ถ ์ ์ฒด์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ์ค์ ์ผ๋ก,
CSS import, ๋ ์ด์์ ์ต์ , Docs / Controls ์ค์ ๋ฑ์ ๋ด๋นํ๋ค.
๋ด ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ค์ ํด์ฃผ์๋ค.
import type { Preview } from '@storybook/react-vite';
import '../src/styles/index.css';
const preview: Preview = {
parameters: {
layout: 'centered',
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
a11y: {
// 'todo' - show a11y violations in the test UI only
// 'error' - fail CI on a11y violations
// 'off' - skip a11y checks entirely
test: 'todo',
},
},
};
export default preview;
- import '../src/styles/index.css'; ๐๐ป ์ ์ญ ์คํ์ผ์ Storybook์๋ ์ ์ฉํด์ค๋ค.
- parameters ๐๐ป ์คํ ๋ฆฌ๋ถ ์ ์ฒด ๋์์ ์ ์ดํ๋ ์ต์
๋ค์ ๋ชจ์์ด๋ค.
- layout
- centered : ์ปดํฌ๋ํธ๋ฅผ ์บ๋ฒ์ค ์ค์์ ํ์
- fullscreen : ์ ์ฒด ํ๋ฉด์ ์ฐจ์งํ๋๋ก ํ์
- padded : ์บ๋ฒ์ค ์์ชฝ์ ์ฌ๋ฐฑ์ ์ค์ ํ์
- controls ๐๐ป ์คํ ๋ฆฌ๋ถ UI์์ props๋ฅผ ์กฐ์ํ ์ ์๋ Controls ํจ๋์ ์๋ ์์ฑํ ๋ ์ฐ๋ ์ต์
์ด๋ค.
- color : props ์ด๋ฆ์ background๋ color๊ฐ ๋ค์ด๊ฐ๋ฉด ์์ ์ ํ๊ธฐ๊ฐ ์๋์ผ๋ก ๋ถ๋๋ค.
- date : props ์ด๋ฆ์ Date๊ฐ ๋ค์ด๊ฐ๋ฉด ๋ฌ๋ ฅ ์ปจํธ๋กค๋ฌ๊ฐ ์๋์ผ๋ก ๋ถ๋๋ค.
- a11y ๐๐ป ์ ๊ทผ์ฑ ์ ๋์จ์ ์ ์ญ ์ค์ ์ด๋ค.
- todo : ์ ๊ทผ์ฑ ์๋ฐ์ด ์์ผ๋ฉด ํ์ฌ UI์์๋ง ๋ณด์ฌ์ค
- error : ์๋ฐ์ด ์์ผ๋ฉด CI๋ ์คํจ ์ฒ๋ฆฌํจ
- off : ์ ๊ทผ์ฑ ๊ฒ์ฌ๋ฅผ ์์ ๋นํ์ฑํํจ
- layout
3) vitest.setup.ts
์คํ ๋ฆฌ๋ถ+ Vitest ํ๊ฒฝ์์ ํ ์คํธํ ๋ ํ์ํ ์ค์ ์ด๋ค.
import * as a11yAddonAnnotations from '@storybook/addon-a11y/preview';
import { setProjectAnnotations } from '@storybook/react-vite';
import * as projectAnnotations from './preview';
// This is an important step to apply the right configuration when testing your stories.
// More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations
setProjectAnnotations([a11yAddonAnnotations, projectAnnotations]);
๐จ ์คํ ๋ฆฌ๋ถ์ Material Symbols ์์ด์ฝ ์ถ๊ฐํ๊ธฐ
๋๋ ์ด๋ฒ ์๋น์ค UI์์ ๊ตฌ๊ธ ๋จธํฐ๋ฆฌ์ผ ์์ด์ฝ์ ์์ฃผ ์ธ ์์ ์ด๊ธฐ ๋๋ฌธ์
์คํ ๋ฆฌ๋ถ์์๋ ๋์ผํ๊ฒ ๋ณด์ผ ์ ์๋๋ก ์๋์ ๊ฐ์ด ์ค์ ํด์ฃผ์๋ค.
(.stories ํด๋ ์์ preview-head.html ํ์ผ์ ๋ง๋ค์ด์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.)
<link
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200"
rel="stylesheet"
/>'๐ป ํ๋ก์ ํธ > ๐ BaLaw' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| CSS ๋จ์ ์ ๋ฆฌ: px, py, pt, pr, pb, pl (0) | 2025.10.07 |
|---|---|
| ๋ฐฐ๋ด ํ์ผ(Barrel File) ์ ๋ฆฌ (1) | 2025.10.07 |