디자인 시스템은 대형 기업만을 위한 것이 아닙니다. 소규모 팀에서도 잘 구축된 디자인 시스템은 의사결정 비용을 줄이고 일관성을 유지하는 강력한 도구가 됩니다. 이 글에서는 디자인 시스템이 없을 때 실제로 어떤 문제가 생기는지, 그리고 작은 팀에서도 실용적으로 구축할 수 있는 방법을 단계별로 설명합니다.
디자인 시스템이 없을 때 발생하는 문제
디자인 시스템이 없는 팀이 겪는 문제는 생각보다 구체적이고 빈번합니다.
일관성 붕괴: 버튼 색상이 페이지마다 미묘하게 다르고, 폰트 크기가 컴포넌트마다 제각각입니다. 개발자 A가 만든 카드 컴포넌트와 개발자 B가 만든 카드 컴포넌트는 스타일이 달라 하나의 화면에 동시에 쓸 수 없습니다. 이런 불일치를 QA 단계에서 발견하면 수정 비용이 발생하고, 출시 후 발견되면 사용자 경험이 훼손됩니다.
중복 개발: 디자인 시스템이 없으면 각 팀원이 비슷한 컴포넌트를 독립적으로 만들게 됩니다. 프로젝트가 3개라면 버튼 컴포넌트도 3개가 생깁니다. 하나에서 버그를 수정해도 나머지 두 개는 그대로입니다.
의사결정 피로: "이 버튼 컬러는 뭘로 써야 해?", "이 간격 맞아?" 같은 질문이 반복됩니다. 디자인 결정을 매번 새로 해야 하므로 팀원 모두의 인지 자원이 낭비됩니다.
온보딩 지연: 신규 팀원이 합류했을 때 어떻게 UI를 만들어야 하는지 배우는 데 수주가 걸립니다. 문서화된 기준이 없으니 기존 코드를 보고 유추하거나, 선임에게 반복적으로 물어봐야 합니다.
실제 사례로, 5명 규모의 스타트업에서 디자인 시스템을 구축한 후 새 기능 개발 시간이 40% 단축되었다는 사례가 있습니다. 버튼 하나 만드는 데 논의하던 시간이 사라졌기 때문입니다.
디자인 토큰 설계 방법
디자인 토큰은 디자인 시스템의 가장 작은 단위입니다. 색상, 타이포그래피, 스페이싱, 그림자 등의 값을 변수로 정의해두면 전체 시스템에서 일관되게 사용할 수 있습니다.
색상 토큰
색상은 두 단계로 나눠 정의하는 것이 좋습니다. 먼저 원시 색상(Primitive Colors)을 정의하고, 그 위에 의미 기반 색상(Semantic Colors)을 올립니다.
/* 원시 색상: 팔레트 */
:root {
--color-blue-50: #eff6ff;
--color-blue-500: #3b82f6;
--color-blue-900: #1e3a5f;
--color-red-500: #ef4444;
--color-gray-100: #f3f4f6;
--color-gray-900: #111827;
}
/* 의미 기반 색상: 역할 부여 */
:root {
--color-primary: var(--color-blue-500);
--color-danger: var(--color-red-500);
--color-background: var(--color-gray-100);
--color-text: var(--color-gray-900);
--color-text-muted: #6b7280;
}
이렇게 나누면 나중에 다크 모드를 지원할 때 의미 기반 색상만 교체하면 됩니다.
타이포그래피 토큰
폰트 크기, 줄 높이, 자간을 체계적으로 정의합니다. 4px 또는 8px 기반의 스케일을 사용하면 일관성을 유지하기 쉽습니다.
:root {
--font-size-xs: 0.75rem; /* 12px */
--font-size-sm: 0.875rem; /* 14px */
--font-size-base: 1rem; /* 16px */
--font-size-lg: 1.125rem; /* 18px */
--font-size-xl: 1.25rem; /* 20px */
--font-size-2xl: 1.5rem; /* 24px */
--font-size-3xl: 1.875rem; /* 30px */
--line-height-tight: 1.25;
--line-height-base: 1.5;
--line-height-relaxed: 1.75;
--font-weight-normal: 400;
--font-weight-medium: 500;
--font-weight-bold: 700;
}
스페이싱 토큰
마진, 패딩, 간격에 사용하는 스페이싱도 미리 정의해두면 "이 간격 맞아?"라는 논의가 사라집니다.
:root {
--spacing-1: 4px;
--spacing-2: 8px;
--spacing-3: 12px;
--spacing-4: 16px;
--spacing-6: 24px;
--spacing-8: 32px;
--spacing-12: 48px;
--spacing-16: 64px;
}
Atomic Design 패턴
Atomic Design은 Brad Frost가 제안한 UI 컴포넌트 분류 체계로, 화학의 원자-분자 개념을 UI에 적용한 것입니다.
Atoms(원자): 더 이상 분해할 수 없는 가장 기본 단위입니다. 버튼, 인풋, 레이블, 아이콘, 뱃지 등이 해당합니다. 각각의 Atom은 디자인 토큰을 사용하고 독립적으로 작동합니다.
Molecules(분자): 2개 이상의 Atom이 결합된 컴포넌트입니다. 예를 들어 레이블 + 인풋 + 에러 메시지가 결합된 FormField, 아이콘 + 텍스트가 결합된 IconButton이 여기에 해당합니다.
Organisms(유기체): Molecules와 Atoms가 모여 의미 있는 UI 섹션을 이룹니다. 헤더 내비게이션 바, 상품 카드 목록, 회원가입 폼 전체가 Organism입니다.
Templates: 페이지 레이아웃의 뼈대입니다. 실제 콘텐츠 없이 구조만 존재합니다.
Pages: 실제 콘텐츠가 채워진 최종 결과물입니다.
작은 팀에서는 Atoms, Molecules, Organisms 세 단계만 명확히 나눠도 충분합니다.
Storybook 활용법
Storybook은 UI 컴포넌트를 독립적으로 개발하고 문서화하는 도구입니다. 실제 서비스 화면 없이도 컴포넌트를 개별적으로 확인하고 테스트할 수 있습니다.
가장 큰 장점은 "살아있는 문서"를 만들 수 있다는 것입니다. 코드와 문서가 동기화되므로 문서가 낡아서 쓸모없어지는 문제가 없습니다. 또한 각 컴포넌트의 다양한 상태(기본, 비활성화, 로딩, 에러)를 한눈에 확인할 수 있어 QA 효율도 높아집니다.
설치 후 Button 컴포넌트를 스토리로 작성하는 예시입니다.
// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
const meta: Meta<typeof Button> = {
title: 'Atoms/Button',
component: Button,
};
export default meta;
type Story = StoryObj<typeof Button>;
export const Primary: Story = {
args: { variant: 'primary', children: '저장하기' },
};
export const Disabled: Story = {
args: { variant: 'primary', children: '저장하기', disabled: true },
};
작은 팀에서 시작하는 최소 디자인 시스템
모든 것을 한 번에 만들려 하면 시작조차 못합니다. 다음 순서로 점진적으로 구축하세요.
- CSS 변수로 토큰 정의 (색상 5개, 폰트 4개, 스페이싱 6개로 시작)
- Button 컴포넌트 (variant: primary, secondary, ghost)
- Input 컴포넌트 (기본, 에러, 비활성화 상태)
- Typography 컴포넌트 (h1~h4, p, small, caption)
- Card 컴포넌트 (콘텐츠를 담는 기본 컨테이너)
- Modal/Dialog 컴포넌트
이 6가지만 있어도 대부분의 서비스 UI를 일관성 있게 만들 수 있습니다.
Style Dictionary 도구 소개
Style Dictionary는 Amazon이 오픈소스로 공개한 디자인 토큰 관리 도구입니다. JSON으로 토큰을 한 번 정의하면 CSS 변수, iOS Swift 코드, Android XML 등 다양한 플랫폼용 코드로 자동 변환해줍니다.
{
"color": {
"primary": { "value": "#3b82f6" },
"danger": { "value": "#ef4444" }
},
"spacing": {
"md": { "value": "16px" }
}
}
이 JSON 파일 하나로 웹, iOS, Android 모두 동일한 토큰 값을 사용하게 됩니다. 디자이너가 Figma에서 토큰을 수정하면 Token Studio 플러그인을 통해 이 JSON이 업데이트되고, CI/CD 파이프라인에서 자동으로 각 플랫폼용 코드가 생성되는 워크플로우도 구성할 수 있습니다.
흔한 실수
너무 완벽하게 시작하려는 것: MVP로 시작해 점진적으로 발전시키세요. 처음부터 300개의 컴포넌트를 만들려다 지쳐서 포기하는 팀이 많습니다. 10개로 시작하세요.
코드와 디자인의 불일치: Figma의 색상과 코드의 CSS 변수가 달라지면 시스템의 신뢰성이 떨어집니다. Style Dictionary나 Figma Tokens 플러그인으로 동기화 워크플로우를 구축하세요.
유지보수 담당자 부재: 시스템을 책임질 사람이 없으면 빠르게 방치됩니다. 작은 팀이라도 한 명은 "디자인 시스템 오너" 역할을 맡아야 합니다.
디자인 시스템은 초기 투자가 필요하지만, 일단 자리잡으면 팀 전체의 속도와 품질이 눈에 띄게 올라갑니다. 오늘 CSS 변수 10개를 정의하는 것부터 시작해 보세요.