🎨 디자이너와 협업하기 좋은 컴포넌트 작성법
프론트엔드 개발에서 디자이너와의 협업은 ‘예쁘게 구현해주는 것’만이 아닙니다. 기획 의도와 디자인 목적을 이해하고, 유지보수가 쉬운 컴포넌트로 풀어내는 일이야말로 협업의 핵심이죠.
특히,
디자인 시스템
을 기반으로 하는 팀이라면, 공통 컴포넌트의 설계 방식이 디자이너와의 커뮤니케이션 효율에 직결됩니다.
🧩 협업하기 좋은 컴포넌트란?
디자이너와 협업하기 좋은 컴포넌트는 다음의 기준을 충족합니다:
- 의도가 명확하게 드러나는 구조
- 다양한 상태/버전이 커버 가능한 유연성
- 디자인 스펙을 반영한 네이밍
- Storybook이나 Figma 등 협업 도구와의 연결
이제 구체적으로 어떻게 설계하고 구현하면 좋을지 예시와 함께 살펴보겠습니다.
🛠 1. 디자인 토큰 기반 스타일 분리
디자이너는 대부분 Figma에서 디자인 토큰(Color, Spacing, Font 등)을 정의합니다.
이 값들을 코드에 반영할 때는 하드코딩보다는 theme
이나 styled-components
, tailwind.config.js
등을 활용해 구조화된 형태로 적용하는 것이 협업에 좋습니다.
예시 (styled-components + theme)
{`// theme.ts
export const theme = {
colors: {
primary: '#1E90FF',
gray100: '#f5f5f5',
},
spacing: {
sm: '8px',
md: '16px',
},
};`}
{`// Button.tsx
const Button = styled.button\`
padding: \${({ theme }) => theme.spacing.md};
background-color: \${({ theme }) => theme.colors.primary};
\`;`}
이렇게 하면 디자이너가 “그레이 100 말고 200으로 바꿔주세요”라고 했을 때 명확하게 대응할 수 있고, 디자인 시스템에 근거한 변경이 쉬워집니다.
📦 2. 컴포넌트는 역할 단위로 쪼개기
복잡한 UI 컴포넌트를 만들다 보면 하나의 파일에 여러 역할이 섞이는 경우가 많습니다.
이럴수록 시각 요소(View)와 비즈니스 로직을 분리해 컴포넌트 재사용성과 협업 가독성을 높이는 것이 중요합니다.
예시
{`// View.tsx
export const ButtonView = ({ label, ...props }) => (
{label}
);
// Container.tsx
import { ButtonView } from './View';
export const Button = ({ onClick }) => {
const handleClick = () => {
console.log('clicked');
onClick?.();
};
return ;
};`}
이처럼 분리하면 디자이너가 ButtonView
만 확인하면 되고, 개발자는 로직만 별도로 유지보수할 수 있습니다.
📚 3. Storybook으로 컴포넌트 상태 공유
Storybook은 개발자-디자이너 간 커뮤니케이션 효율을 비약적으로 높여주는 도구입니다. 다음과 같은 이점이 있습니다:
- 디자이너가 직접 UI를 브라우저에서 확인
- 다양한 상태(활성/비활성/에러 등)를 명시적으로 정의
- 문서화된 Props 정보로 협업 정확성 향상
예시
{`export default {
title: 'Components/Button',
component: Button,
};
export const Primary = () => ;
export const Disabled = () => ;`}
Storybook을 CI와 연동하거나 Chromatic 등을 사용하면 디자이너가 직접 UI 변경 내역을 확인할 수 있습니다.
🎯 4. Props 네이밍은 디자인 문서와 일치시키기
디자이너가 Figma에서 "버튼의 Variant가 primary, secondary"라고 정의했다면, 컴포넌트에서 해당 이름을 그대로 사용하는 것이 협업에 좋습니다.
{`// ❌ 예시 - 네이밍이 디자이너와 불일치
// ✅ 예시 - 네이밍 일치
`}
네이밍이 통일되면 디자이너가 코드까지 이해할 수 있게 되어 개발 속도와 정확도가 모두 향상됩니다.
🧠 5. Skeleton, Loading, Error 상태 포함하기
디자이너는 보통 정상적인 UI만 그리지만, 실제 앱에는 다음과 같은 상태도 고려해야 합니다:
- 로딩 중 (로딩 스피너, Skeleton 등)
- 데이터 없음 (Empty state)
- 에러 발생 (오류 메시지, 재시도 버튼)
이 상태들을 컴포넌트 내부에 기본 제공하거나, Prop으로 제어할 수 있도록 만들어두면 디자이너와의 소통에서 “이런 상태도 구현됐어요”라고 명확히 보여줄 수 있습니다.
{`{isLoading ? : }`}
👥 6. Figma ↔️ Storybook 연결 전략
요즘은 Figma에서 직접 코드 링크를 삽입하거나, Storybook Addon으로 디자인과 UI를 직접 연결하는 흐름도 많습니다.
- Figma URL을 Storybook Docs에 포함시키기
@storybook/addon-designs
로 컴포넌트에 디자인 탭 추가
{`import { withDesign } from 'storybook-addon-designs';
export default {
title: 'Components/Button',
component: Button,
decorators: [withDesign],
parameters: {
design: {
type: 'figma',
url: 'https://www.figma.com/file/abc123/DesignSystem?node-id=456',
},
},
};`}
이처럼 문서화 + 연결을 통해 “이 컴포넌트가 이 디자인에서 파생됐어요”라는 신뢰를 형성할 수 있습니다.
✅ 마무리 요약
전략 | 협업 효과 |
---|---|
디자인 토큰 활용 | 일관된 스타일 적용, 변경 대응 쉬움 |
View & Logic 분리 | 디자이너와 개발자 역할 구분 명확 |
Storybook 사용 | UI 상태 공유, 테스트, 문서화 |
Props 네이밍 통일 | 디자인 문서와의 연결성 향상 |
Empty/Loading/Error 처리 | 전체 사용자 흐름 고려한 안정성 확보 |
Figma 연동 | 디자인 소스와 UI 구현 간 연결성 명확 |
디자이너와 잘 협업하는 컴포넌트는 단지 '예쁜' 컴포넌트가 아니라 의도와 구조가 명확한 컴포넌트입니다.
좋은 커뮤니케이션은 좋은 컴포넌트에서 시작됩니다. 🧑💻🤝🎨
'일상이 개발' 카테고리의 다른 글
[개발 가이드] 외부 협업을 위한 HTML, CSS, JavaScript, React 프로젝트 기준 총정리 (0) | 2025.04.14 |
---|---|
React 모달 시스템 설계 가이드 – 전역 Context와 다이얼로그 관리 전략 (0) | 2025.04.13 |
React 공통 컴포넌트 테스트 자동화 전략 – 안정적인 UI를 위한 실전 가이드 (0) | 2025.04.12 |
React 앱에서 성능 병목 찾기: DevTools, why-did-you-render, Profiler 실전 분석 (0) | 2025.04.11 |
React 앱 성능 병목 실전 분석: DevTools부터 Profiler까지 완전 정복 (0) | 2025.04.11 |