쉽게 말하면 원자(Atom) 단위만큼 중복되기 시작하는 가장 작은 요소부터 component화 해서 작업하는 디자인 시스템을 일컫는 말이다.
form
의 label
, input
, button
같이 각 개별적으로는 유용하지 않지만 form
으로 구성되면 실제로 기능을 할 수 있는 형태를 지칭한다.Atomic Design에서 중요한 점은 "재사용 가능할 것".
그렇기에 모든 컴포넌트는 내용 자체는 비어있어야 한다.
아톰의 대표적인 예인 버튼 컴포넌트를 만들어보았다.
atom은 단순히 내용이 빈 component를 만들어내는 작업이기에 간단했다!
import React from 'react';
import styled from 'styled-components';
const Button = ({ event, color, btnContent, btnClass }) => {
const StyledButton = styled.button`
padding: 5px 15px;
border: 5px solid ${props => props.theme[color]};
border-radius: 15px;
background-color: ${props => props.theme.white};
font-size: 20px;
font-weight: 700;
color: ${props => props.theme[color]};
transition: all 100ms ease-in-out;
&:hover {
background-color: ${props => props.theme[color]};
color: ${props => props.theme.white};
cursor: pointer;
}
&.active {
background-color: ${props => props.theme[color]};
color: ${props => props.theme.white};
}
`;
return (
<StyledButton type="button" onClick={event} className={btnClass}>
{btnContent}
</StyledButton>
);
};
export default Button;
카드 컴포넌트를 molecule로 하나 만들어보았다.
molecule, organism 등 상위요소들이 template에서 어떤 요소들로 구성되어있는지 보게 하는게 좋을 것 같아서, children으로 하부 요소들을 받아와서 레이아웃을 구성하도록 작업했다.
그렇기에, 어떤 것들을 받아올 것인지 두루뭉술하게 작성하였고, 레이아웃 위주로 작업하였다.
import React from 'react';
import Image from '../atoms/Image';
import styled from 'styled-components';
const Card = ({ src, alt, children }) => {
return (
<StyledCard>
<Image src={src} alt={alt} />
<TitleWrapper>{children}</TitleWrapper>
</StyledCard>
);
};
export default Card;
const StyledCard = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border: 5px solid ${props => props.theme.primary};
border-radius: 15px;
`;
const TitleWrapper = styled.div`
width: 100%;
padding: 15px;
border-top: 5px solid ${props => props.theme.primary};
text-align: center;
`;
organism도 재사용이 가능해야되기 때문에 비즈니스 로직을 구현하지는 않았다.
레이아웃 구성 요소들을 grouping하는 느낌으로 작업했다.
organism또한 재사용이 가능해야되기 때문에 atom의 서식들은 여기서 선언하지 않았다.
(위의 예시들과 프로젝트가 달라서, 예시는 생략...^^)
최종적인 레이아웃을 이곳에서 마무리하였고, 이 곳에서 최종적으로 비즈니스 로직을 작업하였다.
탬플릿부터는 재사용성이 떨어진다. 단 하나의 화면을 위해서만 어떤 구성이 될지 설정하는 곳이기에 버튼, 타이틀 서식, 클릭이벤트 등 비즈니스 로직 처리를 이곳에서 작업했다.
최종적으로 콘텐츠의 내용을 채워주는 역할을 하였다.
타이틀의 내용,이미지 url 주소 등을 이곳에서 처리하였다.
초기 작업은 아무래도 좀 오래걸리는 편이였다.
처음에 공통 요소를 잘 잡아도, 중간 중간에 수정해줘야하는 일이 많아서 조금 손이 초반에 많이 가는 느낌이었다.
하지만, atom만 잘 정리되면, molecules, organism 작업은 속도가 확확 붙기에 후반부로 갈 수록 작업 속도가 빨라졌다.
또, 처음엔 만들기 힘들더라도 이를 활용하여 나중에 다른 탬플릿을 만들어낼 수 있다는 확장성이 매력적으로 느껴졌다.
나중에, 페이지를 리뉴얼할 때 보다 손쉽게 가능할 것 같은 느낌..(아무래도 page나 template만 건드리면 되기에..부수적인 ui를 건들지 않아도 되는 점이 좋았다)
가 매우 좋을 것 같다.
storybook으로 ui테스트를 손쉽게 할 수 있기에 이를 활용하여 atom을 구현하면 보다 속도도 빨라지고, 작업도 쉬울 것 같다는 생각이 들었다.
나중에 시간적 기회가 생긴다면, storybook과 atomic design을 연계해서 작업을 하면 좋을 것 같다.
(아무래도 ui documentation 하기도 좋고..😁)