๐กStorybook์ ๋ํ ์ดํด์ ํ์ต๋ณด๋ค ๋น ๋ฅธ ์ ์ฉ์ ๋ชฉ์ ์ผ๋ก ์ ๋ฆฌํ ๊ธ์ ๋๋ค!
โ ๏ธ Storybook ํ์ต ์ค์ ์์ฑํ ๊ธ์ด๋ฏ๋ก ๋ด์ฉ์ ์ค๋ฅ๊ฐ ์์ ์ ์์ต๋๋ค!
์ปดํฌ๋ํธ์ props ๊ฐ์ ํธํ๊ฒ ์์ ํ๋ฉด์ ์ด๋ป๊ฒ ๋ ๋๋ง ๋๋์ง ์ฝ๊ฒ ํ ์คํธ ํ ์ ์๋ ์คํ ๋ฆฌ๋ถ์ ์จ๋ณด๋ฉด ์ ๋ง ํธํ๊ณ ์ข๋ค. ๊ทธ๋ ๊ธฐ์ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐ์ ํ ์ ์๊ณ ๋ ์ผ์ข ์ ํ๋ก์ ํธ ๋ฌธ์ํ ์์ ๋ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ๊ฒฝํ์ ์ฒ์ ์จ๋ณด๋ ค๊ณ ํ ๋ ์คํ ๋ฆฌ๋ถ์ด ์ ํํ ๋ญ์ง๋ ๋ชจ๋ฅด๊ฒ ๊ณ ์ด๋ป๊ฒ ์์ํด์ผ ํ ์ง ๊ฐ์ด ์ ์ ์ค๋๋ฐ ๋ฌด์๋ณด๋ค ์คํ ๋ฆฌ ํ ์คํธ ์ฝ๋๋ฅผ ๋ฐ๋ก ์์ฑ์ ํด์ผ ํ๋ค๋ ๋ถ๋ด๊ฐ์ ์ ๋ป ์์ํ๊ธฐ๊ฐ ์ด๋ ค์ด ๊ฑฐ ๊ฐ๋ค.
ํ์ง๋ง ๋ง์ ํ๋ฒ ์ ์ฉํด์ ์ด๊ฑฐ์ ๊ฑฐ ๊ฑด๋๋ ค๋ณด๋ฉฐ ์ด๋ ์ ๋ ์ ์ํ๊ณ ๋๋ฉด ๊ทธ๋ฅ ๊ณต์ฅ์ฒ๋ผ ์ฐ์ด๋ผ ์ ์๋ค! ^-^)ใ
์์ง ์คํ ๋ฆฌ๋ถ์ ๊ธฐ๋ฅ์ 10%๋ ์ ๋๋ก ํ์ฉ ์ํ๊ณ ์๋๋ฐ๋ ๋๋ฌด ์ฌ๋ฐ๊ณ ํธํด์ ์์ํ๊ธฐ ๋ง๋งํ ๋ถ๋ค์๊ฒ ๋์์ด ๋์ผ๋ฉด ํด์ ์ง๊ธ ๋น์ฅ ๊น์ ์๊ฐ์ด๋ ๊ณ ๋ฏผ ์์ด ๋ฐ๋ก ์ ์ฉํด ๋ณผ ์ ์๋๋ก ์ ์ฉ ๊ณผ์ ์ ์ ๋ฆฌํด๋ดค๋ค.
1. ์ค์น
npx -p @storybook/cli sb init
npx sb init
์์ ๋ช ๋ น์ด ์ค ํ๋๋ฅผ ํฐ๋ฏธ๋ ์ฐฝ์ ์ ๋ ฅํด ์ค์นํ๋ค.
์ค์น ์์ ์๊ฐ์ด ์กฐ๊ธ ์๋๋ฐ ํ๋ฒ์ ์ค์น๋๋ ๊ฒ ์๋๋ผ ์ค๊ฐ์ค๊ฐ ํ์ฌ ํ๋ก์ ํธ์ ์ํฉ์ ๋ฐ๋ผ ์๋ต์ ์๊ตฌํ๊ธฐ๋ ํ๋ค.
์ค์น๋๋๊ฑธ ์ ๋ณด๋ค๊ฐ ๊ฐ์๊ธฐ ๋ฉ์ถ๋ฉด ์ ์ฌํ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด์!
์ฐธ๊ณ ๋ก ์คํ ๋ฆฌ๋ถ ์ค์น๋ CRA๋ ๋ฆฌ์กํธ ํ๋ก์ ํธ ์ธํ ์ ๋๋ด๊ณ ํ๋ ๊ฑธ ์ถ์ฒํ๋ค.
ํ๋ก์ ํธ ์ธํ ์ด ๋๋์์ผ๋ฉด ์คํ ๋ฆฌ๋ถ์ด ์์์ ํ๋ก์ ํธ ํ์ ์ ํ์ํ๊ณ ๊ทธ์ ๋ง์ถฐ์ ์ค์นํด์ค๋ค!
๐ฌ ์ค์น ์ค ๋ด๊ฐ ๋ฐ์๋ ์ง๋ฌธ๋ค
1. ์ฒ์ ์ค์น ํ ํจํค์ง ์ฒดํฌ ์ง๋ฌธ
Need to install the following packages:
sb // ๋๋ @storybook/cli
Ok to proceed? (y) // y ๋๋ฅด๋ฉด ์ค์น ์คํ
2. Storybook ํ๋ก์ ํธ ํ์ ๋ฌผ์ด๋ด
๋ง์ฝ ์ด ์ง๋ฌธ์ ๋ฐ์๋ค๋ฉด ์ง๊ธ ๋ด ๊ฒฝ๋ก๊ฐ ์ ๋๋ก React ํ๋ก์ ํธ ํด๋๊ฐ ๋ง๋์ง ํ๋ฒ ์ฒดํฌํด๋ณด์!
React ํ๋ก์ ํธ ๊ฒฝ๋ก์ ์์ผ๋ฉด ๋งจ ์ฒ์์ ์์์ ํ๋ก์ ํธ ํ์ ์ ํ์ํ๊ณ react ํ์ ์ผ๋ก ์ค์น๋ฅผ ํด์ค๋ค.
2. exlintPlugin migration
๐ found a 'eslintPlugin' migration:
We've detected you are not using our eslint-plugin.
In order to have the best experience with Storybook and follow best practices, we advise you to install eslint-plugin-storybook.
More info: https://github.com/storybookjs/eslint-plugin-storybook#readme
? Do you want to run the 'eslintPlugin' migration on your project? › (y/N) // y ๋๋ฅด์
๐ ์ค์น ์๋ฃ
To run your Storybook, type:
npm run storybook
For more information visit: https://storybook.js.org
ํฐ๋ฏธ๋์ ์์ ๋ก๊ทธ๊ฐ ๋จ๋ฉด ์ค์น ์๋ฃ๋ค!
์คํ ๋ฆฌ ๋ถ์ด ์ค์น๊ฐ ์ ์์ ์ผ๋ก ๋๋๋ฉด ์ค์นํ ๊ฒฝ๋ก์ ์๋์ ํ์ผ๋ค์ด ์์ฑ๋๋ค!
์ด๊ฒ ๋ญ์ง ์ถ์๋ฐ ๋ณ๊ฑฐ ์๋ค.
.storybook์ ์คํ ๋ฆฌ๋ถ์ ํ๊ฒฝ ์ค์ ํ์ผ์ด ๋ค์ด์๋ ํด๋๊ณ
stories๋ ์คํ ๋ฆฌ๋ถ์ ๊ธฐ๋ณธ ์์ ์ฝ๋๋ค์ด ๋ค์ด์๋ ํด๋๋ค.
์คํ ๋ฆฌ๋ถ์ด ์น์ ํ๊ฒ ์ด๋ฐ ์์ผ๋ก ์์ฑํ๋ผ๊ณ ๋ค ์๋ ค์ค๋ค.
^-^)b ์คํ ๋ฆฌ๋ถ ์ต๊ณ !
์ด์จ๋ ์ค์ํ๊ฑด .storybook์ด๊ณ stories๋ ์ค์ง์ ์ผ๋ก ์ค์ํ์ง ์๋ค.
๋ฐ๋ผ์ ํด๋ ์ฑ๋ก ์ง์๋ฒ๋ ค๋ ๋....์ง๋ง!!!
์ง์ฐ๊ธฐ ์ ์ ์คํ ๋ฆฌ๋ถ์ด ์ ๋๋ก ์ค์น๋๋์ง ํ ์คํธ ํด๋ณด๊ณ ์ง์ฐ๋๊ฑธ ์ถ์ฒํ๋ค!
๐ ์ ์ค์น ๋๋์ง ์คํํด๋ณด๊ธฐ!
npm run storybook
์๊น ์ ์ค์น ์๋ฃ ๋ฉ์ธ์ง์์ ์๋ ค์คฌ๋ ๊ทธ ๋ช ๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์ ๋ ฅํด๋ณธ๋ค.
๊ทธ๋ฌ๋ฉด ์คํ ๋ฆฌ๋ถ์ด ๋ญ๊ฐ ์์ํ๋ฉด์ ์ด์ฌํ ์ผ์ ํ๋ค๊ฐ
React ํ๋ก์ ํธ ์คํํ์ ๋์ฒ๋ผ ํ! ๐ ํ๊ณ ์คํ ๋ฆฌ๋ถ์ด ์ผ์ง๋ค.
๋ง์ฝ ํฐ๋ฏธ๋์ ๋ฉ์ท๋๋ฐ๋ ์ฐฝ์ด ์ ๋จ๋ฉด ๋นํฉํ์ง ๋ง๊ณ ํฐ๋ฏธ๋์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์
Storybook์ ํ ๋น๋ ํฌํธ ๋ฒํธ๋ฅผ ์ฐพ์์ ์๋์ผ๋ก localhost:ํฌํธ๋ฒํธ ์ฃผ์๋ก ์ ์ํ๋ฉด ๋๋ค!
์ฐธ๊ณ ๋ก ์คํ ๋ฆฌ๋ถ์ ํ๋ฒ ์คํํ๋ฉด ์ ์ฅํ ๋๋ง๋ค React ํ๋ก์ ํธ์ฒ๋ผ ์๋์ผ๋ก ์ฌ์คํ๋๋ค.
๊ทธ๋์ ์ด๋๋ก ๊ทธ๋ฅ ๊ณ์ ์ผ ๋๋ ๊ฑฐ ์ถ์ฒ!
2. ์คํ ๋ฆฌ๋ถ ์ด๊ธฐ ์ค์
๐ Global Style ๊ณผ ThemeProvider ์ ์ฉ
const root = createRoot(document.getElementById('root') as HTMLElement);
root.render(
<React.StrictMode>
<ThemeProvider theme={defaultTheme}>
<GlobalStyle />
<App />
</ThemeProvider>
</React.StrictMode>,
);
๋ง์ฝ ํ ํ๋ก์ ํธ์์ GlobalStyle์ด๋ ThemeProvider๋ฅผ ์ด์ฉํด Default Style์ ์ ์ฉํ๊ณ ์๋ค๋ฉด ์คํ ๋ฆฌ๋ถ์๋ ์ ์ฉ์ด ๋๋๋ก ๋ฐ๋ก ์ค์ ์ ํ๋ ํด์ค์ผ ํ๋ค.
์ด๋ ต๊ณ ๋ณต์กํ ๊ฑด ์๊ณ ๊ทธ๋ฅ ์๊น ์ค์น๋๋ ์คํ ๋ฆฌ๋ถ์ ํ๊ฒฝ ์ค์ ๊ด๋ จ ํด๋์ธ .storybook ๋ด์ preview.js ํ์ผ๋ก ๋ค์ด๊ฐ ThemProvider, GlobalStyle, Default Style์ import ํ๊ณ ๋งจ ์๋์ ์ด ์ฝ๋๋ฅผ ๋ณต๋ถ ํด์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
export const decorators = [
(Story) => (
<ThemeProvider theme={defaultTheme}>
<GlobalStyle />
<Story />
</ThemeProvider>
),
];
decorators๋ ๋์ถฉ ์คํ ๋ฆฌ๋ถ์์ ๋ ๋๋ง ํ ๋ ์ปดํฌ๋ํธ์ ์คํ์ผ ์ธ๋ก ์ถ๊ฐ์ ์ธ ์คํ์ผ์ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
์ด๊ฑธ preview.js์ ์ ์ฉํ๋ฉด ์์ผ๋ก ์คํ ๋ฆฌ๋ถ์ผ๋ก ๋์ธ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์๊ฒ Global decorators๋ฅผ ๋ฌ์์ฃผ๋ ๊ฑฐ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์กฐ๊ธ ๋ ์ ํํ ๋ด์ฉ์ ๊ณต์ ์ฌ์ดํธ์ Decorators ๊ธ์ ์ฐธ๊ณ !
๐งญ ์ ๋ ๊ฒฝ๋ก ์ค์
์ธ์ ๋ ๊ณจ์น ์ํ๊ฒ ํ๋ ๊ฒฝ๋ก ์ค์ !
์คํ ๋ฆฌ๋ถ์์๋ ์ ๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ๋ก ์ค์ ์ ํด์ค์ผ ํ๋ค๊ณ ํ๋ค!
๊ทผ๋ฐ ์ฌ์ค ๋๋ ๋ฑํ ๋ญ ์ค์ ์ ํด์คฌ๋๋ฐ ์คํ ๋ฆฌ ์ฝ๋ ๋ด์์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด๋ ์ ์ ์ฉ์ด ๋๋ค...ใ -ใ )?
๋ด๊ฐ ์๋ชป ์ฌ์ฉํ๊ณ ์๋ ๊ฑด๊ฐ ์ถ๊ธด ํ๋ฐ...
๊ทธ๋์ ๋ง์ฝ ์ค์ ํด์ฃผ๋ ๊ฒ ๊ท์ฐฎ๋ค๋ฉด ์ผ๋จ ์ด ์ค์ ์ ๊ฑด๋๋ฐ๊ณ ์์ ์ ๋จผ์ ํด๋ณด๋ค ๊ฒฝ๋ก๋ก ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๊ทธ๋ ์๋ํด๋ด๋ ์ข์ ๊ฑฐ ๊ฐ๋ค. ์๋๋ฉด ์ฒ์์ ์๋ ๊ฒฝ๋ก๋ก ๋จผ์ ํด๋ณด๋ ๊ฒ๋ ๋์์ง ์์ ์ง๋...!
1. tsconfig์ ๊ฒฝ๋ก ์ค์ ์ ํ๋ค.
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@components/*": ["components/*"],
}
}
}
2. '.storybook' ํด๋ ๋ด์ main.js ํ์ผ์์ ์ค์ ํด์ค๋ค.
์ด๊ธฐ main.js๋ฅผ ๋ณด๋ฉด ์ด๋ ๊ฒ ๋์ด ์๋๋ฐ!
๋จผ์ path ๋ชจ๋์ import ํด์ฃผ๊ณ core ์๋์ ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค!
const path = require('path');
...
core: {
builder: '@storybook/builder-webpack5',
},
/* ์๊ฑฐ ์ถ๊ฐ! */
webpackFinal: async config => {
config.resolve.modules = [path.resolve(__dirname, '..'), 'node_modules', 'styles'];
config.resolve.alias = {
...config.resolve.alias,
'@components': path.resolve(__dirname, '../src/components')
};
return config;
},
๋ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด config.resolve.alias ์๋์ '์ค์ ํ๋ ค๋ ๊ฒฝ๋ก ๋ณ์นญ' : ์ค์ ๊ฒฝ๋ก ํํ'๋ก ์์ฑํ๋ฉด ๋๋ค.
์ด ๋ฐฉ๋ฒ์ path ๋ชจ๋์ ์ฌ์ฉํด์ผ ํ๋๋ฐ ๋ฌด์จ TsconfigPathPlugin์ ์ฌ์ฉํด์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ , ์๋์ ๊ฐ์ด ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์๋ค๊ณ ํ๋ ๊ฑฐ ๊ฐ๋ค.
webpackFinal: async (config) => {
config.resolve.modules = [...(config.resolve.modules || []), path.resolve(__dirname, '../src')];
return config;
},
์ด๊ฑฐ ์ ๊ฑฐ ํด๋ณด๊ณ ๋ณธ์ธ ํ๋ก์ ํธ์ ๋ง๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค.
3. ์คํ ๋ฆฌ ํ ์คํธ ์ฝ๋ ์์ฑ
๋๋์ด ์ค์ ์ด๋ค!
ํ์ง๋ง TypeScript๋ก ์์ ์ ํ๊ณ ์๋ค๋ฉด ํฌ๊ฒ ๊ฑฑ์ ํ ๊ฒ ๋ฑํ ์๋ค!
JavaScript ๋ฅผ ํ ๋๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ ์ผ์ผ์ด ํ์ ์ ์ง์ ํด์ค์ผ ์ ๋๋ก ์คํ ๋ฆฌ ๋ถ์ ํ์ฉํ ์ ์๋๋ฐ
์ด๋ฏธ TypeScript๋ก ํ์ ์ ๋ค ์ง์ ํด๋จ์ผ๋ฉด ๊ทธ ๊ณผ์ ์ ๊ฑด๋๋ธ ์ ์์ด์ ์์ฃผ ์ข๋ค!
๐ ์คํ ๋ฆฌ ํ ์คํธ ์ฝ๋ ํ์ผ ์์น
src ์๋์๋ง ์์ผ๋ฉด ๋ฑํ ์๊ด์๋ค!
์ฒ์ ์คํ ๋ฆฌ๋ถ์ ์ค์นํ์ ๋ ์๊ฒผ๋ src ํด๋ ์๋์ stories ํด๋๋ฅผ ์ฌํ์ฉํด๋ ๋๊ณ ์๋๋ฉด ๊ทธ๋ฅ ์์ฑํ ์ปดํฌ๋ํธ .tsx ํ์ผ๊ณผ ํจ๊ป ๋ฌ๋ ๋๋ค.
์ค์ํ ๊ฑด ํ์ผ์ ์ด๋ฆ์ .stories ๊ฐ ๋ค์ด๊ฐ๋๋๋ค.
์ฌ๊ธฐ์ ์คํ ๋ฆฌ๋ถ์ ํ๊ฒฐ ์ค์ ํ์ผ main.js๋ฅผ ๋ค์ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์คํ ๋ฆฌ ํ ์คํธ ์ฝ๋์ ํ์ผ ๋ช ์ ๋ํ ์ค์ ๋ ํ์ธํ ์ ์๋ค. (๋ฌผ๋ก ์ํ๋๋๋ก ์์ ๋ ํ ์ ์๋ค!)
๋๋ ๋ฐ๋ก ์คํ ๋ฆฌ ํด๋๋ฅผ ๋ง๋ค์ด ๋์ง ์๊ณ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์ฌ์ฉํ๊ณ ์๋ค!
ํ๊บผ๋ฒ์ ๋ชจ์๋๋ ๊ฒ ๊ด๋ฆฌํ๊ธฐ ํธํ ๊ฑฐ ๊ฐ๋ค ^-^)b
๊ทผ๋ฐ ๋์ค์ ์คํ ๋ฆฌ ํ์ผ๋ค์ ๋ค ์์ ์ผ ํ๊ฑฐ๋ ๊ทธ๋ฐ ๊ฒฝ์ฐ๊ฐ ํ์ํ๋ค๋ฉด ๊ทธ๋ฅ ํ ๊ณณ์ ๋ชจ์ ๊ด๋ฆฌํ๋ ๊ฒ ๋์ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค!
๐ ์คํ ๋ฆฌ ํ ์คํธ ์ฝ๋ ์์ฑ! with ํ ํ๋ฆฟ ์ฝ๋
์ด๋ ค์ธ ๊ฑฐ ํ๋ ์๋ค!
๋๋ ์์ ๊ฐ๋จํ ํ ํ๋ฆฟ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋๊ณ ์ด๊ฑธ ๋ณต๋ถ ํด์ ๊ณต์ฅ์ฒ๋ผ ์ฐ์ด๋ด๊ณ ์๋คใ ใ !
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import ์ปดํฌ๋ํธ from '์ปดํฌ๋ํธ.tsx ๊ฒฝ๋ก';
export default {
title: '์นดํ
๊ณ ๋ฆฌ์ด๋ฆ/์ปดํฌ๋ํธ์ด๋ฆ',
component: ์ปดํฌ๋ํธ,
} as ComponentMeta<typeof ์ปดํฌ๋ํธ>;
const Template: ComponentStory<typeof ์ปดํฌ๋ํธ> = (args) => <์ปดํฌ๋ํธ {...args} />;
export const ์ปค์คํ
= Template.bind({});
์ปค์คํ
.args = {
๊ฐ์ ์ง์ ํ๊ณ ์ถ์ ์์ฑ : ์์ฑ๊ฐ,
};
์ปค์คํ
.storyName = '์คํ ๋ฆฌ๋ถ์ ํ์ํ ์ด๋ฆ';
export const Default: ComponentStory<typeof ์ปดํฌ๋ํธ> = (args) => <์ปดํฌ๋ํธ {...args} />;
์์ ์ฝ๋์์ ํ๊ธ๋ก ๋์ด ์๋ ๋ถ๋ถ์ ์์ ํด์ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ์คํ ๋ฆฌ๋ถ์ ๊ทธ๋ฅ ๋ฌ๋ค! ^-^)b
์์๋ฅผ ํตํด ์ด๋ป๊ฒ ์ฐ๋ ๊ฑด์ง ์ข ๋ ์์ธํ ์์๋ณด๋ฉด!
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ props ์์ฑ์ ๊ฐ์ง๋ WeekList๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ํ ๋!
์์ ์ฝ๋๋ฅผ ๋ณต๋ถ ํด์ ํ๊ธ๋ก ๋ ๋ถ๋ถ์ ์์ ์ ํ๊ณ ์ผ์ชฝ์ฒ๋ผ ์์ฑ์ ํ๋ฉด ์ค๋ฅธ์ชฝ์ฒ๋ผ ๋ฟ ! ๋ฌ๋ค.
^-^) ใ ใ ใ ใ ์ฐธ ์ฝ๋คใ ใ ใ ใ ใ
์ฐธ๊ณ ๋ก ์คํ ๋ฆฌ๋ถ ํ๋จ์ Controls์ ๋จ๋ ์์ฑ๋ค์ ์ ๋ถ weekList.tsx ์์ ์ค์ ํ weekList ์ props ํ์ ์์ ์๋์ผ๋ก ๊ฐ์ ธ์์ง ๊ฑฐ๋ค. ๋ง์ฝ ์ด๊ฒ TS๊ฐ ์๋๊ณ JavaScript ์๋ค๋ฉด...propsTypes ๋ก ํ์ ์ ๋ค ์ง์ ์ ํด์ค์ผ ์ ๋๋ก ๋ฌ๋ค...! ใ -ใ )!
์์ ์ฝ๋์ ๋ํด ์ข ๋ ์ค๋ช ์ ํด๋ณด์๋ฉด
์ด๋ฐ ๊ตฌ์กฐ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค!
๋นจ๊ฐ์์ผ๋ก ์ฒดํฌํ title์์ ์คํ ๋ฆฌ๋ถ์ ์์๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ง์ ํ๋๋ฐ / ๋ก ๊ตฌ๋ถํด์ ๋๋ถ๋ฅ, ์๋ถ๋ฅ๋ก ๋๋ ์ ์๋ค.
(์ฆ title์ Calender/ ๋ผ๊ณ ์ด ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ ์ ์ผ ํฐ ์นดํ ๊ณ ๋ฆฌ์ธ Calender์ ํฌํจ๋๋ค!)
๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋์๋ ์์ฑํ ์คํ ๋ฆฌ ์ฝ๋์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ค์ด ํ์๊ฐ ๋๋๋ฐ
๋งจ ์๋์ ๋ณด๋ผ์์ผ๋ก ์ฒดํฌํ ์๋ฌด๋ฐ ์์ฑ์ ์ง์ ํ์ง ์์ ์คํ ๋ฆฌ๊ฐ Default๋ก ์ถ๊ฐ๋๊ณ
๊ทธ ์ค๊ฐ์ Template๋ก ์์ฑํ ์คํ ๋ฆฌ ๊ฐ์ฒด? WeekListEng๊ฐ args์ ์ค์ ํ ์์ฑ ๊ฐ์ด ์ ์ฉ๋ ์ํ๋ก,
storyName์ ์ค์ ํ ์ด๋ฆ์ผ๋ก ๋ฌ๋ค!
ํ์ ์ฝ๋๋ ๋ฑ ์ด ๋ถ๋ถ์ด๊ณ
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import WeekList from 'components/calender/components/WeekList';
import weekData from 'components/calender/constants/weekData';
export default {
title: 'Calender/WeekList',
component: WeekList,
} as ComponentMeta<typeof WeekList>;
export const Default: ComponentStory<typeof WeekList> = (args) => <WeekList {...args} />;
์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ์คํ ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ผ๋ฉด ์์ WeekListEng๋ฅผ ๋ณต์ฌํด์ Template๋ก ์คํ ๋ฆฌ ๊ฐ์ฒด๋ค์ ์์ฑํด์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค! ์๋์ฒ๋ผ!
const Template: ComponentStory<typeof WeekList> = (args) => <WeekList {...args} />;
export const WeekListEng = Template.bind({});
WeekListEng.args = {
data: weekData.eng,
};
WeekListEng.storyName = 'WeekList(Eng)';
/* ์คํ ๋ฆฌ ์๋ก ์ถ๊ฐ */
export const WeekListJp = Template.bind({});
WeekListJp.args = {
data: weekData.jp,
};
WeekListJp.storyName = 'WeekList(Jp)';
์์์์!! ์ถ๊ฐ๋๋ค!!! ^3^)!!!!
๋๋ ํ์ฌ ์ฝ๋์ค์ฟผ๋์์ ์งํ ์ค์ธ 3์ฃผ ๋ฏธ์ ์์ ์ด ์ ๋๊น์ง๋ง ํด์ ์คํ ๋ฆฌ๋ถ์ ํ์ฉํ๊ณ ์๋ค.
์คํ ๋ฆฌ๋ถ์ ๋ํด์ ์ข ๋ ์ฐพ์๋ณด๋ฉด ์คํ ๋ฆฌ๋ถ์ ๋จ๋ Controls ๋ค์ ํ์ ์ ํธํ ๊ฑธ๋ก ๋ฐ๊ฟ ์๋ ์๊ณ
decorators ์์ฑ์ ์ฌ์ฉํด ์คํ ๋ฆฌ๋ถ ๋ด์์ ์ปดํฌ๋ํธ๋ฅผ ์ข ๋ ๋ณด๊ธฐ ์ฝ๊ฒ ์ปค์คํ ํ ์๋ ์๋ค.
์ผ์ข ์ ์ต์คํ ์ ์ธ addon์ ์ถ๊ฐํด ์์ค ์ฝ๋๋ ๊ฐ์ด ๋์ฐ๊ฑฐ๋, Readme๋ฅผ ์ถ๊ฐํด์ฃผ๊ฑฐ๋ ๋ฑ ๋ฉ์ง๊ฒ ์ธ ์ ์๊ธด ํ์ง๋ง...!
๋ฏธ์ ํ๊ธฐ๋ ๋ฐ์๊ณ ์์ง ๋ฏธ์ ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ํฌ์ง ์์์ ์ด ์ด์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ํ์๊น์ง๋ ์์ ๊ฑฐ ๊ฐ๋ค.
์ด ์ ๋๋ง ํด๋ ์ข์ ๊ฒ ์์ฑ๊ฐ์ ์คํ ๋ฆฌ๋ถ์์ ์ด๊ฑฐ์ ๊ฑฐ ์์ ํด๊ฐ๋ฉฐ ์ค์ ๋ก ์ ์ ์ฉ์ด ๋๋์ง ํ ์คํธ ํ๋๊ฑด ๋ฌผ๋ก ์ด๊ณ
์ปดํฌ๋ํธ๋ฅผ ๋งจ ์ฒ์ ๋ง๋ค๊ณ ๋์ ์คํ์ผ์ด ์ ๋๋ก ๋๋์ง ํ์ธํ๊ธฐ ์ํด App ํ์ผ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ฐ๋ก ํ ํ๋ฆฟ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ ์คํํด๋ณด๊ฑฐ๋ ํ ํ์ ์์ด ๋ฐ๋ก๋ฐ๋ก ์ ์ฅํ๊ณ ํ์ธํ๊ณ ์ ์ฅํ๊ณ ํ์ธํ๊ณ ํ ์ ์์ด์ ํธํ๋ค!
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์์ฑ ๊ฐ์ด ๋ง๊ณ , ๊ทธ ์์ฑ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ์ ๋์์ธ์ด ํํ ๋ฐ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ
ํด๋น ๋์์ธ์ ๋ง๋ค๋ผ๋ฉด ์ ํํ ์ด๋ค ์์ฑ์ด ์ด๋ค ๊ฐ์ด์ด์ผ ํ๋์ง๋ฅผ ์คํ ๋ฆฌ๋ถ์ ๋ณด๊ณ ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์์ด์ ๋๋ฌด ํธํ๋ค!
๋ฌด์๋ณด๋ค ์ ์ผ ์ต๊ณ ๋ผ ์๊ฐํ๋ ์ฅ์ ์...!
โง*.โ( ห แจ ห )โ.*โง
๋ค ๋ง๋ค๊ณ ๋ณด๋ฉด ๋ ๋ฟ๋ฏํจ!!!
๊ฑฐ๊ธฐ๋ค ์ด๋ ๊ฒ ๋ง๋ ์คํ ๋ฆฌ๋ถ์ ๋ฐฐํฌ๋ ํ ์ ์๋ค!!!!!
๋ฐฐํฌ์ ๋ํ ๋ด์ฉ์...!
๋ฐ๋ก ๊ธ์ ํ๋ ๊ฒ ๋ซ๊ฒ ๋คใ ใ ! -> ๋ฐ๋ก ํ ๋ค!
์๋ฌดํผ ์คํ ๋ฆฌ๋ถ ๋๋ฌด ์ข๋น!!!! ^0^)!ใ ใ ใ ใ ใ
๋ค๋ค ์ธ๋ผ์ด!!!
๐ ์ฐธ๊ณ
'๐ Study > ๐ฉบ Testing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ Storybook Error : useLocation() may be used only in the context of a <Router> component. (0) | 2022.06.02 |
---|---|
Storybook Chromatic ์ผ๋ก ๋ฐฐํฌํด๋ณด๊ธฐ! + ๋ฒ์ธ Netlify (0) | 2022.06.02 |