📚 이론정리/React & Next.js

스토리북(Storybook) 알아보기

서카츄 2025. 6. 4. 17:33

스토리북 (Storybook)

 

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

 

스토리북이 뭐예요?

스토리북(Storybook)은 컴포넌트를 독립적으로 개발하고 테스트할 수 있게 도와주는 툴

특히 디자인 시스템이나 UI 컴포넌트를 재사용할 일이 많을 때 아주 유용함

 

 

설치

npm create storybook@latest
npm install --save-dev @storybook/nextjs //next버전

 

 

 

 

터미널에 명령어를 입력하고 나면, 기본 스토리 예제를 자동 생성해줄까? 라고 물어보는데

처음이라면 스토리북이 기존 예제 스토리 파일들을 설치해주고, 폴더 구조도 깔끔하게 만들어주기 때문에 

처음 시도해 보는 내용이면 yes를 선택한다!

 

 

 

 

 

 

설치하면, 스토리북 폴더가 생긴다.

스토리북 폴더 안에 main.ts preview.ts 설정 파일도 자동 생성된 것을 확인할 수 있다.

 

 

 

 

src 폴더 안에도 이렇게 기본적인 세팅이 들어가 있는 것을 확인해 볼 수 있다.

 

 

 

stories 폴더 설명

Button.tsx, Header.tsx, Page.tsx 예시용 컴포넌트들
*.stories.ts 위 컴포넌트들에 대한 Storybook 스토리 파일들
*.css 예시 컴포넌트들의 스타일
Configure.mdx 문서형 스토리 (MDX 포맷), 문서 기반 설명 예시
assets/ 이미지나 기타 리소스들 (대개 문서에 쓰임)

 

 

 

 

 

실행은 `npm run storybook` 명령어를 실행한다.

포트 6006번에서 스토리북이 열린다고 나와있다.

 

 

 

 

 

`npm run storybook` 명령어를 실행하면, 로컬에서 6006으로 실행할 수 있다고 확인할 수 있다.

 

 

 

 

 

 

6006포트로 들어오면, 이렇게 화면 구성을 볼 수 있다.

왼쪽에 Button, Header, Page의 기본 컴포넌트들이 보이고 있고

중앙에는 설정 가이드 문서가 나와있다.

 

 

폴더 구조 구성

예시로 src/components 폴더 안에 MyButton.tsx 컴포넌트를 만들면, MyButton.stories.tsx 를 같이 만들어준다. 

 

src/
├── components/
│   ├── MyButton.tsx
│   └── MyButton.stories.tsx

 

 

 

왼쪽 사이드바에 스토리북 리스트들이 나와있다.

 

 

 

 

코드로 살펴보기

export default {
  title: "Components/Common/Badge",
  component: Badge,
  tags: ["autodocs"],
  parameters: {
    layout: "centered",
  },
  argTypes: {
    title: {
      control: { type: "select" },
      options: Object.keys(BADGE_VARIANTS) as BadgeKey[],
      description: "뱃지 타입을 선택하세요",
    },
  },
} satisfies Meta<typeof Badge>;

 

`title`: 스토리북 파일 경로 설정

`tags` : 스토리북 파일 내의 문서 만들기

`parameters` : `layout` : 스토리북에서 보이는 컴포넌트 정렬 (현재 centered 가운데 정렬)

 

`argTypes` : 문서의 타입 설정

`title` - control : type `select` → 기본 타입은 radio인데, 문서 타입을 select로 바꿔줌

`options` : 옵션 리스트 보여주기

`description` : 문서 description 설명

 

 

 

 

스토리북 예시 화면

 

 

 

 

 

스토리북 예시 코드

import type { StoryObj, Meta } from "@storybook/react-vite";
import Badge from "./Badge";
import { BADGE_VARIANTS } from "./Badge";
import type { BadgeKey } from "./Badge";

export default {
  title: "Components/Common/Badge",
  component: Badge,
  tags: ["autodocs"],
  parameters: {
    layout: "centered",
  },
  argTypes: {
    title: {
      control: { type: "select" },
      options: Object.keys(BADGE_VARIANTS) as BadgeKey[],
      description: "뱃지 타입을 선택하세요",
    },
  },
} satisfies Meta<typeof Badge>;

type Story = StoryObj<typeof Badge>;

export const Default: Story = {
  args: {
    title: "BEST",
  },
};

// 각 타입별 스토리
export const Best: Story = {
  args: {
    title: "BEST",
  },
};

export const Urgent: Story = {
  args: {
    title: "URGENT",
  },
};

// 모든 뱃지 타입 보기
export const AllTypes: Story = {
  args: {
    title: "BEST",
  },
  render: () => (
    <div className="flex gap-4 items-center">
      {(Object.keys(BADGE_VARIANTS) as BadgeKey[]).map((key) => (
        <Badge key={key} title={key} />
      ))}
    </div>
  ),
};

 

 

 

 

// 각 타입별 스토리
export const Best: Story = {
  args: {
    title: "BEST",
  },
};

 

`Best`는 스토리북에 보일 이름

`args` : 스토리북에 보일 테스트내용을 넣어준다 (테스트 하고 싶은 내용들을 넣어준다)

 

 

 

 

// 모든 뱃지 타입 보기
export const AllTypes: Story = {
  args: {
    title: "BEST",
  },
  render: () => (
    <div className="flex gap-4 items-center">
      {(Object.keys(BADGE_VARIANTS) as BadgeKey[]).map((key) => (
        <Badge key={key} title={key} />
      ))}
    </div>
  ),
};

 

모든 타입을 보여주려고 할때 `render` 함수를 넣어준다.

`args`는 타입오류가 있기 때문에 기본 필수로 넣어주어야한다.

 

 

 

 

vsCode 확장 포맷터

 

 

 

코드 작성 후, vsCode 에서 Create a Storybook Story를 클릭해주면 해당 컴포넌트에서 같은 경로에 스토리북 파일이 생긴다.

확인하고 저장하면, 파일이 생성된다