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 ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ์—๋„ ์šฉ์ด
  • ์žฌ์‚ฌ์šฉ์„ฑ, ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ
  • ๋””์ž์ธ ์‹œ์Šคํ…œ๊ณผ์˜ ์กฐํ™” โ†’ ์ปดํฌ๋„ŒํŠธ ๋””์ž์ธ์˜ ์žฅ์ 

๋‹จ์  โ†’ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•„์ง/