실무에 바로 적용하는 디자인 시스템 컬러 토큰 구성 가이드 (Primary와 Neutral 중심)

서론

디지털 프로덕트가 커지고 복잡해질수록 일관된 사용자 경험을 유지하는 것은 매우 어려운 과제가 됩니다. 디자이너와 개발자가 매번 화면을 구성할 때마다 서로 다른 헥스(Hex) 코드 값을 주고받는다면, 결국 화면마다 미세하게 다른 버튼 색상과 회색 텍스트가 넘쳐나게 될 것입니다. 이러한 파편화 문제를 해결하고 팀 전체가 동일한 디자인 언어로 소통하기 위해 도입하는 핵심 개념이 바로 디자인 시스템의 컬러 토큰입니다.

컬러 토큰은 단순히 색상 코드를 변수로 묶어두는 것을 넘어, 색상에 구체적인 역할과 의미를 부여하는 과정입니다. 복잡한 UI 환경에서도 테마 변경이나 다크 모드 도입을 유연하게 처리할 수 있는 기반이 되며, 무엇보다 유지보수 시간을 획기적으로 줄여줍니다. 초기 설계 단계에서 구조를 탄탄하게 잡아두지 않으면 나중에 토큰을 재정의하는 데 막대한 비용이 발생할 수 있으므로, 어떤 기준으로 토큰을 나누고 이름을 지어야 하는지 명확히 이해하는 것이 중요합니다.

컬러 토큰의 3단계 계층 구조 이해하기

컬러 토큰을 제대로 구성하려면 먼저 색상을 계층화하는 방법을 알아야 합니다. 일반적으로 토큰은 세 가지 레벨로 나뉘어 설계됩니다. 첫 번째는 글로벌 토큰(Global Token) 또는 원시 토큰(Primitive Token)이라 불리는 계층입니다. 여기서는 색상의 이름과 명도 단위를 그대로 사용합니다. 예를 들어 'Blue-500'처럼 색의 본질적인 속성을 명시하며, 디자인 시스템의 전체 팔레트 역할을 합니다.

두 번째는 시맨틱 토큰(Semantic Token) 또는 앨리어스 토큰(Alias Token) 계층입니다. 글로벌 토큰을 참조하여 색상이 UI 내에서 어떤 맥락으로 쓰이는지 의미를 부여합니다. 'Color-Primary-Default'나 'Color-Text-Warning'처럼 역할이 이름에 명시되므로, 실제 개발과 디자인 과정에서 가장 많이 쓰이는 실질적인 표준이 됩니다. 특정 컴포넌트에 종속되지 않으면서도 용도가 분명해 재사용성이 매우 높습니다.

마지막은 컴포넌트 토큰(Component Token)입니다. 이는 특정 UI 요소에만 국한하여 적용하는 가장 좁은 범위의 토큰입니다. 'Button-Background-Primary-Hover'와 같이 매우 구체적인 상황을 정의할 때 사용합니다. 다만 컴포넌트 토큰을 너무 많이 만들면 시스템이 무거워지고 관리가 어려워질 수 있으므로, 초기 단계에서는 글로벌 토큰과 시맨틱 토큰을 탄탄하게 구축하는 데 집중하는 것이 효율적입니다.

브랜드 정체성을 담는 Primary 컬러 설정

프라이머리(Primary) 컬러는 프로덕트의 얼굴이자 가장 강조되어야 하는 핵심 색상입니다. 주로 브랜드의 메인 컬러를 바탕으로 설정되며, 주요 액션 버튼, 활성화된 탭, 진행 상태 바 등 사용자의 시선이 머물고 행동을 유도해야 하는 곳에 쓰입니다. 프라이머리 컬러를 토큰으로 구성할 때는 단순히 하나의 색상 값만 정의해서는 안 되며, 사용자의 인터랙션에 대응할 수 있도록 명도와 채도를 조절한 스케일(Scale)을 함께 준비해야 합니다.

실제 화면에 적용할 때는 기본 상태(Default) 외에도 마우스를 올렸을 때의 상태(Hover), 클릭했을 때의 상태(Pressed), 그리고 비활성화 상태(Disabled)를 위한 베리에이션이 필수적입니다. 예를 들어 'Primary-500'을 기본 색상으로 잡았다면, 약간 더 어두운 'Primary-600'을 호버 상태로, 더 밝은 'Primary-100'을 옅은 배경색으로 지정하는 식입니다. 이렇게 계조를 만들어 두면 컴포넌트를 확장할 때마다 새로운 색상을 즉흥적으로 만들어내는 실수를 방지할 수 있습니다.

UI의 뼈대를 이루는 Neutral 컬러 구성

디자인 시스템에서 뉴트럴(Neutral) 컬러는 프라이머리 컬러보다 훨씬 더 자주, 광범위하게 사용됩니다. 텍스트, 배경, 테두리, 디바이더 등 화면의 90% 이상을 채우는 요소들이 뉴트럴 토큰을 통해 그려집니다. 때문에 뉴트럴 토큰이 세밀하게 구분되어 있지 않으면 UI가 평면적이거나 답답해 보일 수 있습니다. 뉴트럴 컬러는 보통 흰색에서 검은색에 이르는 무채색 스케일로 구성하지만, 순수한 블랙(#000000)이나 그레이는 화면에서 다소 차갑고 동떨어진 느낌을 줄 수 있습니다.

실무에서 뉴트럴 컬러를 자연스럽게 활용하려면 프라이머리 컬러의 색조(Hue)를 아주 미세하게 섞어주는 틴팅(Tinting) 기법을 추천합니다. 블루가 메인 컬러라면 뉴트럴 그레이에도 아주 약간의 블루 톤을 가미하여 전체적인 시각적 조화를 끌어올릴 수 있습니다. 토큰의 이름은 용도와 위계에 따라 'Text-Primary', 'Text-Secondary', 'Border-Light', 'Background-Default' 등으로 직관적으로 나누어, 디자이너나 개발자가 고민 없이 적재적소에 꺼내 쓸 수 있도록 구성해야 합니다.

상황과 맥락을 전달하는 Semantic 컬러 적용

사용자에게 시스템의 상태나 피드백을 직관적으로 전달하기 위해서는 시맨틱 컬러 토큰이 필요합니다. 주로 성공(Success), 경고(Warning), 오류(Error), 정보(Info)의 네 가지 카테고리로 나뉩니다. 성공은 녹색 계열, 오류는 붉은색 계열을 사용하는 것이 범용적인 사용자 멘탈 모델에 부합합니다. 여기서 중요한 것은 토큰의 이름을 색상이 아닌 '기능'으로 지어야 한다는 점입니다.

만약 에러 메시지 텍스트를 'Text-Red'로 명명했다면, 훗날 브랜드 리뉴얼로 인해 에러 경고 색상을 주황색으로 바꿔야 할 때 코드를 수정하는 과정에서 이름과 실제 색상 간의 큰 혼란이 발생합니다. 반면 'Text-Error'라는 시맨틱 토큰을 사용했다면, 내부 변수값만 변경해도 시스템 전반에 일관되게 적용되며 논리적 모순도 발생하지 않습니다. 다크 모드를 지원할 때도 시맨틱 토큰을 기준으로 밝고 어두운 값을 매핑하면 훨씬 유연하게 대응할 수 있습니다.

토큰 구축 시 흔히 겪는 실수와 비판적 고려사항

디자인 시스템을 처음 도입하는 팀이 가장 흔히 저지르는 실수는 오버엔지니어링(Over-engineering)입니다. 모든 가능한 경우의 수를 다 대비하겠다며 처음부터 수백 개의 토큰을 만들어두면, 결국 아무도 그 토큰을 다 기억하지 못하고 예외 규칙만 늘어나게 됩니다. 실무 환경에서는 철저히 현재 프로덕트에서 쓰이고 있는 최소한의 범위 내에서 토큰을 시작하고, 필요가 명확해질 때 점진적으로 추가하는 방식이 훨씬 안전합니다.

접근성(Accessibility)을 간과하는 것도 치명적인 문제입니다. 보기 좋은 프라이머리 컬러와 옅은 뉴트럴 컬러를 조합해 버튼을 만들었지만, 막상 시각적으로 텍스트와 배경의 명도 대비가 WCAG(웹 콘텐츠 접근성 지침) 기준을 통과하지 못하는 경우가 빈번합니다. 토큰을 설계할 때는 항상 글자가 읽히는 최소 대비 비율(최소 4.5:1)을 만족하는 쌍을 찾아 문서화해두어야 합니다. 또한 다크 모드를 단지 '색상을 반전시키는 것'으로 단순하게 접근하면, 어두운 화면에서 시각적 무게감이 깨지는 현상이 발생하므로 실제 화면 렌더링 결과를 꼼꼼히 교차 검증해야 합니다.

결론

디자인 시스템에서 컬러 토큰을 구성하는 일은 예쁜 팔레트를 만드는 것이 아니라, 팀원 모두가 동의하고 따를 수 있는 규칙을 설계하는 과정입니다. 프라이머리 컬러로 브랜드의 정체성과 액션을 유도하고, 뉴트럴 컬러로 콘텐츠를 안정적으로 받쳐주며, 시맨틱 컬러로 사용자와 명확하게 소통하는 뼈대를 세워야 합니다.

완벽한 디자인 시스템은 하루아침에 완성되지 않습니다. 처음에는 기본 색상과 필수적인 텍스트, 배경, 테두리 토큰만으로 가볍게 시작해 보시길 권장합니다. 규칙이 단순하고 직관적일수록 실무에서의 채택률은 높아지며, 시간이 지날수록 파편화 없는 견고한 프로덕트를 구축하는 든든한 밑거름이 될 것입니다.