노트

컴파운드 컴포넌트 패턴

Compound Components

프런트엔드#react#pattern · 연결된 개념 10개

쉽게 말하면

컴파운드 컴포넌트는 select와 option처럼 여러 부품이 한 상태를 같이 보며 하나의 기능을 이루는 패턴이에요. 레고 블록처럼 원하는 순서로 끼우면 되니 설정 prop을 수십 개 받지 않아도 돼요.

비유가 깨지는 곳 레고와 달리 부품끼리 보이지 않는 선으로 이어져 있어요. 부모가 열림 여부나 선택값을 Context로 내려 주고 자식이 그걸 읽어서, 사이에 다른 요소를 끼워도 깨지지 않아요.

컴파운드 컴포넌트(Compound Components)는 여러 컴포넌트가 상태를 공유하며 협력해 하나의 기능을 이루는 패턴이다. HTML(HyperText Markup Language)의 select와 option처럼, 부모가 상태를 들고 자식들은 각자 한 역할만 맡는다.

<Select onSelect={setFruit}>
  <Select.Trigger>선택하세요</Select.Trigger>
  <Select.Content>
    <Select.Item value="apple">사과</Select.Item>
    <Select.Item value="banana">바나나</Select.Item>
  </Select.Content>
</Select>
  • 부모(Select)가 열림 여부·선택값을 Context로 내려 주고, 자식들이 그 Context를 읽는다. 예전에는 React.Children.map + cloneElement로 props를 주입했지만, 직계 자식에게만 닿고 중간에 감싸면 깨져서 지금은 Context 방식이 일반적이다
  • 장점: 사용하는 쪽이 순서와 구성을 자유롭게 바꿀 수 있다. 수십 개의 설정 prop을 받는 대신 조합으로 표현한다. Radix·shadcn/ui 같은 헤드리스 UI 라이브러리가 이 패턴을 쓴다(cn 유틸리티(clsx·tailwind-merge·cva))
  • 설정 객체 하나로 화면을 만드는 설정 기반 UI와는 반대 방향의 선택이다

컴포지트 패턴과의 차이

컴포지트 패턴은 폴더 안에 폴더가 들어가듯 개별 객체와 그 묶음을 같은 방식으로 다루는 재귀적 트리 구조다. 컴파운드는 서로 다른 역할의 형제들이 상태를 공유하는 구조다. 중첩 메뉴처럼 둘을 함께 쓰는 경우도 많다.

비슷한 합성 기법은 Render Props 패턴, 역할 분리 관점은 Presentational·Container 컴포넌트.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 전략 패턴

    같은 목적을 가진 여러 알고리즘을 각각 별도 객체(또는 함수)로 빼고, 실행할 때 그중 하나를 골라 끼우는 패턴. 호출하는 쪽은 공통 인터페이스만 안다.

  • MVC·MVP·MVVM

    MVC(Model-View-Controller)·MVP(Model-View-Presenter)·MVVM(Model-View-ViewModel)은 UI 애플리케이션을 데이터(Model)와 화면(View)으로 나누고, 둘 사이를 무엇이 어떻게 잇느냐로 구분되는 아키텍처 패턴 가족이다.

  • 마이크로 프론트엔드

    마이크로 프론트엔드는 하나의 큰 프론트엔드 앱을 기능별 조각으로 나눠, 팀마다 따로 개발·배포하고 런타임에 하나의 화면으로 조립하는 아키텍처다. 백엔드의 마이크로서비스(microservices) 발상을 프론트엔드로 가져온 것이다.

  • Storybook

    Storybook은 UI 컴포넌트를 앱과 떨어진 작업장에서 상태별로 렌더해 보고, 문서화하고, 상호작용을 테스트하는 도구다. 공용 컴포넌트를 모아 디자인 시스템을 만들 때 많이 쓴다.

  • 템플릿 메서드 패턴

    알고리즘의 뼈대(단계의 순서)는 상위 클래스의 메서드에 고정하고, 일부 단계만 하위 클래스가 바꾸게 하는 패턴.

보기 옵션