주제 : React 컴포넌트 진화의 여정: 거대한 Props 지옥에서 우아한 Compound Pattern(+asChild pattern)까지

react 개발자라면 누구나 한 번쯤 "재사용 가능하면서도 유연한 컴포넌트"를 만드는 것에 대해 깊이 고민해 볼것이다. 처음에는 간단했던 컴포넌트가 기능이 추가될수록 수많은 props를 받기 시작하고, 어느새 통제 불가능한 '괴물' 컴포넌트가 되어버리는 경험이 다들 있을것 같다

이러한 문제를 나름대로 정의해봤는데 **'Props Hell'**이라고 결정했다.

그렇다면 어떻게 Props Hell에서 벗어나, 깨끗하고 유연하며 선언적인 컴포넌트를 만들수 있을까?

<aside> 💡

가장 흔히 만드는 UI 중 하나인 Select 컴포넌트를 재료 삼아, 원시적인 단일 컴포넌트(Monolithic Component)에서 시작해 최종적으로 Compound Component Pattern과 Context API를 활용한 우아한 형태로 진화시키는 과정을 단계별로 밟아보려고 한다.

</aside>


잠깐, '선언형(Declarative)'이란?

우리가 '좋은 React 코드'를 이야기할 때 빠지지 않고 등장하는 단어가 바로 선언형 프로그래밍입니다. 본격적인 여정에 앞서 이 개념을 명확히 짚고 넘어가겠습니다.

선언형은 **명령형(Imperative)**과 반대되는 개념입니다.

React에서 컴포넌트를 선언형으로 만든다는 것은, 개발자가 UI의 구조를 JSX로 직접 묘사하고, React가 그 선언을 바탕으로 실제 DOM을 효율적으로 조작하도록 위임하는 것을 의미합니다.

우리의 Select 컴포넌트 진화 여정은, 명령형에 가까운 '블랙박스' 컴포넌트를 사용자가 UI 구조를 직접 묘사하는 '선언형' 컴포넌트로 바꾸어 가는 과정입니다.


1. 시작: 거대한 괴물의 탄생 (The Monolithic Component)

Select 컴포넌트입니다. 이 컴포넌트는 필요한 모든 데이터를 props로 전달받아 스스로 모든 것을 렌더링합니다. 매우 직관적이고 구현하기 쉽다는 장점이 있지만, 많은 요구사항에 곧 한계에 부딪히게 됩니다.

요구사항