Storybook์€ ๋ญ˜๊นŒ

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

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. Storybook์ด๋ž€?

    1.1 ์Šคํ† ๋ฆฌ๋ถ ํŠน์ง•

    1.2 ์Šคํ† ๋ฆฌ๋ถ ๊ตฌ์„ฑ

2. Storybook ์‹œ์ž‘ํ•˜๊ธฐ

3. Storybook ์‚ฌ์šฉํ•˜๊ธฐ


1. Storybook์ด๋ž€?

์Šคํ† ๋ฆฌ๋ถ(Storybook)์€ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋„๋ก ๋•๋Š” ๋„๊ตฌ์ด๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ ์ปจํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ๋œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://storybook.js.org/

 

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