TUTORIAL
컴파운드 컴포넌트 패턴
React 고급 컴포넌트 디자인 패턴. 유연하고 재사용 가능한 컴포넌트 API 설계 방법을 배웁니다.
럿지 AI 팀2025-01-0915분
컴파운드 컴포넌트 패턴
여러 개의 컴포넌트가 암묵적으로 상태를 공유하며
함께 동작하는 고급 React 디자인 패턴입니다.
// 사용 예시: HTML의 select/option과 유사
<Select>
<Select.Trigger>선택하세요</Select.Trigger>
<Select.Options>
<Select.Option value="1">옵션 1</Select.Option>
<Select.Option value="2">옵션 2</Select.Option>
</Select.Options>
</Select>패턴의 장점
유연한 API
사용자가 컴포넌트 구조를 자유롭게 조합 가능
Prop Drilling 해결
Context로 상태를 암묵적으로 공유
관심사 분리
각 서브 컴포넌트가 명확한 역할 담당
재사용성
다양한 상황에 맞게 커스터마이징 가능
구현 방법
const TabsContext = createContext(null);
function Tabs({ children, defaultValue }) {
const [active, setActive] = useState(defaultValue);
return (
<TabsContext.Provider value={{ active, setActive }}>
<div className="tabs">{children}</div>
</TabsContext.Provider>
);
}
Tabs.List = function TabsList({ children }) {
return <div className="tab-list">{children}</div>;
};
Tabs.Tab = function Tab({ value, children }) {
const { active, setActive } = useContext(TabsContext);
return (
<button
className={active === value ? 'active' : ''}
onClick={() => setActive(value)}
>
{children}
</button>
);
};
Tabs.Panel = function TabPanel({ value, children }) {
const { active } = useContext(TabsContext);
return active === value ? <div>{children}</div> : null;
};실제 활용 사례
Radix UIDialog, Dropdown, Accordion
Headless UIMenu, Listbox, Disclosure
Reach UITabs, Accordion, Combobox
Chakra UIModal, Drawer, Menu
패턴 비교
| 패턴 | 장점 | 단점 |
|---|---|---|
| Compound | 유연한 구조 | 초기 러닝커브 |
| Render Props | 제어 역전 | 중첩시 복잡 |
| HOC | 로직 재사용 | Props 충돌 |
관련 태그
#Compound Components
#React
#Design Pattern
#컴포넌트
#API