Ch.25 컴포넌트 설계 — 재사용 가능한 UI

좋은 컴포넌트의 조건

컴포넌트 설계의 3원칙(단일 책임, 재사용성, 예측 가능성)을 이해한다Props의 필수/선택 설계와 기본값 패턴을 적용할 수 있다컴포넌트를 언제 분리하고 합칠지 판단할 수 있다

AI에게 '버튼 만들어줘' 했더니 매번 다른 버튼?

AI가 만든 버튼은 어떨 때는 파란색, 어떨 때는 둥글고, 크기도 제각각입니다. 프롬프트를 잘 써도 일관성이 없죠.

같은 버튼인데 왜 매번 다르게 나올까?

컴포넌트 설계 원칙을 알면, AI에게 명확한 명세를 줄 수 있고 일관된 결과를 받을 수 있습니다.


article

핵심 내용

좋은 컴포넌트는 한 가지 일만 합니다

바이브 코더 팁 AI에게 컴포넌트를 요청할 때 "이 컴포넌트의 단일 책임은 무엇인가?"를 먼저 정의하세요. 책임이 명확할수록 AI 결과물도 정확합니다.

Props는 컴포넌트의 사용 설명서입니다

interface ButtonProps {
  // 필수 Props — 반드시 전달해야 동작
  label: string;
  onClick: () => void;

  // 선택 Props — 기본값이 있어 생략 가능
  variant?: "primary" | "secondary" | "danger";
  size?: "sm" | "md" | "lg";
  disabled?: boolean;
  icon?: React.ReactNode;

  // children — 내부 콘텐츠를 유연하게
  children?: React.ReactNode;
}

function Button({
  label,
  onClick,
  variant = "primary",  // 기본값
  size = "md",
  disabled = false,
  children,
}: ButtonProps) {
  return (
    <button onClick={onClick} disabled={disabled}>
      {children || label}
    </button>
  );
}

핵심 규칙: Props가 5개를 넘으면 컴포넌트가 너무 많은 일을 하고 있을 수 있습니다. 분리를 고려하세요.

같은 UI가 3번 반복되면 컴포넌트로 분리하세요

1번째: 그냥 인라인으로 작성

2번째: 비슷한 코드가 보이지만 아직 참음

3번째: 이제 컴포넌트로 분리!

하나의 컴포넌트에서 데이터 fetching, 폼 관리, 렌더링을 모두 처리하는 것은 좋은 설계이다.

Props에서 `variant?: "primary" | "secondary"` 처럼 `?`를 붙이는 이유는?

컴포넌트 분리의 '3번 반복 규칙'에서 3번째 반복 시 해야 할 일은?

key

핵심 용어

🎯

단일 책임

하나의 컴포넌트는 하나의 역할만. Button은 버튼만, Modal은 모달만

♻️

재사용성

같은 컴포넌트를 여러 곳에서 쓸 수 있어야. 색상·크기는 Props로 변경

🔮

예측 가능성

같은 Props를 주면 항상 같은 결과. 숨겨진 동작 없이 투명하게

🔑

필수 Props

없으면 컴포넌트가 동작하지 않는 값. label, onClick 등

⚙️

선택 Props (?)

기본값으로 대체 가능한 값. variant, size 등

🧩

children

컴포넌트 내부 콘텐츠를 외부에서 자유롭게 결정

📌

기본값 패턴

variant = "primary" 같은 기본값으로 사용 편의성 향상

compare_arrows

비교 정리

항목분리해야 할 때합쳐도 되는 때
반복같은 UI 패턴이 3곳 이상1~2곳에서만 사용
복잡도하나의 컴포넌트가 200줄 이상50줄 이내의 간단한 로직
독립성다른 맥락에서도 재사용 가능이 페이지에서만 쓰이는 고유 UI
edit_note

정리 노트

컴포넌트 설계 핵심 정리

설계 3원칙

단일 책임
하나의 컴포넌트는 하나의 역할만 수행
재사용성
같은 컴포넌트를 여러 곳에서 사용 가능하게 설계
예측 가능성
같은 Props를 주면 항상 같은 결과를 렌더링

분리 기준

3번 반복 규칙
같은 패턴이 3번 반복되면 공통 컴포넌트로 추출
Props 설계
필수/선택을 구분하고 기본값을 설정해 사용성 향상

컴포넌트가 너무 많은 일을 한다면 분리할 시점입니다.

image

시각 자료

다이어그램: wd-scene-component-design

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작