일상이 개발

React 디자이너 협업을 위한 컴포넌트 작성 전략 – 디자인 시스템 기반 실전 가이드

디어노미 2025. 4. 12. 17:31
반응형

🎨 디자이너와 협업하기 좋은 컴포넌트 작성법

프론트엔드 개발에서 디자이너와의 협업은 ‘예쁘게 구현해주는 것’만이 아닙니다. 기획 의도와 디자인 목적을 이해하고, 유지보수가 쉬운 컴포넌트로 풀어내는 일이야말로 협업의 핵심이죠.

특히,

디자인 시스템

을 기반으로 하는 팀이라면, 공통 컴포넌트의 설계 방식이 디자이너와의 커뮤니케이션 효율에 직결됩니다.


🧩 협업하기 좋은 컴포넌트란?

디자이너와 협업하기 좋은 컴포넌트는 다음의 기준을 충족합니다:

  • 의도가 명확하게 드러나는 구조
  • 다양한 상태/버전이 커버 가능한 유연성
  • 디자인 스펙을 반영한 네이밍
  • 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 구현 간 연결성 명확

디자이너와 잘 협업하는 컴포넌트는 단지 '예쁜' 컴포넌트가 아니라 의도와 구조가 명확한 컴포넌트입니다.
좋은 커뮤니케이션은 좋은 컴포넌트에서 시작됩니다. 🧑‍💻🤝🎨

반응형