์ต๊ณ ์ ์คํ ์์ค ํ๋ก์ ํธ๋ฅผ ๊ฐ์ง ์ ์์ง๋ง, ์ข์ ๋ฌธ์๊ฐ ์์ผ๋ฉด ์ฑ๊ณตํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ฌ๋ฌด์ค์์๋ ๋ฌธ์๋ฅผ ์ ์์ฑํ๋ฉด ๋์ผํ ์ง๋ฌธ์ ๋ตํ ์ ์์ต๋๋ค. ๋ฌธ์ํ๋ ์ฃผ์ ์ง์์ด ํ์ฌ๋ฅผ ๋ ๋๊ฑฐ๋ ์ญํ ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์ฌ๋๋ค์ด ํ๋ก์ ํธ๋ฅผ ์ดํดํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ํ ์ง์นจ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ธด ํ ์คํธ๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ Markdown์ HTML์ ํ๋ฅญํ ๋์์ ๋๋ค. ๋๋๋ก Markdown ๊ตฌ๋ฌธ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ด๋ถ์ HTML์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ง์ถค ์์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ ์น ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ํ ์คํธ ๋ฌธ์์ ์ฝ๊ฒ ํฌํจํ ์ ์์ต๋๋ค. React(๋๋ Preact๋ Vue์ ๊ฐ์ ๋ค๋ฅธ JSX ํ๋ ์์ํฌ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ MDX์์๋ ๋์ผํ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์๋ ๋ฌธ์ ์์ฑ ๋ฐ ์ง์นจ ์์ฑ์ ์ํ ๋๊ตฌ์ ๋ํ ๊ด๋ฒ์ํ ๊ฐ์์ ๋๋ค. ์ฌ๊ธฐ์ ๋์ด๋ ๋ชจ๋ ๋๊ตฌ๊ฐ MDX๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋์ง๋ง ๋ฌธ์ํ ๋๊ตฌ์ MDX๊ฐ ์ ์ ๋ ๋ง์ด ํฌํจ๋๊ณ ์์ต๋๋ค.
MDX๋ ๋ฌด์์ ๋๊น?
ํ์ผ .mdx
Markdown๊ณผ ๋์ผํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง๋ง ๋ํํ JSX ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ ์ฝํ
์ธ ์ ํฌํจํ ์ ์์ต๋๋ค. Vue ๊ตฌ์ฑ ์์์ ๋ํ ์ง์์ ์ํ ๋ฒ์ ์
๋๋ค. MDX ์์
์ ์์ํ๋ ค๋ฉด โCreate React Appโ์ ์ค์นํ์ธ์. Next.js ๋ฐ Gatsby์ฉ ํ๋ฌ๊ทธ์ธ์ด ์์ต๋๋ค. Docusaurus์ ๋ค์ ๋ฒ์ (๋ฒ์ 2)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค.
Docusaurus๋ก ๋ฌธ์ ์์ฑํ๊ธฐ
Docusaurus๋ Facebook์ ๊ธ์ ์ผ์ต๋๋ค. ๊ทธ๋ค์ React๋ฅผ ์ ์ธํ ๋ชจ๋ ์คํ ์์ค ํ๋ก์ ํธ์์ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ฌ ์ธ๋ถ์์๋ Redux, Prettier, Gulp ๋ฐ Babel์์ ์ฌ์ฉ๋ฉ๋๋ค.
Docusaurus๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ.
Docusaurus๋ฅผ ์ฌ์ฉํ์ฌ ๊ธ์ ์ธ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ฌธ์๋ ํ๋ฐํธ์๋๋ฅผ ์ค๋ช ํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๋ด๋ถ์ ์ผ๋ก React๊ฐ ์์ง๋ง ์ฌ์ฉํ๊ธฐ ์ํด ์ต์ํด์ง ํ์๋ ์์ต๋๋ค. Markdown ํ์ผ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์ฒ๋ผ ์ ๊ตฌ์กฐํ๋๊ณ ํ์ํ๋๊ณ ์ฝ๊ธฐ ์ฌ์ด ์๋ฆ๋ค์ด ๋์์ธ์ ๋ฌธ์๊ฐ ์ค๋น๋ฉ๋๋ค.
Redux ์น์ฌ์ดํธ์์ ํ์ค Docusaurus ํ
ํ๋ฆฟ์ ๋ณผ ์ ์์ต๋๋ค.
Docusaurus๋ก ๊ตฌ์ถ๋ ์น์ฌ์ดํธ์๋ Markdown ๊ธฐ๋ฐ ๋ธ๋ก๊ทธ๋ ํฌํจ๋ ์ ์์ต๋๋ค. Prism.js๋ ๊ตฌ๋ฌธ ๊ฐ์กฐ๋ฅผ ์ํด ์ฆ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. Docusaurus๊ฐ ๋น๊ต์ ์ต๊ทผ์ ๋ฑ์ฅํ์์๋ ๋ถ๊ตฌํ๊ณ StackShare์์๋ 2018๋ ์ต๊ณ ์ ๋๊ตฌ๋ก ์ธ์ ๋ฐ์์ต๋๋ค.
๊ธฐํ ์ฝํ ์ธ ์์ฑ ์ต์
Docusaurus๋ ๋ฌธ์ ์์ฑ์ ์ํด ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค. ๋ฌผ๋ก ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์์ด ๋ง์ต๋๋ค. ๋ชจ๋ ์ธ์ด, CMS๋ก ์์ ๋ง์ ์๋ฃจ์ ์ ๋ฐฐํฌํ๊ฑฐ๋ ์ ์ ์ฌ์ดํธ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด React, IBM ๋์์ธ ์์คํ , Apollo ๋ฐ Ghost CMS์ ๋ํ ๋ฌธ์์์๋ ๋ธ๋ก๊ทธ์ ์์ฃผ ์ฌ์ฉ๋๋ ์ ์ ์ฌ์ดํธ ์์ฑ๊ธฐ์ธ Gatsby๋ฅผ ์ฌ์ฉํฉ๋๋ค. Vue๋ก ์์ ํ๋ ๊ฒฝ์ฐ VuePress๊ฐ ์ข์ ์ ํ์ ๋๋ค. ๋ ๋ค๋ฅธ ์ต์ ์ Python์ผ๋ก ์์ฑ๋ ์์ฑ๊ธฐ์ธ MkDocs๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์คํ ์์ค์ด๋ฉฐ ๋จ์ผ YAML ํ์ผ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ๋ฉ๋๋ค. GitBook๋ ์ข์ ์ต์ ์ด์ง๋ง ๊ณต๊ณต ๋ฐ ๋น์์ ์ ํ์๊ฒ๋ง ๋ฌด๋ฃ์ ๋๋ค. Git์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ mardown ํ์ผ์ ์ ๋ก๋ํ๊ณ Github์์ ์์ ํ ์๋ ์์ต๋๋ค.
๋ฌธ์ํ ๊ตฌ์ฑ ์์: Docz, Storybook ๋ฐ Styleguidist
์ง์นจ, ์์คํ ์ค๊ณ, ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ ๋ฌด์์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์ต๊ทผ์๋ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ๋์์ง๊ณ ์์ต๋๋ค. React์ ๊ฐ์ ๊ตฌ์ฑ์์ ํ๋ ์์ํฌ์ ์ฌ๊ธฐ์ ์ธ๊ธ๋ ๋๊ตฌ์ ์ถํ์ผ๋ก ์ด๋ฅผ ํ์์ฌ ํ๋ก์ ํธ์์ ์ ์ฉํ ๋๊ตฌ๋ก ๋ณ๋ชจ์์ผฐ์ต๋๋ค.
Storybook, Docz ๋ฐ Styleguidist๋ ๋ชจ๋ ๋์ผํ ์์ ์ ์ํํฉ๋๋ค. ์ฆ, ๋ํํ ์์๋ฅผ ํ์ํ๊ณ ํด๋น API๋ฅผ ๋ฌธ์ํํฉ๋๋ค. ํ๋ก์ ํธ์๋ ์ํ์ ์คํ์ผ์ด ์๋ก ๋ค๋ฅธ ์์ญ ๋๋ ์๋ฐฑ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ ์์ ์ ์์ต๋๋ค. ๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๋ฉด ์ฌ๋๋ค์ด ํด๋น ๊ตฌ์ฑ์์๊ฐ ์กด์ฌํ๋ค๋ ์ฌ์ค์ ์์์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๊ตฌ์ฑ์์๋ฅผ ์นดํ๋ก๊ทธํํ๋ฉด ๋ฉ๋๋ค. ์ง์นจ์ ๋ชจ๋ ๊ตฌ์ฑ ์์์ ๋ํ ๊ฐ์๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋๋ก ์ ๊ณตํฉ๋๋ค. ์ด๋ ์๊ฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ฐ๋ณต์ ์ธ ์์ ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ด๋ฌํ ๋๊ตฌ๋ ๋ค์ํ ์ํ๋ฅผ ๋ณผ ์ ์๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์ ๊ตฌ์ฑ ์์์ ๊ฐ ์ํ๋ฅผ ์ฌํํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ฆญํ๋ ๋์ ๋ณ๋์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ฌํ๊ธฐ ์ด๋ ค์ด ์ํ(์: ๋ก๋ฉ ์ํ)๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
๋ค์ํ ์ํ ๋ฐ ์์ฑ ๋ชฉ๋ก์ ์๊ฐ์ ๋ฐ๋ชจ์ ํจ๊ป ์ฝํ ์ธ ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ค๋ช (์ค๊ณ ๊ทผ๊ฑฐ, ์ฌ์ฉ ์ฌ๋ก ๋๋ ์ฌ์ฉ์ ํ ์คํธ ๊ฒฐ๊ณผ ์ค๋ช )์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋งํฌ๋ค์ด์ ๋ฐฐ์ฐ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ด์์ ์ผ๋ก ์ง์นจ์ ๋์์ด๋์ ๊ฐ๋ฐ์๊ฐ ๊ณต์ ํ๋ ๋ฆฌ์์ค์ฌ์ผ ํฉ๋๋ค. Docz, Styleguidist ๋ฐ Storybook์ Markdown์ ๊ตฌ์ฑ ์์์ ์ฝ๊ฒ ํผํฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๋ฌธ์
ํ์ฌ Docz๋ React์์๋ง ์๋ํ์ง๋ง Preact, Vue ๋ฐ ์น ๊ตฌ์ฑ ์์๋ฅผ ์ง์ํ๊ธฐ ์ํ ํ๋ฐํ ์์
์ด ์งํ ์ค์
๋๋ค. Docz๋ ์ธ ๊ฐ์ง ๋๊ตฌ ์ค ๊ฐ์ฅ ์ต์ ๋๊ตฌ์ด์ง๋ง Github์์ 14๊ฐ ์ด์์ ๋ณ์ ์์งํ์ต๋๋ค. Docz๋ ๋ ๊ฐ์ง ๊ตฌ์ฑ ์์๋ฅผ ์๊ฐํฉ๋๋ค. <Playground>
ะธ < Props >
. ํ์ผ๋ก ๊ฐ์ ธ์ ์ฌ์ฉ๋ฉ๋๋ค. .mdx
.
import { Playground, Props } from "docz";
import Button from "../src/Button";
## You can _write_ **markdown**
### You can import and use components
<Button>click</Button>
์์ ๋ง์ React ์ปดํฌ๋ํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ํํ ์ ์์ต๋๋ค. <Playground>
๋ด์ฅ๋ CodePen ๋๋ CodeSandbox์ ์๋ ๋ก๊ทธ๋ฅผ ์์ฑํฉ๋๋ค. ์ฆ, ๊ตฌ์ฑ ์์๋ฅผ ๋ณด๊ณ ํธ์งํ ์ ์์ต๋๋ค.
<Playground>
<Button>click</Button>
</Playground>
<Props>
ํน์ React ๊ตฌ์ฑ ์์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์์ฑ, ๊ธฐ๋ณธ๊ฐ ๋ฐ ์์ฑ์ด ํ์ํ์ง ์ฌ๋ถ๋ฅผ ํ์ํฉ๋๋ค.
<Props of={Button} />
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ด MDX ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ด ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฝ๊ณ ์์ ํ๊ธฐ ๊ฐ์ฅ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Gatsby ์ ์ ์ฌ์ดํธ ์์ฑ๊ธฐ์ ํฌ์ด๋ผ๋ฉด Docz๊ฐ ํ๋ฅญํ ํตํฉ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์คํ์ผ ๊ฐ์ด๋
Docz์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๋ Markdown ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. Styleguidist๋ ์ผ๋ฐ ํ์ผ์์ Markdown ์ฝ๋ ๋ธ๋ก(์ผ์ค๋ฐ์ดํ)์ ์ฌ์ฉํฉ๋๋ค. .md
MDX๊ฐ ์๋ ํ์ผ.
```js
<Button onClick={() => console.log('clicked')>Push Me</Button>
Markdown์ ์ฝ๋ ๋ธ๋ก์ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๋ง ํ์ํฉ๋๋ค. Styleguidist๋ฅผ ์ฌ์ฉํ ๋ ์ธ์ด ํ๊ทธ๊ฐ ์๋ ๋ชจ๋ ์ฝ๋ ๋ธ๋ก js
, jsx
๋๋ javascript
React ๊ตฌ์ฑ ์์๋ก ๋ ๋๋ง๋ฉ๋๋ค. Docz์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝ๋๋ ํธ์ง ๊ฐ๋ฅํฉ๋๋ค. ์์ฑ์ ๋ณ๊ฒฝํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ํ์ธํ ์ ์์ต๋๋ค.
Styleguidist๋ PropTypes, Flow ๋๋ Typescript ์ ์ธ์์ ์์ฑ ํ ์ด๋ธ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
Styleguidist๋ ํ์ฌ React์ Vue๋ฅผ ์ง์ํฉ๋๋ค.
์คํ ๋ฆฌ ๋ถ
์คํ ๋ฆฌ๋ถ์ 'UI ์ปดํฌ๋ํธ ๊ฐ๋ฐ ํ๊ฒฝ'์ผ๋ก ์๋ฆฌ๋งค๊นํฉ๋๋ค. Markdown ๋๋ MDX ํ์ผ ๋ด์ ์์ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๋ ๋์ ๋ค์์ ์์ฑํฉ๋๋ค. ์ญ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ด๋ถ. ์ด์ผ๊ธฐ ๊ตฌ์ฑ ์์์ ํน์ ์ํ๋ฅผ ๋ฌธ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ตฌ์ฑ ์์์๋ ๋ก๋๋ ์ํ์ ๋นํ์ฑํ๋ ์ํ์ ๋ํ ๊ธฐ๋ก์ด ์์ ์ ์์ต๋๋ค(์ฌ์ฉ).
storiesOf('Button', module)
.add('disabled', () => (
<Button disabled>lorem ipsum</Button>
))
Storybook์ Styleguidist ๋ฐ Docz๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์์ ์ด๊ฒ์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ต์ ์ด๋ฉฐ ์ด ํ๋ก์ ํธ๋ Github์์ 36๊ฐ ์ด์์ ๋ณ์ ๋ฐ์์ต๋๋ค. 000๋ช ์ ๊ธฐ์ฌ์์ ์ ๊ท ์ง์์ด ์ฐธ์ฌํ๋ ์คํ ์์ค ํ๋ก์ ํธ์ ๋๋ค. Airbnb, Algolia, Atlassian, Lyft ๋ฐ Salesforce์์ ์ฌ์ฉ๋ฉ๋๋ค. Storybook์ React, React Native, Vue, Angular, Mithril, Ember, Riot, Svelte ๋ฐ ์ผ๋ฐ HTML ๋ฑ ๊ฒฝ์์ฌ๋ณด๋ค ๋ ๋ง์ ํ๋ ์์ํฌ๋ฅผ ์ง์ํฉ๋๋ค.
ํฅํ ๋ฆด๋ฆฌ์ค์๋ Docz ๋ฐ MDX์ ๊ธฐ๋ฅ์ด ๋์ ๋ ์์ ์ ๋๋ค.
# Button
Some _notes_ about your button written with **markdown syntax**.
<Story name="disabled">
<Button disabled>lorem ipsum</Button>
</Story>
Storybook์ ์๋ก์ด ๊ธฐ๋ฅ์ ์์ผ๋ก ๋ช ๋ฌ์ ๊ฑธ์ณ ์ ์ง์ ์ผ๋ก ์ถ์๋ ์์ ์ด๋ฉฐ ์ด๋ ํฐ ์ง์ ์ด ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
๊ฒฐ๊ณผ
ํจํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด์ ์ Medium์ ์๋ฐฑ๋ง ๊ฐ์ ๊ธฐ์ฌ์์ ๊ทน์ฐฌ๋์์ต๋๋ค. ์ ์ํ๋๋ฉด ๊ด๋ จ ์ ํ์ ๋ง๋ค๊ณ ์์ด๋ดํฐํฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๋ ์ฌ์์ง๋๋ค. ๋ฌผ๋ก , ์ด๋ฌํ ๋๊ตฌ ์ค ์ด๋ ๊ฒ๋ ๋ง๋ฒ์ฒ๋ผ ๋์์ธ ์์คํ ์ ์์ฑํ์ง๋ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ์ ์คํ ๋์์ธ๊ณผ CSS๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ์ ์ฒด๊ฐ ์ก์ธ์คํ ์ ์๋ ๋์์ธ ์์คํ ์ ๋ง๋ค ๋๊ฐ ๋๋ฉด Docz, Storybook ๋ฐ Styleguidist๊ฐ ํ๋ฅญํ ์ ํ์ ๋๋ค.
๋ฒ์ญ๊ฐ๋ก๋ถํฐ. ์ด๊ฒ์ด Habrรฉ์ ๋ํ ๋์ ์ฒซ ๊ฒฝํ์ ๋๋ค. ๋ถ์ ํํ ๋ด์ฉ์ ๋ฐ๊ฒฌํ๊ฑฐ๋ ๊ธฐ์ฌ ๊ฐ์ ์ ์ํ ์ ์์ด ์๋ ๊ฒฝ์ฐ ๊ฐ์ธ ๋ฉ์์ง๋ก ์ ์๊ฒ ํธ์ง๋ฅผ ๋ณด๋ด์ฃผ์ธ์.
์ถ์ฒ : habr.com