디자인 시스템을 씌우기 전에 레이아웃 틀부터 맞춰야 하는 이유
같은 디자인 시스템을 사용하는데도 어떤 화면은 정돈되어 보이고, 어떤 화면은 미묘하게 어긋나 보일 때가 있습니다. 색상과 버튼 모양이 같아도 페이지 폭, 여백, 제목 위치, 입력 필드의 구성이 제각각이면 전체 인상은 쉽게 흐트러집니다.
이 차이는 대개 테마가 아니라 레이아웃의 골격에서 생깁니다. 디자인 시스템의 효과를 제대로 얻으려면 색과 모서리를 바꾸기 전에 화면이 공유하는 기본 틀부터 맞춰야 합니다.
왜 레이아웃이 먼저일까요?
디자인 시스템은 화면의 모든 문제를 자동으로 해결하는 장치가 아닙니다. 색상, 글꼴, 간격처럼 반복되는 값을 일관되게 관리하고, 버튼이나 입력 필드 같은 요소를 재사용하기 쉽게 만드는 기반에 가깝습니다.
페이지마다 본문 폭과 여백을 서로 다르게 정해 두었다면 같은 버튼을 사용해도 화면은 가지런해 보이지 않습니다. 반대로 레이아웃 규칙이 통일되어 있으면 테마를 바꾸는 작업은 훨씬 단순해집니다.
어긋난 골격 위에 새 테마를 적용하면, 기존의 불일치가 오히려 더 선명하게 드러납니다.
따라서 작업 순서는 다음과 같이 잡는 편이 안전합니다.
- 페이지의 공통 골격을 정합니다.
- 반복되는 UI를 공용 컴포넌트로 묶습니다.
- 색상과 간격을 의미 기반 토큰으로 연결합니다.
- 마지막으로 브랜드 테마를 적용합니다.
디자인 시스템과 레이아웃 틀의 차이
두 개념은 서로 연결되어 있지만 담당하는 역할은 다릅니다.
| 구분 | 역할 | 예시 |
|---|---|---|
| 디자인 토큰 | 반복되는 값을 이름으로 관리합니다 | 기본색, 테두리색, 본문 간격 |
| UI 컴포넌트 | 같은 기능과 상태를 재사용합니다 | Button, Input, Card |
| 레이아웃 틀 | 페이지의 폭과 배치를 통일합니다 | PageContainer, PageHeader |
| 테마 | 토큰에 실제 브랜드 표현을 연결합니다 | 색상, 글꼴, 모서리, 그림자 |
테마는 건물의 마감재와 비슷합니다. 레이아웃 틀은 방의 크기와 문·창문의 위치를 정하는 설계에 가깝습니다. 설계가 제각각인 상태에서는 마감재를 통일해도 공간이 정돈되어 보이기 어렵습니다.
먼저 맞춰야 할 네 가지 골격
1. 페이지 폭과 바깥 여백
화면마다 서로 다른 max-width와 패딩을 사용하면 사용자는 페이지를 이동할 때마다 내용이 좌우로 흔들린다고 느낍니다. 본문형, 대시보드형처럼 필요한 유형을 몇 가지로 제한하고 각 유형의 폭과 여백을 한곳에서 관리하는 것이 좋습니다.
type PageContainerProps = {
title: string;
children: React.ReactNode;
};
export function PageContainer({ title, children }: PageContainerProps) {
return (
<main className="mx-auto w-full max-w-6xl px-6 py-8">
<h1 className="text-2xl font-semibold">{title}</h1>
<div className="mt-6">{children}</div>
</main>
);
}이렇게 바깥 틀을 공유하면 페이지 폭이나 제목 간격을 바꿀 때 여러 화면을 각각 수정하지 않아도 됩니다.
2. 제목과 주요 동작의 위치
어떤 화면은 제목 옆에 버튼이 있고, 다른 화면은 본문 아래에 같은 버튼이 있다면 기능을 찾는 데 시간이 더 걸립니다. 페이지 헤더에는 제목, 설명, 주요 동작이 놓이는 위치를 정하고 예외를 최소화해야 합니다.
3. 입력 필드의 구조
입력창만 공용으로 만들어서는 충분하지 않습니다. 라벨, 도움말, 오류 메시지, 필수 표시까지 하나의 Field 구조로 묶어야 폼 전체의 간격과 접근성이 일관됩니다.
<Field label="이메일" hint="업무용 이메일을 입력해 주세요." error={errors.email}>
<Input type="email" name="email" />
</Field>화면마다 라벨과 오류 메시지를 따로 배치하면 같은 입력 컴포넌트를 사용하더라도 폼의 높이와 정렬이 달라집니다.
4. 카드와 섹션의 간격
카드의 테두리와 그림자만 같다고 일관된 화면이 되는 것은 아닙니다. 카드 내부 패딩, 제목과 본문의 간격, 카드 사이의 간격도 같은 규칙을 따라야 합니다. 자주 쓰는 조합은 CardHeader, CardContent, Section처럼 작은 구성 요소로 나누면 관리하기 쉽습니다.
토큰은 값보다 의미가 중요합니다
디자인 토큰은 #2563eb 같은 값을 코드 곳곳에 직접 쓰는 대신 brand-primary처럼 이름을 붙여 관리하는 방식입니다. 한곳의 값을 바꾸면 해당 토큰을 사용하는 모든 화면에 변경이 반영됩니다.
더 중요한 것은 토큰의 이름입니다. gray-500은 색 자체를 설명하지만 text-muted는 그 색이 어디에 쓰이는지 설명합니다. 의미 기반 토큰을 사용하면 라이트 모드와 다크 모드에서 실제 색이 달라져도 컴포넌트 코드는 바꿀 필요가 없습니다.
:root {
--color-surface: #ffffff;
--color-border: #e5e7eb;
--color-text-muted: #6b7280;
}
[data-theme="dark"] {
--color-surface: #111827;
--color-border: #374151;
--color-text-muted: #9ca3af;
}다만 토큰이 잘 정리되어 있어도 화면마다 임의의 폭과 간격을 사용하면 레이아웃 문제는 남습니다. 토큰과 레이아웃 규칙은 함께 작동해야 합니다.
레이아웃이 어긋난 프로젝트에서 자주 보이는 신호
다음과 같은 패턴이 반복된다면 테마 교체 전에 구조 정리가 필요합니다.
- 같은 역할의 페이지인데 본문 폭과 좌우 여백이 서로 다릅니다.
- 화면마다 제목과 주요 버튼의 위치가 달라집니다.
- 비슷한 카드나 통계 영역이 파일마다 새 이름으로 다시 구현되어 있습니다.
- 공용 입력 컴포넌트가 있는데 일부 화면은 기본 HTML 요소를 직접 사용합니다.
- 간격과 높이에 임의의 픽셀값이 많이 남아 있습니다.
- 새 화면을 만들 때 참고할 템플릿이나 작성 규칙이 없습니다.
이런 문제는 개별 화면만 보면 사소해 보입니다. 하지만 화면 수가 늘어날수록 차이가 누적되고, 나중에는 작은 변경도 여러 파일을 찾아다니며 적용해야 합니다.
모든 것을 컴포넌트로 만들 필요는 없습니다
일관성을 높인다고 해서 모든 UI 조합을 거대한 공용 컴포넌트로 만들 필요는 없습니다. 지나친 추상화는 예외 처리용 속성을 늘리고 오히려 사용법을 어렵게 만듭니다.
실무에서는 다음 정도의 균형이 적절합니다.
- 자주 반복되는 페이지 틀과 입력 구조는 공용 컴포넌트로 만듭니다.
- 색상과 간격은 토큰으로 관리합니다.
- 화면 구성 방식은 템플릿과 짧은 규칙으로 공유합니다.
- 한 번만 등장하는 조합은 해당 기능 안에 두되 공통 토큰을 사용합니다.
즉, 일관성은 컴포넌트의 개수보다 공유된 규칙을 실제로 지키는 과정에서 만들어집니다.
안전한 리팩터링 순서
기존 프로젝트를 정리할 때는 한 번에 모두 바꾸기보다 영향 범위가 명확한 부분부터 진행하는 편이 좋습니다.
- 대표 화면 몇 개를 골라 페이지 폭, 헤더, 섹션 간격을 비교합니다.
- 반복 빈도가 높은
PageContainer,PageHeader,Field부터 추출합니다. - 기본 HTML 요소로 우회한 화면을 공용 컴포넌트로 교체합니다.
- 임의의 픽셀값을 간격과 글자 크기 토큰으로 옮깁니다.
- 새 화면이 따를 템플릿과 작성 규칙을 문서화합니다.
- 회귀 테스트와 주요 화면의 시각 비교를 거친 뒤 테마를 적용합니다.
리팩터링 중에는 한 화면의 모든 요소를 완벽하게 고치는 것보다, 여러 화면이 공유할 수 있는 규칙을 먼저 만드는 것이 효과적입니다.
적용 전 체크리스트
- 페이지 유형별 최대 폭과 좌우 여백이 정해져 있나요?
- 제목, 설명, 주요 동작의 위치가 일관적인가요?
- 라벨과 오류 메시지를 포함한 입력 필드 구조가 공통화되어 있나요?
- 임의의 색상과 간격 대신 의미 기반 토큰을 사용하나요?
- 비슷한 카드와 섹션이 화면마다 중복 구현되어 있지 않나요?
- 새 화면을 시작할 템플릿과 간단한 규칙이 있나요?
- 테마 변경 전후를 비교할 대표 화면이 준비되어 있나요?
듀오랩스가 보는 관점
디자인 시스템 도입의 목적은 단순히 화면을 보기 좋게 바꾸는 데 있지 않습니다. 제품이 커져도 같은 원칙으로 화면을 만들고, 변경 비용을 예측할 수 있게 만드는 것이 더 중요합니다.
그래서 테마를 적용하기 전에는 먼저 페이지의 폭, 여백, 헤더, 입력 필드처럼 반복되는 골격을 확인해야 합니다. 이 틀이 안정되어 있으면 브랜드 색상이나 글꼴을 바꾸는 작업도 빠르고 안전해집니다.
좋은 디자인 시스템은 화려한 컴포넌트 목록이 아니라, 팀이 계속 지킬 수 있는 레이아웃 규칙에서 시작합니다.
함께 읽기
- 디자인 시스템을 복제하지 않는 방법: Polaris 구조와 CSS 테마로 다시 설계한 DEUX디자인 시스템이 두세 개로 늘어나면 가장 먼저 보이는 차이는 색상과 모서리입니다. 그래서 새로운 시스템을 만들 때 기존 버튼과 카드의 색만 바꾸는 일로 시작하기 쉽습니다. 하지만 시간이 지나면 각 시스템 폴더에 Button, Input, Dialog, Chart 구현이 하나씩 생깁니다. 처음에는 독립성이 높아 보이지만,…
- 디자인 시안을 웹으로 옮기는 순서: 시맨틱 HTML·토큰·컴포넌트디자인 시안을 웹으로 옮길 때 핵심은 픽셀을 그대로 복사하는 것이 아니라, 콘텐츠의 의미와 반복 규칙을 브라우저가 이해할 수 있는 구조로 번역하는 것이다. 이 글에서는 시맨틱 HTML, 디자인 토큰, 컴포넌트, 반응형 규칙을 이용해 시안을 유지보수 가능한 코드로 구현하는 순서를 살펴본다.
- Google 번역을 켰더니 React 앱이 오류 화면으로 바뀐 이유한국어, 영어, 일본어, 중국어를 직접 제공하는 React 랜딩 페이지에서 예상하지 못한 문제가 생겼습니다. Chrome이 띄운 "이 페이지를 번역하시겠습니까?" 제안을 수락하면 번역이 시작되는 듯하다가, 잠시 뒤 사이트의 "일시적인 오류가 발생했습니다" 화면으로 바뀌었습니다.
- 클릭했는데 화면이 늦게 바뀌는 느낌을 줄이는 방법사용자가 버튼이나 링크를 눌렀는데 아무 반응이 없는 것처럼 보이면, 실제 로딩 시간이 길지 않아도 서비스가 느리다고 느낍니다. 이 문제는 단순한 성능 문제가 아니라 체감 성능과 피드백의 문제입니다.
- 데스크톱 AI 화면을 모바일에서 과감히 제거한 이유데스크톱에서 잘 작동하는 AI 인터페이스를 모바일 화면에 그대로 줄이면 기능은 남지만 경험은 쉽게 무너집니다. 사이드바, 대화, 참고 문헌을 동시에 보여주는 3단 구조는 넓은 화면에서는 강력하지만 작은 화면에서는 탐색과 스크롤이 서로 경쟁합니다.