Q5-1
디자인 시스템을 처음 구축하실 때 core/theme 패키지를 분리한 이유는요? 효과는요?
핵심 포인트
- core = UI 컴포넌트 (Button, Modal 등 동작·구조), theme = 디자인 토큰 (색상, 타이포그래피, 간격)
- 분리 효과 1: theme만 업데이트해도 core 재배포 없이 디자인 변경 반영 가능
- 분리 효과 2: 한 core를 여러 theme에 재사용 (다중 브랜드·라이트/다크)
- 분리 효과 3: 각 패키지 변경 빈도가 달라 빌드·배포 사이클 분리 가능
모범 답안먼저 답해보고 펼치기
디자인 시스템에서 "스타일 토큰"과 "컴포넌트 동작"은 변경 빈도와 변경 주체가 달라요. 토큰은 디자이너가 자주 손대고, 컴포넌트는 개발자가 손대요. 이 둘을 한 패키지에 묶으면 토큰 한 줄 바꿀 때마다 모든 컴포넌트가 함께 재배포되고, 사용처가 의존성을 다 업데이트해야 하는 비효율이 생깁니다.
그래서 처음부터 두 패키지로 분리했어요. core는 Button·Modal·Accordion 같은 UI 컴포넌트의 동작과 구조, theme은 색상·타이포그래피·간격 같은 디자인 토큰. core는 theme의 토큰 인터페이스를 import해서 쓰지만 구체 값은 알지 못해요. theme이 갱신돼서 새로 배포되면, 사용처는 theme만 업데이트하면 되고 core는 그대로예요.
이 분리의 진짜 가치는 멀티 브랜드 / 라이트·다크 모드 전환에서 드러났어요. 하나의 core 위에 여러 theme을 갈아끼울 수 있는 구조가 자연스럽게 만들어져서, 나중에 멀티 프로덕트로 확장할 때 그대로 활용됐습니다. 변경 빈도가 다른 두 가지를 한 패키지에 묶지 마라 — 모노레포 분리 기준의 가장 일반적인 원칙이고, 본 케이스에서 가장 잘 들어맞은 사례였어요.
이 답변, 어땠나요?
꼬리 질문
- Q-a. theme이 너무 작은 패키지가 되지 않나요? 패키지 분할의 손익분기점이 있을 텐데요.
작긴 합니다. 다만 "독립 배포 가능성"이 가치라서 크기보다는 변경 사이클이 기준이에요. theme이 한 달에 5번 바뀌고 core는 한 분기에 1번 바뀐다면 분리가 정당화됩니다.
- Q-b. CSS variables로 토큰을 표현했다면 패키지 분리 자체가 필요했을까요?
CSS variables 기반이면 사실 런타임에 toggling이 가능해서 패키지 분리 강제력은 약해져요. 다만 토큰의 type-safe 사용(자동완성, 잘못된 토큰 컴파일 에러)을 보장하려면 TypeScript 인터페이스가 필요하고, 그 인터페이스의 변경은 여전히 패키지 단위로 관리되는 게 깔끔했습니다.
- Q-c. theme 패키지에 콘텐츠가 너무 적어서 별도 빌드가 오버헤드일 텐데요?
빌드는 1초 미만이라 부담 안 컸어요. 오히려 빌드 사이클이 분리되어 있어서 core를 손볼 때 theme 빌드가 안 돌아가는 게 이득이었습니다.
CS · 이론
- Single Source of Truth (SSOT): 토큰을 한 곳에서 관리하는 것이 디자인 시스템의 본질
- Design tokens: 색상·타이포·간격 등 디자인 결정을 코드로 표현한 단위. 업계 표준은 W3C Design Tokens Community Group
- Package boundary와 변경 빈도: 모노레포 분할 기준은 "변경 빈도와 변경 주체가 같은가"
- Type-safe theme: TypeScript의 const assertion + mapped type으로 토큰을 컴파일 타임에 검증