2025. 6. 8. 22:12ใFront-end/Tools

๋ชฉ์ฐจ
1. Storybook์ด๋?
1.1 ์คํ ๋ฆฌ๋ถ ํน์ง
1.2 ์คํ ๋ฆฌ๋ถ ๊ตฌ์ฑ
2. Storybook ์์ํ๊ธฐ
3. Storybook ์ฌ์ฉํ๊ธฐ
1. Storybook์ด๋?
์คํ ๋ฆฌ๋ถ(Storybook)์ UI ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ํ ์คํธํ๋๋ก ๋๋ ๋๊ตฌ์ด๋ค.
๋น์ฆ๋์ค ๋ก์ง ๋ฐ ์ปจํ ์คํธ๋ก๋ถํฐ ๋ถ๋ฆฌ๋ UI ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋ค.
Storybook: Frontend workshop for UI development
Storybook is a frontend workshop for building UI components and pages in isolation. Thousands of teams use it for UI development, testing, and documentation. It's open source and free.
storybook.js.org
1.1 ์คํ ๋ฆฌ๋ถ ํน์ง
- ์ปดํฌ๋ํธ ๋ ๋ฆฝ ์คํ : ์ฑ๊ณผ ๋ถ๋ฆฌ๋ ํ๊ฒฝ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ํ ์คํธํ ์ ์๋ค.
- ์ํธ์์ฉ ๋ฌธ์ํ : ์ปดํฌ๋ํธ์ ์ํ, props, UI ๋์ ๋ฑ์ ์๊ฐ์ ์ผ๋ก ๋ฌธ์ํํ ์ ์๋ค
- ๋์์ธ ์์คํ ์ง์ : ์คํ์ผ ๊ฐ์ด๋ ๊ตฌ์ถ ๋ฐ ๋์์ด๋์์ ํ์ ์ ์ข๋ค.
- ๋ค์ํ ํ๋ ์์ํฌ ์ง์ : React, Vue, Angular, Svelte, Web Components ๋ฑ์ ๋ค์ํ ํ๊ฒฝ์ ์ง์ํ๋ค.
- ์ ๋์จ ํ์ฅ์ฑ : ์ ๊ทผ์ฑ ๊ฒ์ฌ, viewport ํ์ธ, ํ ์คํธ ํตํฉ ๋ฑ ์ฌ๋ฌ ์ ๋์จ์ ์ ๊ณตํ๋ค.
1.2 ์คํ ๋ฆฌ๋ถ ๊ตฌ์ฑ
์คํ ๋ฆฌ๋ถ์ ์ค์นํ๋ฉด stories ํด๋๊ฐ ์๊ธฐ๊ณ , ์ํ ์ฝ๋ ํ์ผ๋ค์ด ์์ฑ๋๋ค.
Button.tsx, button.css, Buttons.stories.tsx ์ด๋ฐ ์์ผ๋ก ์ธ ๊ฐ๊ฐ ํ ์ธํธ์ด๋ค.
tsx์ css๋ ์ฐ๋ฆฌ๊ฐ ์ ์๊ณ ์๋ ์ปดํฌ๋ํธ์ ์คํ์ผ ํ์ผ์ด๋ค.
์คํ ๋ฆฌ๋ถ์ ~~stories.tsx ํํ์ ํ์ผ๋ก ํด๋น ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ํ์ํ๋ค.
์ด ํ์ผ๋ค์ ์คํ ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
2. Storybook ์์ํ๊ธฐ
1. ์คํ ๋ฆฌ๋ถ ์ค์น
์ฐ์ ์คํ ๋ฆฌ๋ถ์ ์ค์นํ์. sb ๋ง๊ณ storybook์ผ๋ก ์จ๋ ๋๋ค.
์ค์นํ๋๋ฐ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ฆฌ๋๊น ์ข ๋ด์ฒญ ํผ์๋ ๋๋ค.
๋์ ์ค๊ฐ์ค๊ฐ ์ ํํ๋ผ๋ ๊ฒ ์์ด์ ๊ทธ๋ฐ ๊ฑฐ ํ์ธํด์ค์ผ ํ๋ค.
npx sb@latest init
์คํ ๋ฆฌ๋ถ ์ค์น๊ฐ ์๋ฃ๋๋ฉด ์๋ ๋ช ๋ น์ด๋ก ์ด๋ฆฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ ๋ฆฌ๋ถ ์คํ์ ํ์ธํ ์ ์๋ค.
์ค์นํ ๋ sb๋ก๋ ๋๊ธธ๋ npm run sb ์ ๋ ฅํด๋ดค๋๋ฐ ๊ทธ๊ฑด ์๋๋จ๋ค. ํฅ
npm run storybook


์ค์น ํ ์๊ธด ์์ ํ์ผ๋ค์ stories ํด๋์์ ํ์ธํ ์ ์๋ค. button, header, page์ ์คํ ๋ฆฌ๊ฐ ์์ฑ๋์ด ์๋ค.
.storybook ํด๋์์๋ main.ts์ preview.ts๋ฅผ ํ์ธํ ์ ์๋ค.
main.ts
// main.ts
import type { StorybookConfig } from "@storybook/nextjs-vite";
const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
addons: [
"@storybook/addon-onboarding",
"@chromatic-com/storybook",
"@storybook/addon-docs",
"@storybook/addon-a11y",
"@storybook/addon-vitest",
"@storybook/addon-styling-webpack",
],
framework: {
name: "@storybook/nextjs-vite",
options: {},
},
webpackFinal: async (config) => {
// ํ์ ์ Webpack ์ถ๊ฐ ์ค์ ๊ฐ๋ฅ
return config;
},
// ๊ธ๋ก๋ฒ ํ๋ผ๋ฏธํฐ
docs: {
// @ts-ignore
autodocs: true,
},
staticDirs: ["..\\public"],
};
export default config;
1. StorybookConfig๋ ์ ๋ถ๋ฌ์์ผํ ๊น
StorybookConfig๋ ์คํ ๋ฆฌ๋ถ ์ค์ ์ ๋ชจ์๋์ ํ์ผ๋ก, ์ด๋ค ํ๋ ์์ํฌ, ์ ๋์จ, ๋น๋ ์ค์ ์ ํ ์ง ์ง์ ํ ์ ์๋ค.
2. addons๋ ๋ญ๊น
addons๋ ์คํ ๋ฆฌ๋ถ ๊ธฐ๋ฅ ํ์ฅ ํ๋ฌ๊ทธ์ธ ๋ชจ์์ด๋ค.
ํค์๋๋ฅผ ๋ณด๊ณ ์ค์น๋ ์ ๋์จ ํจํค์ง๋ฅผ ํ์ธํ ์ ์๋ค.
- @storybook/addon-links : ์คํ ๋ฆฌ ๊ฐ ๋งํฌ ์ฐ๊ฒฐ
- @storybook/addon-essetials : ์คํ ๋ฆฌ๋ถ์ ๊ธฐ๋ณธ ์ ์ฉ ๊ธฐ๋ฅ ์ธํธ(controls, actions, docs ๋ฑ)
- @storybook/addon-interactions : ์ํธ์์ฉ ํ ์คํธ ์ง์
3. framework
์คํ ๊ธฐ๋ถ์ด ์ด๋ค UI ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ง ์ง์ ํ๋ค.
๋์ ๊ฒฝ์ฐ, React ํ๋ก์ ํธ์์ Webpack5๋ฅผ ์ฌ์ฉํด ์คํ ๋ฆฌ๋ถ์ ๊ตฌ๋ํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค. (storybook์ webpack ๊ธฐ๋ฐ์)
4. webpackFinal์ด๋?
Webpack ๋น๋ ์ค์ ์ ์ปค์คํฐ๋ง์ด์ง ํ๋ ํจ์๋ก, Webpack ์ค์ ์ ์ถ๊ฐ ์์ ์ด ํ์ํ๋ฉด ์ด ํจ์๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
์๋ฅผ ๋ค์ด TailwindCSS ๊ด๋ จ ๋ก๋ ์ค์ ์ถ๊ฐ, ํน์ ๋ชจ๋ ์ฒ๋ฆฌ ๋ฐฉ์ ๋ณ๊ฒฝ ๋ฑ์ ์ฐ์ธ๋ค.
5. docs๋?
์คํ ๋ฆฌ๋ถ ๋ฌธ์ํ ๊ด๋ จ ์ค์ ์ผ๋ก, autodocs๋ ์คํ ๋ฆฌ๋ถ ๋ฒ์ 9์ด์์์ ์๋ก ๋์ ๋ ์๋ ๋ฌธ์ํ ๊ธฐ๋ฅ ์ต์ ์ด๋ค.
ํ์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋๋ ๊ฒฝ์ฐ //@ts-ignore๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ ๋ค์ ์ฝ๋ ๋ผ์ธ์ ํ์ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋๋ก ํ ์ ์๋ค.
ํ์ ์ค๋ฅ ์์ฒด๋ฅผ ์์ ๋ ค๋ฉด ์ ํํ ํ์ ์ ์๊ฐ ํ์ํ๋ค.
6. ๊ธ๋ก๋ฒ ํ๋ผ๋ฏธํฐ ์ง์ ์ด๋
์คํ ๋ฆฌ๋ถ ์ ์ญ ์ค์ ๊ฐ์ผ๋ก, ๋ชจ๋ ์คํ ๋ฆฌ์ ๊ณตํต ์ ์ฉ๋๋ ํ๋ผ๋ฏธํฐ(๋ทฐํฌํธ ํฌ๊ธฐ, ๋ฐฐ๊ฒฝ์, ํ๋ ๋ก๊น ๋ฑ)์ ์ง์ ํ๋ค.
7. ์ ์ค์ ๋ค์ด TailwindCSS ์ ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ด์
TailwindCSS๋ PostCSS๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ฏ๋ก, ์คํ ๋ฆฌ๋ถ ๋น๋ ์ PostCSS์ TailwindCSS๋ฅผ ํจ๊ป ์ฒ๋ฆฌํด์ผํ๋ค.
์ด๋ฅผ ์ํด webpackFinal์์ PostCSS ๋ก๋ ์ค์ ์ ์ถ๊ฐํ๊ฑฐ๋, ์ค์ ํ์ผ์ globals.css๋ฅผ import ํด์ผํ๋ค.
preview.ts
import type { Preview } from "@storybook/nextjs-vite";
import "../src/app/globals.css";
const preview: Preview = {
parameters: {
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;
tailwindcss๋ฅผ storybook์ ์ ์ฉํ๊ธฐ ์ํด์ import "../src/app/globals.css"๋ฅผ ์ถ๊ฐํด์ค๋ค.
3. Storybook ์ฌ์ฉํ๊ธฐ
npm run storybook ๋ช ๋ น์ด๋ก storybook ์คํํ๋ฉด ์ํ ์ฝ๋๋ค์ด ๊ทธ๋ฆฌ๋ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
์ข์ธก ๋ฉ๋ด / ์ปจํธ๋กค ํจ๋


์ข์ธก ๋ฉ๋ด์์ ์ํ๋ก ์์ฑ๋ ์ปดํฌ๋ํธ๋ค์,
์ปจํธ๋กค ํจ๋์์ Button ์ปดํฌ๋ํธ์ Props๋ฅผ ํ์ธํ ์ ์๋ค.
Props์ ๊ฐ์ ํจ๋์์ ์ฝ๊ฒ ๋ณ๊ฒฝํด๋ณด๋ฉฐ props์ ๋ฐ๋ฅธ ๋ชจ์์ ํ์ธํ ์ ์๋ค.
์ฐธ๊ณ
'Front-end > Tools' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Netlify์ผ๋ก ํธ์คํ ์ ํด๋ณด์ (3) | 2025.07.24 |
|---|---|
| Webpack์ ๋ญ๊น (4) | 2025.07.09 |
| Tailwind๋ ๋ญ๊น (0) | 2025.05.29 |
| Github Actions ์ฌ์ฉํด๋ณด๊ธฐ (1) | 2025.05.26 |
| Github Actions๋ ๋ญ๊น (1) | 2025.05.26 |
GitHub