Ch.25 컴포넌트 설계 — 재사용 가능한 UI
좋은 컴포넌트의 조건
AI에게 '버튼 만들어줘' 했더니 매번 다른 버튼?
AI가 만든 버튼은 어떨 때는 파란색, 어떨 때는 둥글고, 크기도 제각각입니다. 프롬프트를 잘 써도 일관성이 없죠.
같은 버튼인데 왜 매번 다르게 나올까?
컴포넌트 설계 원칙을 알면, AI에게 명확한 명세를 줄 수 있고 일관된 결과를 받을 수 있습니다.
핵심 내용
좋은 컴포넌트는 한 가지 일만 합니다
바이브 코더 팁 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번째 반복 시 해야 할 일은?
핵심 용어
단일 책임
하나의 컴포넌트는 하나의 역할만. Button은 버튼만, Modal은 모달만
재사용성
같은 컴포넌트를 여러 곳에서 쓸 수 있어야. 색상·크기는 Props로 변경
예측 가능성
같은 Props를 주면 항상 같은 결과. 숨겨진 동작 없이 투명하게
필수 Props
없으면 컴포넌트가 동작하지 않는 값. label, onClick 등
선택 Props (?)
기본값으로 대체 가능한 값. variant, size 등
children
컴포넌트 내부 콘텐츠를 외부에서 자유롭게 결정
기본값 패턴
variant = "primary" 같은 기본값으로 사용 편의성 향상
비교 정리
| 항목 | 분리해야 할 때 | 합쳐도 되는 때 |
|---|---|---|
| 반복 | 같은 UI 패턴이 3곳 이상 | 1~2곳에서만 사용 |
| 복잡도 | 하나의 컴포넌트가 200줄 이상 | 50줄 이내의 간단한 로직 |
| 독립성 | 다른 맥락에서도 재사용 가능 | 이 페이지에서만 쓰이는 고유 UI |
정리 노트
컴포넌트 설계 핵심 정리
설계 3원칙
- 단일 책임
- 하나의 컴포넌트는 하나의 역할만 수행
- 재사용성
- 같은 컴포넌트를 여러 곳에서 사용 가능하게 설계
- 예측 가능성
- 같은 Props를 주면 항상 같은 결과를 렌더링
분리 기준
- 3번 반복 규칙
- 같은 패턴이 3번 반복되면 공통 컴포넌트로 추출
- Props 설계
- 필수/선택을 구분하고 기본값을 설정해 사용성 향상
컴포넌트가 너무 많은 일을 한다면 분리할 시점입니다.
시각 자료
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작