Atomic Design Storybook - boostcamp-2020/Project12-B-Slack-Web GitHub Wiki

Atomic Design을 λ„μž…ν•˜κ²Œ 된 이유

μŠ¬λž™μ„ κ΅¬ν˜„ν•˜λ©΄μ„œ ν”„λ‘œν•„ μ΄λ―Έμ§€λ‚˜ λ©”μ‹œμ§€, μž…λ ₯μ°½ λ“± μΌκ΄€λœ λ””μžμΈμ˜ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ λ§Žλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€λ©΄ λΆˆν•„μš”ν•œ μ½”λ“œ 쀑볡을 쀄이고, 개발 생산성을 높일 수 μžˆλ‹€κ³  νŒλ‹¨ν–ˆκΈ° λ•Œλ¬Έμ— Atomic Design을 λ„μž…ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

Atomic Designμ΄λž€?

Atomic Designμ΄λž€ μ›μžκ°€ κ²°ν•©ν•΄μ„œ λΆ„μžκ°€ λ˜λŠ” κ²ƒμ²˜λŸΌ 단계λ₯Ό λ‚˜λˆ  μž‘μ€ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€κ³ , 그것듀을 κ²°ν•©ν•΄ 쑰금 더 큰 λ‹¨μœ„μ˜ λ·°λ₯Ό λ§Œλ“œλŠ” 방법둠이며, 5개의 κ΅¬λΆ„λœ 단계가 μžˆμŠ΅λ‹ˆλ‹€.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a94cd976-7d0e-4a63-8268-24d9c1adaee7/Untitled.png

좜처: https://brunch.co.kr/@ultra0034/63

| Atoms(μ›μž)

μ›μžλŠ” 물질의 κΈ°λ³Έ ꡬ성 μš”μ†Œλ‘œ, label, input, buttonκ³Ό 같은 HTML tagμž…λ‹ˆλ‹€.

| Molecules(λΆ„μž)

λΆ„μžλŠ” μ›μžλ“€μ΄ ν•¨κ»˜ κ²°ν•©ν•œ 것이며, ν™”ν•©λ¬Όμ˜ κ°€μž₯ μž‘μ€ κΈ°λ³Έλ‹¨μœ„μž…λ‹ˆλ‹€. λΆ„μžλ“€μ€ κ·Έ 자체의 νŠΉμ„±μ΄ μžˆμŠ΅λ‹ˆλ‹€.

| Organisms(유기체)

μœ κΈ°μ²΄λŠ” 비ꡐ적 λ³΅μž‘ν•˜λ©° μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ΅¬λΆ„λœ μ˜μ—­μ„ ν˜•μ„±ν•˜λŠ” μ„œλ‘œ κ²°ν•©λ˜μ–΄ μžˆλŠ” λΆ„μž κ·Έλ£Ήμž…λ‹ˆλ‹€.

| Templates

ν…œν”Œλ¦Ώμ€ 주둜 νŽ˜μ΄μ§€λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•΄ μ„œλ‘œ 묢인 유기체 그룹으둜 κ΅¬μ„±λ˜λ©°, λ””μžμΈ 확인 및 λ ˆμ΄μ•„μ›ƒ λ™μž‘μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

| Pages

νŽ˜μ΄μ§€λŠ” ν…œν”Œλ¦Ώμ˜ νŠΉμ • μΈμŠ€ν„΄μŠ€λ‘œ, μ‚¬μš©μžκ°€ λ³΄λŠ” λ””μžμΈμ„ μ •ν™•ν•˜κ³  ꡬ체적으둜 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

Storybook

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f71b46f2-a5d9-43ee-8a3e-27d213730de9/Storybook.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7f3c8a4a-8852-4d8c-b801-9597e469f341/Untitled.png

Atomic Design / Storybook λ„μž… κ³Όμ •

| FE 디렉터리 ꡬ쑰

λ¦¬μ•‘νŠΈλ₯Ό μ‚¬μš©ν•΄μ„œ 단일 νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(SPA)을 κ΅¬ν˜„ν•˜λŠ”λ°, Atomic Design을 μ μš©ν•΄ 계측 ꡬ쑰λ₯Ό 기반으둜 μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•΄μ„œ atoms - molecules - organisms - templates - pages 둜 FE 디렉터리 ꡬ쑰λ₯Ό μž‘μ•˜μŠ΅λ‹ˆλ‹€.

client
β”œβ”€β”€ env
β”œβ”€β”€ public
β”‚   └── imgs
└── src
    β”œβ”€β”€ common
    β”‚   β”œβ”€β”€ constants
    β”‚   β”œβ”€β”€ socket
    β”‚   β”‚   β”œβ”€β”€ emits
    β”‚   β”‚   └── types
    β”‚   β”œβ”€β”€ store
    β”‚   β”‚   β”œβ”€β”€ actions
    β”‚   β”‚   β”œβ”€β”€ reducers
    β”‚   β”‚   β”œβ”€β”€ sagas
    β”‚   β”‚   └── types
    β”‚   β”œβ”€β”€ theme
    β”‚   └── utils
    β”œβ”€β”€ components
    β”‚   β”œβ”€β”€ atoms
    β”‚   β”œβ”€β”€ molecules
    β”‚   β”œβ”€β”€ organisms
    β”‚   └── templates
    β”œβ”€β”€ pages
    └── shared

| Atomic Design의 각 단계λ₯Ό λ‚˜λˆ„λŠ” 기쀀에 λŒ€ν•œ κ³ λ―Ό

μ²˜μŒμ—λŠ” Atomic Design을 λ„μž…ν–ˆμ„ λ•Œ μ–΄λ–€ 기쀀을 가지고 각 단계λ₯Ό λ‚˜λˆ μ„œ κ΅¬ν˜„ν•΄μ•Ό 할지 κ³ λ―Όν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

νŽ˜μ΄μ§€λ³„λ‘œ ν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈλ“€μ„ λ‚˜λˆ„λŠ” 게 μ’‹κ² λ‹€κ³  νŒλ‹¨μ„ ν•΄μ„œ μ±„νŒ…λ°© νŽ˜μ΄μ§€, 채널 리슀트 νŽ˜μ΄μ§€ λ“± ν™”λ©΄ λ‹¨μœ„λ‘œ μš”κ΅¬μ‚¬ν•­μ„ λ¨Όμ € λ‚˜λˆ„κ³ , κ·Έ μ•ˆμ—μ„œ 채널 검색창과 채널 리슀트 λ“± λ³΄μ΄λŠ” νΌμ§€λ§‰ν•œ λ‹¨μœ„λ‘œ Organismsλ₯Ό μ •ν–ˆμŠ΅λ‹ˆλ‹€.

정해진 Organismsλ₯Ό κ΅¬μ„±ν•˜κ³  μžˆλŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ„ 잘게 λ‚˜λˆ μ„œ Atoms듀을 λ¨Όμ € κ΅¬ν˜„ν•˜κ³ , Atoms듀이 λͺ¨μ—¬μ„œ Moleculesκ°€ 되고, Moleculesκ°€ λͺ¨μ—¬μ„œ Organismsκ°€ λ˜λ„λ‘ 기쀀을 μž‘μ•˜μŠ΅λ‹ˆλ‹€.

| ex) ActiveProfileImg μ»΄ν¬λ„ŒνŠΈκ°€ λ§Œλ“€μ–΄μ§€λŠ” κ³Όμ •

ActiveProfileImg μ»΄ν¬λ„ŒνŠΈλŠ” Side Bar의 DM λͺ©λ‘κ³Ό ν™”λ©΄ 우츑 상단 둜그인된 μ‚¬μš©μžμ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 뢀뢄에 μ‚¬μš©λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.

λ¨Όμ € `atoms`에 κ°€μž₯ κ°„λ‹¨ν•œ ActiveLight μ»΄ν¬λ„ŒνŠΈμ™€ ProfileImg μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
/* client\src\components\atoms\ProfileImg\ProfileImg.tsx */

import React from 'react';
import styled from 'styled-components';
import Logo from '@imgs/logo.png';
import { color } from '@theme/index';

interface ProfileImgProps {
  size?: 'small' | 'medium' | 'large';
  isHover?: boolean;
  src?: string;
}

// μƒλž΅

const ProfileImg: React.FC<ProfileImgProps> = ({ size = 'medium', isHover = false, src = Logo, ...props }) => {
  return (
    <ProfileImgContainter size={size} isHover={isHover} {...props}>
      <Img size={size} isHover={isHover} src={src}></Img>
    </ProfileImgContainter>
  );
};

export { ProfileImg, ProfileImgProps };

κ΅¬ν˜„ν•œ μ»΄ν¬λ„ŒνŠΈμ˜ λ””μžμΈμ„ Storybook을 톡해 μ‰½κ²Œ ν™•μΈν•˜κΈ° μœ„ν•΄ ActiveLight.stories와 ProfileImg.stories μž‘μ„±ν–ˆμœΌλ©°, 이λ₯Ό 톡해 각 μ»΄ν¬λ„ŒνŠΈμ˜ λ””μžμΈμ„ μˆ˜μ •ν•˜λ©΄μ„œ 효율적으둜 κ°œλ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

/* client\src\components\atoms\ProfileImg\ProfileImg.stories.tsx */

import React from 'react';
import { Story, Meta } from '@storybook/react/types-6-0';
import { ProfileImg, ProfileImgProps } from './ProfileImg';

export default {
  title: 'atom/ProfileImg',
  component: ProfileImg
} as Meta;

const Template: Story<ProfileImgProps> = (args) => <ProfileImg {...args} />;

export const LargeProfileImg = Template.bind({});
LargeProfileImg.args = {
  size: 'large'
};

export const MediumProfileImg = Template.bind({});
MediumProfileImg.args = {
  size: 'medium'
};

export const SmallProfileImg = Template.bind({});
SmallProfileImg.args = {
  size: 'small'
};

κ΅¬ν˜„λœ ActiveLight μ»΄ν¬λ„ŒνŠΈμ™€ ProfileImg μ»΄ν¬λ„ŒνŠΈλ₯Ό ν™œμš©ν•΄μ„œ molecules에 ActiveProfileImg μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ ActiveProfileImg.stories을 μž‘μ„±ν•΄ Storybook을 톡해 λ””μžμΈ μˆ˜μ • 및 ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

λŠλ‚€ 점

μ²˜μŒμ—λŠ” Atomic Design의 각 단계λ₯Ό μ–΄λ–€ κΈ°μ€€μœΌλ‘œ λ‚˜λˆ μ•Ό 할지 고민이 λ§Žμ•˜λŠ”λ°, 직접 κ°€μž₯ μž‘μ€ μ»΄ν¬λ„ŒνŠΈλΆ€ν„° μ œμž‘ν•˜κ³ , μ œμž‘λœ μ»΄ν¬λ„ŒνŠΈλ“€μ„ ν•©μ³μ„œ 더 큰 λ·°λ₯Ό κ΅¬μ„±ν•˜λŠ” κ³Όμ •μ—μ„œ 블둝을 μ‘°λ¦½ν•΄λ‚˜κ°€λ“― ν•©μ³κ°€λŠ” 과정이 재미있게 λŠκ»΄μ‘ŒμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, λͺ¨λ‹¬μ°½μ΄λ‚˜ λ²„νŠΌκ³Ό 같이 κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ„ λ§Œλ“€μ–΄ μž¬μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ½”λ“œ 쀑볡을 쀄이고 생산성을 높일 수 μžˆμ—ˆμœΌλ©°, Storybook λ˜ν•œ Atomsλ‚˜ Molecules 같은 μž‘μ€ λ‹¨μœ„μ˜ μ»΄ν¬λ„ŒνŠΈλ“€μ„ μ œμž‘ν•  λ•Œ λ§Žμ€ 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

마치며

Atomic Design을 λ„μž…ν•˜λ©΄μ„œ ν™”λ©΄ μ „μ²΄μ—μ„œλΆ€ν„° μ•„λž˜λ‘œ λ‚΄λ €κ°€λ©° λ””μžμΈμ„ μ„€κ³„ν•˜λ˜ κΈ°μ‘΄ λ°©μ‹κ³ΌλŠ” λ‹€λ₯΄κ²Œ μž‘μ€ μ»΄ν¬λ„ŒνŠΈλΆ€ν„° μ œμž‘ν•¨μœΌλ‘œμ¨ 훨씬 μ²΄κ³„μ μœΌλ‘œ νŽ˜μ΄μ§€λ₯Ό κ΅¬ν˜„ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ Reactκ°€ μ»΄ν¬λ„ŒνŠΈλ₯Ό 기반으둜 ν•˜λ‹€ λ³΄λ‹ˆ Atomic Designκ³Ό 잘 μ–΄μšΈλ¦°λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

ν•œνŽΈμœΌλ‘œ Atomic Design의 각 단계λ₯Ό μ–΄λ–€ κΈ°μ€€μœΌλ‘œ λ‚˜λˆ μ•Ό 할지 κ³ λ―Όν•˜λ©΄μ„œ κΌ­ 5단계가 μ•„λ‹ˆλ”λΌλ„ ν”„λ‘œμ νŠΈμ˜ 규λͺ¨λ‚˜ ν•„μš”μ— λ”°λΌμ„œ 단계λ₯Ό μ€„μ—¬μ„œ μ‚¬μš©ν•΄λ³Ό 수 μžˆμ„ 것 κ°™λ‹€λŠ” 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ κΈ°μ—…μ—μ„œλ„ Atomic Design을 λΆ€λΆ„μ μœΌλ‘œ λ„μž…ν•΄ ν”„λ‘œμ νŠΈμ— 맞게 μ „λž΅μ μœΌλ‘œ 단계λ₯Ό λ‚˜λˆ„λŠ” κ²½μš°κ°€ μžˆλ‹€κ³  λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

Atomic Design의 μž₯점을 μ΅œλŒ€ν•œμœΌλ‘œ κ°€μ Έκ°€κΈ° μœ„ν•΄ μ–΄λ–»κ²Œ ν•˜λ©΄ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€ 수 μžˆμ„μ§€, λ‹¨κ³„λŠ” μ–΄λ–»κ²Œ λ‚˜λˆ μ•Ό 할지 κ³ λ―Όν•  수 μžˆμ—ˆλ˜ 쒋은 μ‹œκ°„μ΄μ—ˆμœΌλ©°, μ•žμœΌλ‘œ Atomic Design을 μ μš©ν•΄μ•Ό ν•  일이 μžˆλ‹€λ©΄ 이번 ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ©΄μ„œ 느꼈던 고민이 λ§Žμ€ 도움이 되리라 μƒκ°λ©λ‹ˆλ‹€.

⚠️ **GitHub.com Fallback** ⚠️