Atomic Design
- Atoms(์์): ๊ฐ์ฅ ์์ UI ๊ตฌ์ฑ ์์ (๋ฒํผ, ์ ๋ ฅ ํ๋ ๋ฑ)
- Molecules(๋ถ์): ์ฌ๋ฌ ์์๊ฐ ๋ชจ์ฌ์ ์ด๋ฃจ์ด์ง ๋ ๋ณต์กํ ์์ (์ ๋ ฅ ํ๋ + ๋ฒํผ)
- Organisms(์๋ฌผ): ์ฌ๋ฌ ๋ถ์๊ฐ ๋ชจ์ฌ์ ํฐ UI ์ปดํฌ๋ํธ (ํผ, ๋ค๋น๊ฒ์ด์ ๋ฐ ๋ฑ)
- Templates(ํ ํ๋ฆฟ): UI ์ปดํฌ๋ํธ๋ค์ ๊ตฌ์กฐ (ํ์ด์ง ๋ ์ด์์ ๋ฑ)
- Pages(ํ์ด์ง): ํ ํ๋ฆฟ์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ ์์ฑ๋ ํ์ด์ง
๊ตฌ์ฑ์์
1.ย Atom(์์): ๊ฐ์ฅ ์์ ๋จ์์ UI ์์
// Button.js
const Button = ({ label }) => <button>{label}</button>;
export default Button;
2.ย Molecule(๋ถ์): ์ฌ๋ฌ Atom์ด ๋ชจ์ฌ์ ๋ ๋ณต์กํ ์์
// SearchBar.js
import Button from './Button';
const SearchBar = () => (
<div>
<input type="text" />
<Button label="Search" />
</div>
);
export default SearchBar;
3.ย Organism(์๋ฌผ): ์ฌ๋ฌ Molecule์ด ๋ชจ์ฌ์ ์๋ฏธ์๋ UI ์์๊ตฌ์ฑ
// Header.js
import SearchBar from './SearchBar';
const Header = () => (
<header>
<h1>My App</h1>
<SearchBar />
</header>
);
export default Header;
4.ย Template(ํ ํ๋ฆฟ): ๋ ์ด์์ ๊ตฌ์กฐ ์ ์
// PageTemplate.js
import Header from './Header';
const PageTemplate = ({ children }) => (
<div>
<Header />
<main>{children}</main>
</div>
);
export default PageTemplate;
5.ย Page(ํ์ด์ง): ํ ํ๋ฆฟ์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ์์ฑ๋ ํ์ด์ง
// HomePage.js
import PageTemplate from './PageTemplate';
const HomePage = () => (
<PageTemplate>
<p>Welcome to the Crong world!</p>
</PageTemplate>
);
export default HomePage;
storybook โ ์ปดํฌ๋ํธ ํ๋์ ๋ํด์ ์คํ ๋ฆฌ๋ฅผ ๋ฃ์ด ํ ์คํธํ๋ฏ์ด ํจ ์์ ์ปดํฌ๋ํธ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ํ ๋ฏน ๋์์ธ๊ณผ ์ผ์ถ ๋ง์
์ปดํฌ๋ํธ๋ฅผ ์ ๋๋๋ฉด
- Jest ๋ฟ๋ง ์๋๋ผ ํ ์คํธ์๋ ์ฉ์ด
- ์ฌ์ฌ์ฉ์ฑ, ์์ฐ์ฑ ํฅ์
- ๋์์ธ ์์คํ ๊ณผ์ ์กฐํ โ ์ปดํฌ๋ํธ ๋์์ธ์ ์ฅ์
๋จ์ โ ํ์ผ์ด ๋๋ฌด ๋ง์์ง/