# [[Context API]]

## 📌 Brief Summary
Context API는 React에 내장된 상태 공유 솔루션으로, 컴포넌트 트리의 모든 레벨을 통해 명시적으로 props를 전달하지 않고도 데이터를 전송할 수 있게 해주는 기능입니다 [1, 2]. 이는 독립적인 상태 관리 도구라기보다는 데이터를 전달하는 브로드캐스트 전송 메커니즘에 가깝습니다 [3, 4]. 주로 테마, 다국어 설정 등 변경이 거의 없는 정적인 데이터를 전역적으로 공유할 때 적합하게 사용됩니다 [5, 6].

## 📖 Core Content
* **작동 방식 및 구조:** Context API는 `React.createContext()`를 호출하여 생성되며, 상태 값을 제공하는 `Provider`와 데이터를 읽는 `Consumer`(실무에서는 주로 `useContext` 훅)로 구성됩니다 [4]. Provider는 값을 브로드캐스트하고, 트리의 어느 깊이에 있든 `useContext`를 호출하여 해당 값을 읽을 수 있습니다 [4]. 단, 상태 자체를 관리하려면 `useState`나 `useReducer`와 같은 훅과 반드시 함께 사용해야 합니다 [4, 7].
* **성능적 한계와 리렌더링 폭포:** Context의 가장 큰 단점은 성능 관리입니다 [8]. Context로 전달되는 값 중 일부만 변경되더라도, 해당 Context를 구독하는 **모든 컴포넌트가 리렌더링**됩니다 [8, 9]. React는 특정 데이터 부분만 사용하는 컴포넌트를 구별해 내지 못하므로, 상태 변경이 잦은 대규모 애플리케이션에서는 전체 대시보드가 수 초간 멈추는 등 심각한 성능 병목을 초래할 수 있습니다 [1, 10].
* **구조적 최적화 전략:** 이러한 리렌더링 문제를 피하기 위해 애플리케이션의 모든 상태를 하나의 'Global Context'에 담는 안티 패턴을 피해야 합니다 [11, 12]. 대신 `ThemeContext`, `NotificationContext`처럼 상태를 여러 개의 작은 도메인별 Context로 분리하고, 커스텀 훅과 Selector 패턴을 활용해 필요한 값만 스코프를 좁혀 사용하는 것이 권장됩니다 [12, 13].
* **사용의 적합성:** 테마(라이트/다크 모드), 언어 환경 설정, 기능 플래그 등 **변경 빈도가 매우 낮고 정적인 데이터**를 공유하거나 외부 종속성을 추가하고 싶지 않은 작은 프로젝트 및 라이브러리 개발에 완벽한 선택입니다 [5, 6, 14]. 반면, 실시간 데이터, 자주 업데이트되는 장바구니, 복잡한 비동기 작업이 필요한 경우에는 Context를 피하고 Zustand나 Redux를 사용하는 것이 좋습니다 [15-18].

## 🔗 Knowledge Connections

### Related Concepts
- [[Prop Drilling]]
  - 연결 이유: 부모 컴포넌트에서 깊게 중첩된 자식 컴포넌트로 데이터를 전달하기 위해 불필요한 중간 컴포넌트들을 거쳐야 하는 패턴입니다 [2]. 
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: Context API가 탄생하게 된 근본적인 배경과, 데이터를 어떻게 트리 아래로 "건너뛰어" 전달하는지 그 목적을 이해할 수 있습니다 [2, 19].
- [[useContext]]
  - 연결 이유: Context API의 Provider가 제공하는 브로드캐스트 값을 읽기 위해 개별 컴포넌트 내부에서 호출하는 React의 내장 훅입니다 [4].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 구독(Subscription)이 발생하는 정확한 지점과, 값이 변경될 때 어떤 컴포넌트에서 리렌더링이 트리거되는지 렌더링 동작 원리를 파악할 수 있습니다 [8].
- [[Zustand]]
  - 연결 이유: Context API의 리렌더링 한계와 보일러플레이트를 극복하기 위해 자주 비교되고 채택되는 경량 상태 관리 라이브러리입니다 [20, 21].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: Zustand의 'Selector 패턴'이 어떻게 특정 상태 슬라이스만 구독하게 하여 Context API의 "전체 리렌더링" 문제를 해결하는지 성능 최적화의 차이를 비교할 수 있습니다 [8, 10].

### Deeper Research Questions
- Context API와 외부 상태 관리 라이브러리(Zustand, Redux)를 동일한 애플리케이션 내에서 효율적으로 혼용(Hybrid)하기 위해, 정적 상태와 동적 상태를 분리하는 최적의 아키텍처 설계 기준은 무엇인가?
- Context API의 "브로드캐스트" 특성으로 인한 불필요한 리렌더링을 방지하기 위해 도메인별로 Context를 쪼갤 때, 코드의 유지보수성을 잃지 않으면서도 성능을 잡을 수 있는 적절한 분리 입도(Granularity)는 어느 정도인가?
- `use-context-selector`와 같은 외부 라이브러리를 사용하여 Context API의 리렌더링 문제를 우회하는 방식은, 처음부터 Zustand나 Redux를 도입하는 것과 비교하여 도입 비용 및 장기적 확장성 측면에서 어떤 장단점을 가지는가?
- 의존성 주입(Dependency Injection)의 목적으로 Context API를 사용할 때, 테스트 환경(Jest 등)이나 Storybook에서 Provider 모킹(Mocking)을 설계할 때 발생할 수 있는 취약점과 해결책은 무엇인가?
- 대규모 애플리케이션에서 무분별한 `useEffect`와 Context API가 결합되었을 때 발생하는 '리렌더링 폭풍(Re-render storm)'을 React DevTools Profiler로 진단하고 리팩토링하는 구체적인 과정은 어떻게 되는가?

### Practical Application Contexts
- **Implementation:** React 프로젝트에서 `React.createContext()`로 테마나 로케일 정보를 정의하고, 최상위 레이어(`app/` 또는 최상위 컴포넌트)를 `Provider`로 감싼 뒤, 내부 컴포넌트에서 `useContext`를 통해 해당 설정값을 불러와 UI에 즉각적으로 적용합니다 [4, 22, 23].
- **System Design:** 아키텍처 설계 시 상태의 '변경 빈도'에 따라 저장소를 이원화합니다. 다크모드, 로그인 여부 같은 정적인 설정은 Context API에 배치하고, 장바구니나 실시간 알림처럼 수시로 변하는 데이터는 Zustand나 Redux 같은 외부 스토어에 배치하여 불필요한 렌더링 전파를 방지합니다 [24].
- **Operation / Maintenance:** 성능 프로파일링 시 사용자 인터랙션 이후 대시보드가 일시적으로 멈추는 현상이 발견되면, React DevTools의 Profiler를 이용해 원인을 분석합니다. 원인이 단일 Context 업데이트에 의한 수백 개 컴포넌트의 리렌더링으로 확인될 경우, Context를 잘게 쪼개거나 다른 상태 관리 도구로 마이그레이션하는 유지보수 결정을 내립니다 [1, 25].
- **Learning Path:** React 상태 관리를 처음 배우는 단계에서, 컴포넌트 간 Props 전달의 피로도를 줄이는 첫 번째 도구로 학습됩니다. 이후 실제 복잡한 앱을 만들며 한계를 경험하고, Redux의 보일러플레이트 구조나 Zustand의 독립된 스토어 개념을 자연스럽게 받아들이게 하는 핵심 학습 경로입니다 [14, 26, 27].
- **My Project Relevance:** 기존 코드베이스에 'Global Context' 안티 패턴(모든 상태를 한 곳에 몰아넣은 형태)이 존재하지 않는지 점검하고 [11], 렌더링 병목이 있는 경우 `useMemo`, `useCallback`과 함께 Context를 책임별로 분할하는 리팩토링 목표와 직접적으로 연관됩니다 [1, 12].

### Adjacent Topics
- [[React.memo]]
  - 확장 방향: Context API에 의해 발생하는 불필요한 하위 컴포넌트 렌더링을 방지하기 위한 얕은 비교(Shallow Compare) 최적화 도구로, 렌더링 성능 최적화(Performance Optimization) 기법 전반으로의 이해를 확장합니다 [28, 29].
- [[Concurrent Rendering]]
  - 확장 방향: React 18의 동시성 렌더링 기능(`useTransition`, `useDeferredValue`)을 통해 무거운 컴포넌트 렌더링을 어떻게 지연시키고 애플리케이션의 반응성을 개선할 수 있는지 상태 업데이트 흐름으로 탐구를 확장합니다 [6, 30].

---
*Last updated: 2026-04-30*