[FE] Atomic 디자인 패턴 테크 스펙 - 100-hours-a-week/20-real-wiki GitHub Wiki
요약
프로젝트 전반의 컴포넌트 일관성과 재사용성을 높이기 위해 Atomic 디자인 패턴을 도입합니다.
프론트엔드 개발자 전원이 공통된 컴포넌트 설계 기준을 따르며, 유지보수성과 확장성을 향상시킵니다.
배경
컴포넌트 설계 시 명확한 기준이 없습니다. 페이지마다 각자의 기준으로 컴포넌트를 나누어,
- 컴포넌트 책임이 과도하게 커지고
- 재사용과 확장이 어렵고
- 테스트 및 문서화가 어렵습니다.
Atomic 디자인 패턴을 도입해 컴포넌트를 계층적으로 관리함으로써 위 문제를 해결하고자 합니다.
목표
- 프로젝트 전반에 Atomic Design 패턴을 적용한다.
- 컴포넌트 재사용성을 높이고 중복 구현을 줄인다.
- 컴포넌트 책임을 명확히 분리하여 유지보수를 용이하게 한다.
- Storybook에 책임 단위로 컴포넌트/페이지를 문서화한다.
- 신규 개발 시 모든 컴포넌트는 Atomic 기준에 맞게 설계한다.
설계 및 기술 자료
1. 개요
Atomic Design은 UI 설계 방법론으로, 다음과 같은 5단계로 컴포넌트를 구분합니다.
Atom
(원자)- 더 이상 분해할 수 없는 가장 작은 단위의 컴포넌트
- ex) Button, Input, Icon, Label
Molecule
(분자)- 두 개 이상의 Atom이 결합된 컴포넌트
- ex) InputField (Label + Input + Validation Message)
Organism
(유기체)- 여러 Molecule과 Atom이 결합된 복합 컴포넌트
- UI에서 별개의 영역으로 나눌 수 있어야 함
- ex) Header, Sidebar, FormSection
Template
(템플릿)- 페이지 레이아웃과 구조를 정의하지만 실제 데이터는 포함하지 않음
- ex) AuthPageTemplate, DashboardTemplate
Page
(페이지)- Template에 실제 데이터를 주입하여 렌더링하는 완성된 화면
- ex) LoginPage, DashboardPage
2. 설계 규칙
- 디자인 시스템 컴포넌트 개발 시
- 재사용성을 높이기 위해 마진, 패딩 등의 레이아웃 스타일은 컴포넌트 내부에 정의하지 않고 외부에서 주입받도록 한다.
Molecule
과Organism
구분 기준- 컨텍스트 또는 상태 관리가 필요한 경우 →
Organism
- 컨텍스트 없이 UI적인 요소로 SRP를 지킬 수 있고, 재사용이 쉬운 경우 →
Molecule
- 판단이 애매할 경우 우선 원하는 방향으로 구현하고, 추후 사용처와 역할에 따라 레이어를 재조정한다.
- 컨텍스트 또는 상태 관리가 필요한 경우 →
- 디자인적으로 약간 다른
Organism
이 있는 경우- 중복 컴포넌트, Props의 수정은 확장에 유연하지 않다.
- 이 경우
Compound Component
를 사용하여 유연하게 대응한다.
Template
사용 여부Template
은 우선 사용을 보류한다.- SSR 환경에서 인터랙션 처리를 위해 내부에 Client Component를 포함하게 되면,
Organism
단에서 API 호출과 상태 관리가 발생하게 된다. - 이 경우
Template
은 뷰 조립만 담당하고 책임을 가지지 않게 되어,Template
계층의 의미가 희석된다.
3. 폴더 구조 예시
src/
├── features/
│ ├── Post/
│ │ ├── atoms/
│ │ │ └── Tag.tsx
│ │ ├── molecules/
│ │ │ └── PostHeader.tsx
│ │ ├── organisms/
│ │ │ └── PostDetail.tsx
│ │ └── pages/
│ │ └── PostDetailPage.tsx
│ └── Chatbot/
│ ├── atoms/
│ │ └── MessageBubble.tsx
│ ├── molecules/
│ │ └── ChatInput.tsx
│ ├── organisms/
│ │ └── ChatScreen.tsx
│ └── pages/
│ └── ChatPage.tsx
├── commponents/
│ ├── atoms/
│ │ └── Badge.tsx
│ ├── molecules/
│ │ └── HeadlineBannerItem.tsx
│ ├── organisms/
└ └── └── HeadlineBanner.tsx
4. 기존 컴포넌트를 Atomic 디자인 패턴으로 리팩토링
💡 빨간 테두리는 Organism, 파란 테두리는 Molecule을 의미
- 챗봇 페이지
- 공지 리스트
- 뉴스 리스트
- 게시글 상세