Projects/zenui

[Headless UI 라이브러리 개발] Headless UI 라이브러리와 storybook 사용법

ijooha 2025. 3. 14. 16:31

       Headless UI 라이브러리란? 

Headless는 오직 기능만을 제공해주는 ui 라이브러리이다.

일반 ui 라이브러리와는 다르게 Headless는 사용자가 원하는대로 커스터마이징 하여 사용할 수 있어 효율적이다.

따라서 진행하고 있는 프로젝트의 디자인을 적용시켜 디자인의 통일성을 지킬 수 있다!

 

 

어떤 경우에 Headless UI를 사용할까?

기본으로 제공되는 디자인이 없기 때문에, 디자인 시스템이 없는 경우 오히려 불편할 수 있고,

커스터마이징을 하기 위한 시간을 더 많이 투자해야하는 단점이 있다.

따라서 Headless ui는 ui의 스타일보단 로직이나 기능에 집중해야 하거나,

프로젝터에서 특정한 디자인 요구사항이 있을 때 사용하는 게 적합하다.

 


 

       storybook 이란? 

UI 컴포넌트를 독립적으로 개발하고 문서화할 수 있는 도구다.

아래와 같이 개별 UI 컴포넌트를 따로 렌더링하여, 다양한 상태(props, events)를 직접 조작하여 테스트할 수 있다.

 

storybook의 특징

1 독립적인 컴포넌트 개발 환경

각 ui 컴포넌트를 독립적으로 테스트하고 개발할 수 있게 하기 때문에, 컴포넌트 자체의 로직과 스타일링에 집중할 수 있다. 

 

2 자동 문서화

컴포넌트의 사용법을 자동으로 문서화해주기 때문에 사용자는 각 컴포넌트를 어떻게 사용하는지 확인할 수 있고, 인터페이스로 여러 예시를 확인할 수 있다. 이를 통해 다른 팀원이 컴포넌트를 보다 빠르게 이해할 수 있도록 돕는다.

 

3 반응형 뷰포트 지원

반응형 뷰포트나 모바일 뷰를 지원하여, 다양한 크기에서 컴포넌트가 어떻게 보일지 미리 확인할 수 있다.

 

4 다양한 프레임워크 지원

React, Vue, Angular, Svelte 등 여러 프레임워크와 호환 가능하다.

 

 

storybook의 구성

기본적으로 컴포넌트 파일(jsx, tsx)이 있고, 그 외 스토리 파일이 추가된다.

스토리 파일에서는 컴포넌트의 다양한 상태(variant)를 정의해줄 수 있는데, 기본적인 형태는 다음과 같다.

//.stories.jsx / .stories.tsx

import { Meta, StoryObj } from "@storybook/react";
import { Button } from "./Button"; // 컴포넌트 import

// Storybook에서 보여줄 메타데이터 설정
const meta: Meta<typeof Button> = {
  title: "Components/Button", // Storybook에서 보일 그룹명
  component: Button, // 어떤 컴포넌트인지 지정
};
export default meta;

// 각 버튼 변형(variant) 정의
export const Primary: StoryObj<typeof Button> = {
  args: {
    label: "Click Me",
    variant: "primary",
  },
};

export const Secondary: StoryObj<typeof Button> = {
  args: {
    label: "Click Me",
    variant: "secondary",
  },
};

이처럼 스토리 파일을 작성하여 컴포넌트의 다양한 상태를 미리 보고 테스트해볼 수 있고, 자동으로 문서화 시킬 수 있다.