테마 선택

📚 지식 노트

AI·하드웨어·주변기기·게임·컴퓨터 시스템·이론 컴퓨터 과학·수학·개발과 운영·보안·응용 분야에 대해 알아 두면 좋은 내용을 정리한 노트다. 위에서 분야를 고르고 아래에서 노트를 고른다.

디자인 시스템

같은 결정을 매번 다시 하지 않도록 토큰·컴포넌트·규칙을 모아 두는 법이다.

목차 (13)
  1. 왜 디자인 시스템인가
  2. 무엇으로 이루어지나: 원칙, 토큰, 컴포넌트, 패턴, 문서
  3. 디자인 토큰 세 단계: 원시, 의미, 컴포넌트
  4. 테마와 다크 모드를 토큰으로
  5. 컴포넌트 API: 변형, 크기, 상태, 슬롯
  6. 아토믹 디자인: 작은 것을 조합해 큰 것을
  7. 피그마 컴포넌트·변수와 코드 동기화
  8. 문서와 사용 지침: Do와 Don't
  9. 버전 관리와 기여 모델
  10. 널리 알려진 디자인 시스템
  11. 흔한 실패
  12. 흔한 오해
  13. 핵심 자료

왜 디자인 시스템인가

제품이 커지면 같은 결정을 여러 사람이 여러 번 한다. 버튼 모서리를 몇 픽셀로 둘지, 오류 문구를 무슨 색으로 쓸지, 대화상자의 확인 버튼을 왼쪽에 둘지 오른쪽에 둘지. 팀마다 따로 정하면 화면은 조금씩 어긋나고, 사용자는 같은 동작을 화면마다 다시 배워야 한다. 고칠 때도 같은 것을 여러 곳에서 찾아 고쳐야 하고, 하나를 빠뜨리면 어긋남은 더 커진다.

디자인 시스템(design system)은 이런 결정을 한 번 내려 모아 두고, 디자인 파일과 코드가 같은 것을 가져다 쓰게 하는 장치다. 목표는 예쁜 화면 하나가 아니라 일관성(같은 것은 같게), 속도(이미 정한 것은 다시 정하지 않음), 품질의 바닥(접근성·상태 처리가 기본으로 들어감)이다. 이 사이트도 같은 이유로 버튼·안내 문구 스타일을 공용 시트 한 곳에 모았다. 페이지마다 복제한 스타일이 버튼 여백을 조금씩 어긋나게 만든 일이 있었기 때문이다.

왼쪽은 네 팀이 따로 만든 버튼이 모서리와 문구가 제각각이고, 오른쪽은 한 버튼 컴포넌트를 네 화면이 함께 써서 모양이 같다시스템 없이: 팀마다 따로시스템과 함께: 한 곳에서팀 A확인모서리 0팀 B저장모서리 7팀 COK영문팀 D제출회색Button 컴포넌트저장같은 토큰저장같은 토큰저장같은 토큰저장같은 토큰고칠 때마다 네 곳을 따로 찾아 고친다컴포넌트 한 곳을 고치면 모두 바뀐다
시스템이 없으면 팀마다 만든 버튼이 모서리·색·문구까지 갈라진다. 한 컴포넌트를 함께 쓰면 고칠 곳이 하나로 모인다.

무엇으로 이루어지나: 원칙, 토큰, 컴포넌트, 패턴, 문서

디자인 시스템을 컴포넌트 라이브러리와 같은 말로 쓰는 경우가 많지만, 라이브러리는 한 층일 뿐이다. 보통 다음 다섯 가지를 함께 갖춘다.

  • 원칙: "분명하게", "빠르게"처럼 둘 중 하나를 골라야 할 때의 기준이다. 문서에 없는 상황에서 판단을 맞춘다.
  • 토큰: 색·간격·글꼴·모서리·그림자·움직임 같은 값에 붙인 이름이다. 디자인 파일과 코드가 같은 이름을 쓴다.
  • 컴포넌트: 버튼·입력·대화상자처럼 반복되는 부품이다. 디자인 도구의 컴포넌트와 코드 컴포넌트가 짝을 이룬다.
  • 패턴: 로그인, 빈 화면, 오류 처리처럼 컴포넌트를 엮어 한 가지 문제를 푸는 방식이다. 부품보다 크고 페이지보다 작다.
  • 문서: 언제 쓰고 언제 쓰지 않는지, 접근성 메모, 코드 예시다. 문서가 없으면 부품은 있어도 쓰는 법이 사람마다 갈린다.
아래에서 위로 원칙, 토큰, 컴포넌트, 패턴 네 층이 쌓이고, 오른쪽의 문서 기둥이 네 층을 모두 설명한다패턴로그인, 빈 화면, 오류 처리, 검색 결과컴포넌트버튼, 입력, 대화상자, 탭 (디자인 + 코드)토큰색, 간격, 글꼴, 모서리, 그림자, 움직임 값원칙"분명하게", "빠르게"처럼 고를 때의 기준문서언제 쓰나Do / Don't접근성 메모코드 예시왼쪽 화살표: 위로 갈수록 구체적이고, 아래 층을 조합해 만든다강조한 두 층이 디자인 파일과 코드가 함께 갖는 부분이다
원칙 위에 토큰, 그 위에 컴포넌트와 패턴이 쌓이고 문서가 네 층을 설명한다. 토큰과 컴포넌트는 디자인 파일과 코드 양쪽에 같은 모습으로 있어야 한다.

디자인 토큰 세 단계: 원시, 의미, 컴포넌트

디자인 토큰(design token)은 값에 이름을 붙인 것이다. #4263eb를 코드 곳곳에 적는 대신 이름을 쓰면, 값을 바꿀 때 이름이 가리키는 곳 하나만 고치면 된다. 핵심은 이름을 층으로 나누는 것이다.

  • 원시 토큰(primitive): color.blue.500처럼 값 자체에 붙인 이름. 팔레트다. 어디에 쓰는지는 말하지 않는다.
  • 의미 토큰(semantic): color.action.primary처럼 역할에 붙인 이름. 원시 토큰을 가리킨다. 화면을 만드는 사람이 주로 고르는 층이다.
  • 컴포넌트 토큰(component): button.primary.fill처럼 부품의 한 자리에 붙인 이름. 의미 토큰을 가리킨다. 그 부품만 따로 바꿀 여지를 준다.

이렇게 이어 두면 바꿀 일이 생겼을 때 고칠 층이 정해진다. 브랜드 색을 바꾸면 원시 토큰, 다크 테마는 의미 토큰이 무엇을 가리키는지, 버튼만의 예외는 컴포넌트 토큰을 고친다. 아래 예에서 같은 파랑을 쓰는 자리 3곳에 값을 직접 적었다면 3곳을 고쳐야 하지만, 토큰을 거치면 원시 토큰 1줄만 고친다.

원시, 의미, 컴포넌트 세 열의 토큰이 별칭 화살표로 이어지고, 다크 테마에서는 의미 토큰의 화살표 하나만 다른 원시 토큰으로 옮겨 간다원시 토큰값 그 자체의미 토큰무엇에 쓰나컴포넌트 토큰어느 자리에color.blue.500#4263ebcolor.blue.300#6c8cffcolor.red.600#c92a2acolor.action.primary{color.blue.500}color.feedback.danger{color.red.600}button.primary.fill{color.action.primary}button.danger.fill{color.feedback.danger}button.primary.fill = #4263eb (라이트)button.primary.fill = #6c8cff (다크, 컴포넌트 토큰은 그대로)
1 / 5

원시 토큰: 팔레트의 값 하나하나에 이름을 붙인다. 이름은 값을 말할 뿐(파랑 500) 어디에 쓰는지는 말하지 않는다.

디자인 토큰의 세 단계. 아래 단계일수록 값에 가깝고, 위 단계일수록 쓰는 자리에 가깝다. 별칭으로 이어 두면 테마나 브랜드를 바꿀 때 고칠 줄이 한 층에 모인다.

토큰을 파일로 주고받는 형식은 W3C 디자인 토큰 커뮤니티 그룹(DTCG)이 Design Tokens Format Module로 정리하고 있다. $value가 있는 객체가 토큰이고, $type은 생략하면 가장 가까운 부모 그룹의 것을 물려받으며, 다른 토큰은 중괄호 이름으로 가리킨다. 별칭이 별칭을 가리키는 사슬은 되지만 돌고 도는 참조는 오류다. W3C 표준이 아니라 커뮤니티 그룹 보고서라는 점은 알고 쓴다.

{
  "color": {
    "$type": "color",
    "blue": { "500": { "$value": "#4263eb" } },
    "action": {
      "primary": { "$value": "{color.blue.500}", "$description": "주 행동(저장, 보내기)" }
    }
  },
  "button": {
    "primary": { "fill": { "$type": "color", "$value": "{color.action.primary}" } }
  }
}

테마와 다크 모드를 토큰으로

다크 모드는 색을 뒤집는 일이 아니라 의미 토큰이 가리키는 값을 테마마다 다시 고르는 일이다. 컴포넌트는 --accent 같은 이름만 쓰고, 테마는 그 이름에 다른 값을 넣는다. 이 사이트가 그렇게 한다. 레이아웃이 :root에 --bg·--text·--accent 같은 CSS 변수를 다크 값으로 두고, 라이트 테마를 고르거나 운영체제가 라이트일 때 같은 이름에 라이트 값을 넣는다. 페이지 스타일은 색을 직접 적지 않고 이 변수만 쓴다. 웹 쪽 원리는 웹 개발 노트에 있다.

값을 다시 고를 때는 대비를 다시 잰다. 같은 강조색이라도 배경이 바뀌면 읽히는 정도가 달라진다. 이 사이트의 라이트 강조색 #4263eb를 다크 배경에 그대로 쓰면 대비가 3.79:1로 본문 글자 기준 4.5:1에 못 미친다. 그래서 다크 테마는 더 밝은 #6c8cff를 가리킨다. 기준은 WCAG 1.4.3이고(큰 글자는 3:1), 기준값은 반올림하지 않아 4.499:1은 미달이다. 대비를 고르는 법은 시각 디자인 글에 있다.

라이트와 다크 두 칸에서 같은 이름의 글자 토큰이 다른 색을 가리키고 대비 비율이 모두 4.5:1을 넘는다. 아래 줄은 상대 테마의 강조색을 그대로 옮겼을 때 미달인 비율이다라이트--bg #f5f6f8Aa 가--text#1c233314.52:1 통과Aa 가--text-dim#5b62705.67:1 통과Aa 가--accent#4263eb4.61:1 통과Aa 가#6c8cff 그대로상대 테마의 강조색2.84:1 미달다크--bg #0f1117Aa 가--text#e8eaf015.69:1 통과Aa 가--text-dim#9aa1b27.29:1 통과Aa 가--accent#6c8cff6.14:1 통과Aa 가#4263eb 그대로상대 테마의 강조색3.79:1 미달
이 사이트의 글자 토큰을 두 테마의 배경 위에서 잰 대비. 모두 4.5:1을 넘고(가장 낮은 것은 라이트 강조색 4.61:1, 다크의 흐린 글자는 7.29:1), 상대 테마의 강조색을 그대로 옮기면 미달이다.

변수만으로 다루기 번거로운 한두 색은 CSS light-dark()로 적는다. 두 값을 받아 지금 색 구성이 라이트면 앞의 것, 다크면 뒤의 것을 쓴다. color-scheme이 light dark여야 동작하고, 2024년 5월부터 주요 브라우저가 모두 지원한다(Baseline 2024). 이 사이트 규칙도 "색은 변수로, 변수로 안 되는 테마별 색은 light-dark()로"다.

/* 이 사이트의 방식: 의미 토큰 이름은 하나, 테마마다 값만 바꾼다 */
:root { color-scheme: dark; --text: #e8eaf0; --accent: #6c8cff; }
:root[data-theme='light'] { color-scheme: light; --text: #1c2333; --accent: #4263eb; }

/* light-dark(): color-scheme이 light dark일 때 한 줄로 두 값을 적는다 */
:root { color-scheme: light dark; }
.badge { background: light-dark(#eef1fd, #1e2440); }

/* 컴포넌트는 값이 아니라 이름만 쓴다 */
.button-primary { background: var(--accent); color: var(--bg); }

컴포넌트 API: 변형, 크기, 상태, 슬롯

컴포넌트는 그림이 아니라 약속이다. 무엇을 바꿀 수 있고 무엇은 못 바꾸는지가 API로 드러나야 한다. 버튼이라면 보통 네 가지 축을 둔다.

  • 변형(variant): primary·secondary·ghost·danger처럼 강조 정도와 의미. 이름은 모양("파란 버튼")이 아니라 역할로 짓는다. 테마가 바뀌어도 이름이 틀리지 않는다.
  • 크기(size): sm·md·lg. 크기마다 글자·여백·최소 터치 크기가 토큰으로 정해진다.
  • 상태(state): 기본·호버·포커스·누름·비활성·로딩. 사용자가 고르는 값이 아니라 상호작용이 만드는 값이라, 코드에서는 대개 속성이 아니라 브라우저 상태(:hover, :focus-visible)와 disabled·loading 같은 몇 가지 불리언으로 표현한다. 상태별 설계는 인터랙션과 상태 글에 있다.
  • 슬롯(slot): 레이블, 앞·뒤 아이콘처럼 내용을 끼워 넣는 자리. 아무 것이나 넣게 하면 일관성이 깨지고, 너무 막으면 팀이 복제해 버린다. 자리마다 넣을 수 있는 것을 정한다.

축을 늘리면 조합은 곱으로 늘어난다. 변형 4 × 크기 3 × 상태 6이면 72가지이고, 앞·뒤 아이콘을 켜고 끄는 불리언 둘을 더하면 288가지다. 디자인 도구에 이 표를 모두 그려 두면 관리가 어렵다. 그래서 아이콘처럼 조합과 상관없는 것은 슬롯으로 빼고, 축은 정말 다른 모습이 필요한 것만 남긴다.

왼쪽은 버튼을 컨테이너, 앞뒤 아이콘 슬롯, 레이블, 포커스 링으로 나눈 해부도이고, 오른쪽은 변형·크기·상태 속성의 조합 수, 아래는 상태 여섯 가지의 모습이다버튼의 해부포커스 링저장하기앞 아이콘 슬롯레이블뒤 아이콘 슬롯바탕 사각형이 컨테이너속성과 조합 수variant4가지primary · secondary · ghost · dangersize3가지sm · md · lgstate6가지default · hover · focus …조합 4 × 3 × 6 = 72칸아이콘 켜기·끄기 둘을 더하면 288칸속성을 늘리면 곱으로 커진다저장default저장hover저장focus저장pressed저장disabledloading
버튼의 해부와 속성. 속성 하나를 더할 때마다 조합 수가 곱으로 커지므로, 축은 꼭 필요한 것만 둔다. 아래 줄은 상태 여섯 가지의 모습이다.
<Button
  variant="primary"
  size="md"
  loading={saving}
  iconStart={<SaveIcon />}
>
  저장하기
</Button>

아토믹 디자인: 작은 것을 조합해 큰 것을

브래드 프로스트(Brad Frost)의 아토믹 디자인은 인터페이스를 화학에 빗대 다섯 단계로 나눈다. 더 쪼개면 기능을 잃는 원자(레이블·입력·버튼), 원자 몇 개가 한 단위로 일하는 분자(검색 폼), 분자와 원자로 된 화면의 한 구역인 유기체(머리글), 부품을 배치해 내용의 구조를 보여 주는 템플릿, 템플릿에 실제 내용을 채운 페이지다.

쓸모는 이름보다 방향에 있다. 페이지를 통째로 그리지 않고 부품에서 출발해 조립하면 같은 부품이 여러 화면에 다시 쓰인다. 템플릿과 페이지를 나눠 보는 것도 중요하다. 빈 자리로는 멀쩡하던 카드가 긴 상품명이나 빈 이미지 같은 실제 내용에서 깨지는 일이 많기 때문이다. 다만 "이것이 분자인가 유기체인가"를 두고 오래 논쟁할 필요는 없다. 많은 팀이 단계 이름 대신 "기본 부품", "조합 부품", "패턴" 정도로 단순하게 나눈다.

원자, 분자, 유기체, 템플릿, 페이지 다섯 칸이 왼쪽에서 오른쪽으로 이어지고, 칸마다 앞 칸의 것을 조합한 그림이 들어 있다작은 것을 조합해 큰 것을 만든다 →원자atoms레이블·입력·버튼분자molecules검색 폼유기체organisms사이트 머리글템플릿templates빈 자리 배치페이지pages실제 내용을 채움검색어가을 신상품
아토믹 디자인의 다섯 단계. 템플릿은 빈 자리의 배치, 페이지는 실제 내용을 넣어 보는 단계다. 실제 내용에서 깨지는 곳을 찾는 것이 페이지 단계의 일이다.

피그마 컴포넌트·변수와 코드 동기화

디자인 시스템이 흔히 무너지는 곳이 디자인 파일과 코드의 틈이다. 피그마의 버튼과 코드의 버튼이 따로 고쳐지면 둘은 곧 다른 것이 된다. 그래서 원본을 한 곳에 두고 나머지는 거기서 만든다. 토큰이라면 그 한 곳은 대개 저장소의 토큰 파일이다.

피그마에서는 변수(variables)가 토큰 역할을 한다. 색·숫자 같은 값을 변수로 만들어 컬렉션으로 묶고, 한 변수에 라이트·다크 같은 모드별 값을 둔다. 변수가 다른 변수를 가리킬 수 있어 의미 토큰도 만든다. 팀 라이브러리로 변수를 공유하는 것은 유료·교육용 요금제의 기능이다. 이 변수를 플러그인이나 스크립트로 토큰 파일로 내보내고, Style Dictionary 같은 변환 도구가 같은 파일에서 CSS·자바스크립트·iOS·안드로이드 형식을 만든다.

피그마 변수, 토큰 JSON, 리뷰, 변환 도구, CSS·iOS·안드로이드 출력, 앱과 컴포넌트가 화살표로 차례로 이어진다디자인 쪽코드 쪽피그마 변수컬렉션: color모드: 라이트 · 다크tokens.json"$value":"{color.blue.500}"리뷰(풀 리퀘스트)- #4263eb+ #3b5bdb변환 도구예: Style Dictionary형식마다 한 번씩앱과 컴포넌트패키지 새 버전이름만 참조한다CSS 변수iOSAndroid
1 / 5

디자이너가 피그마 변수로 색·간격 값을 정한다. 변수는 컬렉션으로 묶고, 한 변수에 라이트·다크 같은 모드별 값을 둔다.

디자인 파일과 코드가 같은 토큰을 쓰게 하는 흐름. 원본을 한 곳(토큰 파일)에 두고 나머지는 거기서 만들어 낸다. 값 예시는 형식을 보이기 위한 것이다.

컴포넌트는 토큰처럼 자동으로 옮기기 어렵다. 대신 이름과 속성을 맞춘다. 피그마 컴포넌트의 속성 이름(variant, size)과 값(primary, md)을 코드 API와 똑같이 지으면, 디자이너가 고른 조합을 개발자가 그대로 코드로 옮긴다. "피그마에 있는데 코드에 없는" 변형이 생기지 않게 둘을 같은 리뷰에서 함께 바꾼다.

문서와 사용 지침: Do와 Don't

부품만 있고 쓰는 법이 없으면 사람마다 다르게 쓴다. 컴포넌트 문서 한 장에는 보통 다음이 들어간다. 언제 쓰고 언제 다른 것을 쓰는지, 해부도(각 부분의 이름), 변형과 상태의 모습, 문구 지침(버튼은 동사로, 짧게), 접근성 메모(키보드 동작, 스크린 리더가 읽는 이름, 대비), 살아 있는 코드 예시다. 문구 지침은 UX 라이팅·평가·실험 글, 접근성은 반응형·모바일·접근성 글에 있다.

가장 잘 전달되는 형식이 Do/Don't 그림이다. 같은 장면을 옳은 쓰임과 틀린 쓰임으로 나란히 두고, 왜 틀렸는지 한 줄로 적는다. 규칙을 문장으로만 쓰면 "주 버튼은 한 화면에 하나"를 읽고도 막상 화면을 만들 때 놓친다. 틀린 예를 눈으로 보면 기억에 남는다.

왼쪽 Do 카드는 취소와 저장 중 저장만 채운 버튼이고, 오른쪽 Don't 카드는 취소, 버리기, 저장을 모두 채운 버튼으로 그려 무엇이 주 행동인지 알 수 없다✓ Do변경 사항을 저장할까요?저장하지 않으면 고친 내용이 사라진다.취소저장주 행동 하나만 채운 버튼으로✕ Don't변경 사항을 저장할까요?저장하지 않으면 고친 내용이 사라진다.취소버리기저장셋 다 강조하면 주 행동이 안 보인다
Do/Don't 그림의 예. 주 버튼은 한 대화상자에 하나만 채운 모양으로 둔다. 모두 강조하면 사용자는 무엇이 기본 선택인지 다시 읽어야 한다.

버전 관리와 기여 모델

디자인 시스템은 여러 앱이 가져다 쓰는 라이브러리라, 바꿀 때마다 쓰는 쪽이 깨질지 알 수 있어야 한다. 흔히 유의적 버전(semantic versioning)을 쓴다. 호환되는 버그 수정은 PATCH, 호환되는 기능 추가는 MINOR, 호환이 깨지는 변경은 MAJOR를 올리고, 큰 자리를 올리면 아래 자리는 0으로 돌린다. 무언가를 폐기 예정(deprecated)으로 표시하는 것도 MINOR다. 바로 지우지 않고 경고로 알린 뒤 다음 MAJOR에서 지우면, 쓰는 팀이 옮겨 갈 시간을 번다. 토큰 이름을 바꾸거나 지우는 것도 호환이 깨지는 변경이다. 버전과 변경 기록의 일반론은 버전 관리 노트에 있다.

버전 2.3.4에서 시작해 버그 수정, 기능 추가, 폐기 예정, 호환 깨짐을 차례로 거치며 버전 번호가 바뀌는 시간 줄2.3.4시작2.3.5PATCH2.4.0MINOR2.5.0MINOR3.0.0MAJOR지금 쓰는 버전MAJOR.MINOR.PATCH, 자리마다 정수 하나앱은 MAJOR가 같은 동안 마음 놓고 올린다포커스 링이 잘리는 버그 수정호환되는 버그 수정만: PATCH를 하나 올린다앱은 코드를 고치지 않고 받는다Button에 loading 상태 추가호환되는 기능 추가: MINOR를 올리고 PATCH는 0으로새 상태를 쓰고 싶은 앱만 코드를 고친다variant="link"를 폐기 예정으로 표시폐기 예정 표시도 MINOR다. 아직 지우지는 않는다경고를 보고 다음 MAJOR 전에 옮겨 간다variant="link" 삭제호환이 깨지는 변경: MAJOR를 올리고 나머지는 0으로옮기는 법(마이그레이션 안내)과 함께 낸다
1 / 5

지금 버전 2.3.4. 세 자리는 MAJOR.MINOR.PATCH이고, MAJOR가 같으면 기존 코드가 깨지지 않는다는 약속이다.

유의적 버전으로 컴포넌트 라이브러리를 내는 예. 버전 번호만 보고 이번 업데이트가 앱을 깨뜨릴 수 있는지 알 수 있다.

누가 만드느냐도 정해야 한다. 작은 시스템 팀이 모든 컴포넌트를 만들면 품질은 고르지만 속도가 따라가지 못하고, 쓰는 팀이 모두 만들게 두면 금세 중복과 어긋남이 생긴다. 그래서 많은 시스템이 쓰는 팀이 제안하고 함께 만들되, 시스템 팀이 기준을 지키는 기여 모델을 둔다. GOV.UK 디자인 시스템은 그 기준을 공개해 두었다. 제안 단계에서는 여러 팀에 쓸모 있다는 근거(유용)와 이미 있는 것과 겹치지 않음(고유)을 보고, 출시 전에는 장애인을 포함한 사용자 조사(사용성), 기존 스타일·컴포넌트 재사용(일관성), 여러 서비스·브라우저·보조 기술에서의 시험(다양성)을 본다.

쓰는 팀의 제안이 유용성과 고유성을 보는 첫 관문, 함께 만드는 단계, 사용성·일관성·다양성을 보는 둘째 관문을 지나 시스템에 들어간다쓰는 팀이 기여하고, 시스템 팀은 기준을 지킨다제안쓰는 팀관문 1유용 · 고유만들기함께 개발관문 2사용성 · 일관성 · 다양성· 많은 팀에 쓸모 있다는 근거· 이미 있는 것과 겹치지 않는다· 장애인을 포함한 사용자 조사· 기존 스타일·컴포넌트 재사용· 브라우저·보조 기술에서 시험겹치면 기존 것을 고치는 쪽으로 돌려보낸다기준 출처: GOV.UK Design System의 기여 기준
기여 모델의 두 관문. 제안은 쓸모와 중복 여부를, 출시는 사용성·일관성·다양성을 본다. 기준은 GOV.UK 디자인 시스템이 공개한 것이다.

널리 알려진 디자인 시스템

큰 회사들이 자사 디자인 시스템을 공개해 두어, 처음 만들 때 참고하거나 그대로 가져다 쓸 수 있다. 같은 생각을 다른 이름으로 부르는 경우가 많다. 토큰의 층만 봐도 Material Web 문서는 참조(--md-ref-*, 실제 값)·시스템(--md-sys-*, 역할)·컴포넌트 토큰으로 나누고 컴포넌트 토큰에는 comp 접두사를 붙이지 않으며, Fluent 2는 원시 값을 담는 전역(global) 토큰과 의미를 붙이는 별칭(alias) 토큰을 설명한다.

Material 3의 참조·시스템·컴포넌트 토큰, Fluent 2의 전역·별칭 토큰, 이 글의 원시·의미·컴포넌트 토큰을 같은 세 칸에 맞춘 표값을 담는 층역할을 붙이는 층자리를 가리키는 층Material 3참조(ref)--md-ref-*시스템(sys)--md-sys-*컴포넌트--md-filled-button-*Fluent 2전역(global)원시 값별칭(alias)의미를 붙인 값이 글원시color.blue.500의미color.action.primary컴포넌트button.primary.fill점선 칸: Fluent 2의 토큰 소개 페이지는 전역·별칭 두 층만 설명한다
같은 생각, 다른 이름. 시스템을 옮겨 가거나 섞어 쓸 때는 층의 이름보다 그 층이 맡은 일(값, 역할, 자리)로 맞춰 본다.
시스템만든 곳눈여겨볼 점링크
Material Design 3Google토큰을 참조(ref)·시스템(sys)·컴포넌트 세 층으로 나누고 이름에 드러낸다m3.material.io
Human Interface GuidelinesApple애플 플랫폼 앱을 위한 공식 디자인 지침developer.apple.com
Fluent 2Microsoft전역 토큰(원시 값)과 별칭 토큰(의미)을 두고 웹·iOS·안드로이드·윈도우용 라이브러리를 낸다fluent2.microsoft.design
CarbonIBM스스로를 기업용 오픈 소스 디자인 시스템으로 소개한다carbondesignsystem.com
GOV.UK Design System영국 정부공공 서비스용. 기여 기준을 공개해 쓰는 팀이 컴포넌트를 제안한다design-system.service.gov.uk

가져다 쓰는 길은 몇 단계가 있다. 그대로 쓰기, 토큰만 덮어써 테마를 입히기, 코드를 갈라 와 고쳐 쓰기, 직접 만들기다. 오른쪽으로 갈수록 자기 제품에 맞지만 비용이 든다. 특히 갈라 쓰기는 원본의 개선을 따라가기 어려워진다. 처음에는 공개 시스템에 테마를 입혀 쓰고, 자주 덮어쓰는 곳이 쌓이면 그 부분부터 자기 것으로 만드는 순서가 무난하다.

흔한 실패

  • 쓰는 사람 없이 만든다: 시스템 팀이 이상적인 부품을 먼저 다 만들고 배포하면, 실제 화면에 필요한 변형이 빠져 있다. 지금 제품에서 가장 많이 반복되는 부품부터 실제 화면과 함께 만든다.
  • 모양으로 이름 짓는다: blue-button, color.gray-light처럼 지으면 테마나 브랜드가 바뀔 때 이름이 거짓말이 된다. 의미 토큰과 변형은 역할로 짓는다.
  • 토큰이 너무 많다: 모든 값에 컴포넌트 토큰을 만들면 이름이 수천 개가 되어 아무도 고르지 못한다. 컴포넌트 토큰은 정말 따로 바꿀 일이 있는 자리에만 둔다.
  • 디자인과 코드가 따로 논다: 피그마와 코드가 각자 고쳐지면 둘 중 하나는 거짓이 된다. 원본을 하나로 정하고 같은 리뷰에서 바꾼다.
  • 문을 닫는다: 기여 길이 없고 요청이 몇 달씩 밀리면 팀은 복제해 고쳐 쓴다. 그 사본이 쌓이면 시스템은 이름만 남는다. 아래 고리가 그 모습이다.
시스템이 모자람, 팀의 복제, 화면이 갈라짐, 시스템 불신 네 상자가 시계 방향으로 도는 고리이고, 가운데에 고리를 끊는 세 가지 방법이 있다시스템이 느리고 모자란다필요한 변형이 없다팀이 복제해 고쳐 쓴다분리한 사본이 늘어난다화면이 갈라진다같은 버튼이 여러 모양시스템을 믿지 않는다"어차피 안 맞는다"고리를 끊는 법빠른 기여 길쓰임·분리 수 재기필요한 변형부터 채우기
디자인 시스템이 무너지는 고리. 모자란 시스템이 복제를 부르고, 복제가 어긋남을, 어긋남이 불신을 부른다. 빠른 기여 길과 쓰임 측정이 고리를 끊는다.

흔한 오해

  • "디자인 시스템 = UI 키트": 부품 모음은 한 층일 뿐이다. 원칙·토큰·패턴·문서·운영 방식이 함께 있어야 사람들이 같은 결정을 내린다.
  • "한 번 만들면 끝": 제품처럼 버전을 내고, 쓰는 팀의 요청을 받고, 폐기와 이전을 안내해야 한다. 운영이 멈추면 사본이 늘어난다.
  • "다크 모드는 색을 뒤집으면 된다": 같은 강조색도 배경이 바뀌면 대비가 달라진다. 위 예에서 라이트 강조색을 다크 배경에 그대로 쓰면 3.79:1로 미달이었다. 의미 토큰마다 테마별 값을 골라 다시 잰다.
  • "유명한 시스템을 가져오면 우리 시스템이 생긴다": 가져온 것은 남의 결정이다. 우리 제품의 원칙과 패턴, 문서는 여전히 직접 써야 한다.
  • "디자인 시스템은 창의성을 죽인다": 매번 다시 정하던 버튼 여백 같은 결정을 덜어 주어, 정말 새로 풀어야 하는 문제에 시간을 쓰게 한다. 새 패턴이 필요하면 기여 길로 시스템에 더한다.
  • "아토믹 디자인의 다섯 단계를 꼭 지켜야 한다": 다섯 단계는 생각하는 틀이다. 폴더 이름까지 그대로 따를 필요는 없다.

핵심 자료

화면 원리는 HCI와 UX 노트, 테마를 구현하는 웹 쪽 기술은 웹 개발 노트에 있다.

자료종류요지링크
Design Tokens Format Module명세 초안토큰 JSON의 $value·$type, 중괄호 별칭, 그룹을 정한다. W3C 표준이 아닌 커뮤니티 그룹 보고서다designtokens.org
Material Web Theming공식 문서ref·sys·컴포넌트 토큰이 CSS 변수 이름으로 어떻게 드러나는지 보여 준다GitHub
Atomic Design책(무료 공개)원자에서 페이지까지 다섯 단계로 인터페이스를 조립하는 사고방식atomicdesign.bradfrost.com
Guide to variables in Figma도구 문서변수·컬렉션·모드로 라이트·다크 같은 문맥을 바꾸는 법help.figma.com
Style Dictionary오픈 소스 도구토큰 파일 하나에서 CSS·JS·iOS·안드로이드 형식을 만들어 낸다styledictionary.com
Semantic Versioning명세MAJOR.MINOR.PATCH를 언제 올리는지 정한 규칙semver.org
GOV.UK 기여 기준운영 사례제안과 출시 때 무엇을 확인하는지 공개한 기여 모델GOV.UK