๐Ÿ˜† My name is Ez : ์‰ฝ๋‹ค ์‰ฌ์›Œ ๊ฐœ๋ฐœlife

[StoryBook] : ์Šคํ† ๋ฆฌ๋ถ์ด ๋ญ์ง€? ๋ณธ๋ฌธ

โŒจ๏ธ Web Front-End/ETC

[StoryBook] : ์Šคํ† ๋ฆฌ๋ถ์ด ๋ญ์ง€?

์ด์ง€ํ‚˜ 2023. 7. 22. 19:44

Atomic Design Pattern์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ Storybook์„ ์ ์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. 

 

2023.07.20 - [โŒจ๏ธ Web Front-End/NextJs] - [Design Pattern] : Atomic Design (์•„ํ† ๋ฏน ๋””์ž์ธ)

 

์‚ฌ์‹ค ์ฒ˜์Œ ๋ฆฌ์•กํŠธ๋ฅผ ๋ฐฐ์› ์„ Storybook์— ๋Œ€ํ•ด์„œ ๋“ค์—ˆ์ง€๋งŒ ๊ทธ๋•Œ๋Š” ๋ฆฌ์•กํŠธ์กฐ์ฐจ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ƒํƒœ๋ผ์„œ ๊ทธ๋ƒฅ ๋“ฃ๊ณ  ๋„˜๊ฒผ๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ ๋– ์˜ฌ๋ž๋‹ค. 

 

์‹œ๋‹ˆ์–ด๋ถ„์—๊ฒŒ ์ ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋ง์”€์„ ๋“œ๋ ธ๋Š”๋ฐ... ์‚ฌ์‹ค ๋ญ˜ ํ•  ์ค„ ์•Œ์•„์•ผ ์ ์šฉํ•  ํ…๋ฐ.. ๊ทธ๋ž˜์„œ ๋ฉฐ์น  ์ „๋ถ€ํ„ฐ ์‹œ๊ฐ„ ๋  ๋•Œ๋งˆ๋‹ค ๊ณต์‹๋ฌธ์„œ์™€ ๋ธ”๋กœ๊ทธ๋“ค์„ ์ฐธ๊ณ ํ•ด์„œ ๊ธฐ๋ณธ ์„ธํŒ…๊ณผ ๋ฒ„ํŠผ ์ •๋„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ•ด๋ณด์•˜๋‹ค.


1. StoryBook์ด๋ž€?

StoryBook์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๊ณ , ํ…Œ์ŠคํŠธ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.  ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. (๋งค์šฐ ๋งŒ์กฑ)


2. ๋„์ž…ํ•˜๊ณ  ์‹ถ์€ ์ด์œ 

๋‚ด๊ฐ€ StoryBook์„ ๋„์ž…ํ•ด๋ณด๊ณ  ์‹ถ์€ ์ด์œ ๋Š” 

  •  Atomic Design Pattern์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ๋ฌธ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค๋Š” ์ด์ ! (๋‘ ๋ฒˆ ์ผํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค.)
  • ํ…Œ์ŠคํŠธ์—๋„ ์šฉ์ด 
  • ๋งˆ์ง€๋ง‰์€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ถ๊ธˆํ•ด์„œ 

3. ์ ์šฉํ•˜๊ธฐ

StoryBook ์„ค์น˜

(์ €๋Š” NextJs , TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

npm install --save-dev storybook@next

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์น˜ ํ›„ 

 

StoryBook ์ดˆ๊ธฐํ™” ์ž‘์—…

npx storybook@next init

 

์ดˆ๊ธฐํ™”๊นŒ์ง€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด 

 

StoryBook ์‹คํ–‰

npm run storybook

์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค (๊ธฐ๋ณธ ์ž‘์—…์„ ํ•œ ๊ฑฐ๋ผ์„œ ํ™”๋ฉด์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)

default - ButtonBasic

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด storeis๋ผ๋Š” ํด๋”๊ฐ€ ๋ณด์ธ๋‹ค. ์—ฌ๊ธฐ ๊ธฐ๋ณธ ์ฝ”๋“œ๋“ค์ด ๋“ค์–ด์žˆ๋‹ค. (์ฐธ๊ณ ์šฉ์œผ๋กœ ์ข‹์Œ)

 

stories - ํด๋” ์ƒ์„ฑ๋จ

 

์ฒ˜์Œ์—๋Š” ์ด ํด๋” ์•ˆ์—์„œ BasicButton.tsx , BasicButton.stories.tsx , ButtonBasic.scss ํŒŒ์ผ์„ ๋‹ค ๋„ฃ์–ด์„œ ํ–ˆ๋Š”๋ฐ, ๊ฒฝ๋กœ ์„ธํŒ…์ด ์ž˜ ๋˜์–ด์žˆ๋Š”์ง€ component ํด๋”์— stories.tsx ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด๋„ ์ž˜ ๋˜์—ˆ๋‹ค.

 

๐Ÿ“ BasicButton.stories.tsx  (์•„๋ž˜ ์ฝ”๋“œ ์ฐธ๊ณ )

import BasicButton from './BasicButton';
import type { Meta, StoryObj } from '@storybook/react';
import styles from '@styles/components/form/basicButton.module.scss';

const meta: Meta<typeof BasicButton> = {
  component: BasicButton, //์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑํ•˜๊ธฐ!
  title: 'ATOM/ButtonBasic', // ATOM(ํฐ ์นดํ…Œ๊ณ ๋ฆฌ) / ํ•˜์œ„ ํŠธ๋ฆฌ๊ตฌ์กฐ
  //์ž๋™์œผ๋กœ ๋ฌธ์„œ ์ž‘์„ฑ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€ ํ•„์š”!
  tags: ['autodocs'],
};

export default meta;
type Story = StoryObj<typeof BasicButton>;

// ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๊ธฐ๋ณธ์ž‘์—… ์•„๋ž˜๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ ํ˜•ํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„


export const Primary: Story = {
  name: 'default', //์ด๋ฆ„ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ ์—†์œผ๋ฉด Primary๋กœ ๋‚˜์˜ด
  //args => ๋„˜๊ฒจ์ค„ prop ๊ด€๋ จ๋œ ๊ฐ์ฒด ํ˜•ํƒœ
  args: {
    className: [styles.btn],
    title: '๋ฒ„ํŠผ',
    click: () => '',
    disabled: false,
    kind: '',
  },
};


export const StorageButton: Story = {
  name: 'storage', //์ด๋ฆ„ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ,
  args: {
    className: [styles.btn, 'blue'],
    title: '์ ์šฉ',
    click: () => '',
    disabled: false,
    kind: 'storage',
  },
};

export const PrintButton: Story = {
  name: 'print', //์ด๋ฆ„ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ,
  args: {
    className: [styles.btn, 'teal'],
    title: '์ถœ๋ ฅ',
    click: () => '',
    disabled: false,
    kind: 'print',
  },
};

 

์œ„ ์ฝ”๋“œ๋Š” ํŠœํ† ๋ฆฌ์–ผ์„ ๋ณด๊ณ  ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์™€ ๊ด€๋ จ๋œ ๋ถ€๋ถ„๋งŒ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค. ์ฒ˜์Œ์—” ์ด ๋ถ€๋ถ„๋„ ๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ ค์„œ ๊ณ ์ƒ์„ ํ–ˆ๋‹ค...

๋Œ์•„๋ณด๋‹ˆ ๋‹จ์ˆœํ•˜๋‹ค.๐Ÿคฆ๐Ÿป‍โ™‚๏ธ 

๊ธฐ๋ณธ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ณ€๊ฒฝ๋˜๋Š” ๋‚ด์šฉ๋งŒ ๋„ฃ์œผ๋ฉด ์™„์„ฑ (์‹คํ–‰ ์‹œ ๋‚˜์˜ค๋Š” ํ™”๋ฉด ์ฐธ๊ณ )

๋ฌธ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€ ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋‹ˆ ์งœ์ž”~

 

DOC - ButtonBasic

 

์ด๋ ‡๊ฒŒ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์ด ๋‚˜์˜จ๋‹ค. (Postman๊ฐ™์Œ)


4. ๊ฒฐ๋ก 

์‚ฌ์‹ค ์•„์ง ATOM ๋‹จ๊ณ„, ๋ฒ„ํŠผ ํ•˜๋‚˜๋งŒ ํ•ด๋ณธ ์ƒํƒœ๋ผ ์ดํ›„ ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•ด ๋ณผ ์˜ˆ์ •์ด๋‹ค. ์ตœ์†Œํ•œ ํŽ˜์ด์ง€ ๋‹จ์œ„๋Š” ์•„๋‹ˆ๋ผ๋„ ๋ถ„์ž ํ˜•ํƒœ, ์œ ๊ธฐ์ฒด ๋‹จ๊ณ„๊นŒ์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ?

์ฒ˜์Œ์ด๋ผ ๋ฐฐ์šฐ๋Š” ์‹œ๊ฐ„๋„ ๊ฑธ๋ฆฌ๊ณ  ์ ์‘ํ•˜๋ ค๋ฉด ํž˜๋“ค ๊ฒƒ ๊ฐ™๊ธด ํ•˜์ง€๋งŒ...  ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ดํ›„์— ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™๋‹ค. 

(๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์ข€ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ๋˜ ๋‹ค์Œ๋ฒˆ์— ์ด์–ด์„œ ํฌ์ŠคํŒ…ํ•ด ๋ด์•ผ๊ฒ ๋‹ค.)

 


์ฐธ๊ณ ๋งํฌ

https://storybook.js.org/tutorials/intro-to-storybook/react/ko/get-started/