05. Storybook ์ค์ฌ Single Source of Truth ์ ๋ต
์ ๋ต ๊ฐ์
Storybook(์ฝ๋ ์ปดํฌ๋ํธ ์นดํ๋ก๊ทธ) ์ ๋์์ธ ์์คํ
์ SoT๋ก ๋๊ณ , Figma๋ ๊ทธ ์ฝ๋ ์ปดํฌ๋ํธ์ ์๊ฐ ๋ช
์ธ/์คํ ๋ฏธ๋ฌ๋ก ์ฌ์ฉํ๋ ์ ๋ต์
๋๋ค.
"์ฝ๋๊ฐ ์ง์ค์ด๋ค"๋ผ๋ ์์น์ ๊ฐ์ฅ ๊ฐํ๊ฒ ์ ์ฉํ ์ ๋ต.
[React Components Repo]
โ
โผ
[Storybook (๋ฐฐํฌ๋ ์นดํ๋ก๊ทธ)]
โ
โโโ Chromatic (์๊ฐ ํ๊ท ํ
์คํธ)
โโโ Figma "Story" ํ๋ฌ๊ทธ์ธ์ผ๋ก ์๋ฒ ๋
โโโ Code Connect ๋งคํ
โ
โผ
[Figma Library Components]
(์ฝ๋ ์ปดํฌ๋ํธ์ 1:1 ๋งคํ๋ ์คํ)
Plain Text
๋ณต์ฌ
ํต์ฌ ๋๊ตฌ
โข
Storybook 7+
โข
Chromatic: Storybook ํธ์คํ
+ ์๊ฐ ํ๊ท
โข
Figma Code Connect: Figma ์ปดํฌ๋ํธ
์ฝ๋ ์ปดํฌ๋ํธ ๋งคํ
โข
story.to.design ๋๋ html.to.design: Storybook โ Figma ์๋ ๋ณํ
โข
Figma Storybook Connect ํ๋ฌ๊ทธ์ธ
์ ์ฉ ์๋๋ฆฌ์ค
โข
๊ฐ๋ฐ์ ์ฃผ๋ ์กฐ์ง, ์ฝ๋ ์ฐ์ ๋ฌธํ
โข
์ปดํฌ๋ํธ ๋จ์ ์ฌ์ฌ์ฉ์ฑ์ด ๋งค์ฐ ์ค์ํ ์ ํ (B2B SaaS, ๋์๋ณด๋)
โข
์๊ฐ ํ๊ท ํ
์คํธ๊ฐ ์ค์ํ ํ๊ฒฝ
โข
๋์์ด๋๊ฐ ์ฝ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ขฐํ๊ณ ์ฌ์ฉํ ์์ง๊ฐ ์์
๋จ๊ณ๋ณ ์ํฌํ๋ก
1) Storybook ์ ์
npx storybook@latest init
Bash
๋ณต์ฌ
๋ชจ๋ ์ปดํฌ๋ํธ๋ง๋ค *.stories.tsx ์์ฑ:
export default { component: Button } satisfies Meta<typeof Button>
export const Primary: Story = { args: { variant: 'primary', children: 'Click' } }
export const Secondary: Story = { args: { variant: 'secondary', children: 'Click' } }
TypeScript
๋ณต์ฌ
2) Chromatic ๋ฐฐํฌ
โข
Chromatic ๊ฐ์
โ ํ ํฐ ๋ฐ๊ธ
โข
GitHub Actions๋ก PR๋ง๋ค ์๋ ๋ฐฐํฌ + ์๊ฐ ํ๊ท ๊ฒ์ฆ
3) Figma Code Connect ๋งคํ
button.figma.tsx:
import { Button } from './Button'
import figma from '@figma/code-connect'
figma.connect(Button, '<https://figma.com/>...?node-id=1-2', {
props: {
variant: figma.enum('Variant', { Primary: 'primary', Secondary: 'secondary' }),
label: figma.string('Label'),
},
example: ({ variant, label }) => <Button variant={variant}>{label}</Button>,
})
TypeScript
๋ณต์ฌ
npx figma connect publish
Bash
๋ณต์ฌ
4) Figma์ Storybook ์๋ฒ ๋
โข
๋์์ด๋๊ฐ Figma์์ Story URL์ ์๋ฒ ๋ ๋
ธ๋๋ก ์ถ๊ฐ
โข
ํญ์ ์ต์ ์ฝ๋ ์ปดํฌ๋ํธ ์๊ฐ ํ์ธ ๊ฐ๋ฅ
5) story.to.design์ผ๋ก Figma ์ปดํฌ๋ํธ ์๋ ์์ฑ (์ ํ)
โข
Storybook ์คํ ๋ฆฌ โ Figma ์ปดํฌ๋ํธ ์๋ ๋ณํ
โข
๋์์ด๋๊ฐ ๊ทธ๋ฆด ํ์ ์์ด Figma Library๊ฐ ํญ์ ์ต์
์ด์ ๊ท์น
โข
์ปดํฌ๋ํธ ์ถ๊ฐ/๋ณ๊ฒฝ์ ์ฝ๋์์๋ง โ Storybook PR
โข
๋์์ด๋๋ Figma์์ ์ปดํฌ๋ํธ๋ฅผ ์ธ์คํด์ค๋ก๋ง ์ฌ์ฉ (์ง์ ๊ทธ๋ฆฌ๊ธฐ ๊ธ์ง)
โข
Code Connect ๋งคํ์ด ์๋ ์ปดํฌ๋ํธ๋ ์ฌ์ฉ ๊ธ์ง
โข
Storybook์ด ๋นจ๊ฐ์์ด๋ฉด Figma๋ ์ ๊ธ (๋ฐฐํฌ ๊ฒ์ดํธ)
์ฅ์
โข
๋์์ธ-์ฝ๋ 1:1 ๋งคํ ๋ณด์ฅ (Code Connect)
โข
์๊ฐ ํ๊ท ํ
์คํธ๋ก ํ๊ท ์ฌ๊ณ ๋ฐฉ์ง
โข
๋์์ด๋๊ฐ ํญ์ "๋์ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ" ์ฌ์ฉ
โข
์ ๊ท ์
์ฌ์ ์จ๋ณด๋ฉ ์๋ฃ๋ก ์ต๊ฐ (Storybook ํ ๊ณณ์ ๋ค ์์)
ํ๊ณ
โข
์ด๊ธฐ ๊ตฌ์ถ ๋น์ฉ ๋งค์ฐ ํผ
โข
๋์์ด๋ ์์ ๋ โ (์ ํด์ง ์ปดํฌ๋ํธ๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
โข
๋์์ธ ํ์ ๋จ๊ณ(์ค์ผ์น, ์์ด์ดํ๋ ์)์ ์ ๋ง์
โข
Code Connect ๋งคํ ์ ์ง๋ณด์ ๋ถ๋ด
Figma Make / MCP์์ ๊ฒฐํฉ
โข
Make๋ PoC/ํ์ ๋จ๊ณ์์๋ง ์ฌ์ฉ โ Storybook ์ปดํฌ๋ํธ๋ก ์ด๊ด ํ ๋ณธ๊ฒฉ ์ฌ์ฉ
โข
MCP๊ฐ ์ฝ๋ ์์ฑ ์ Storybook ์ปดํฌ๋ํธ๋ง importํ๋๋ก ํ๋กฌํํธ ๊ฐ์
โข
AI๊ฐ ์ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ ์ ์ Storybook์ ์ ์ฌ ์ปดํฌ๋ํธ ๊ฒ์ํ๋๋ก ์ง์
