"매 props 의 깊은 component tree 통과". 매 parent 가 grandchild 에 data 전달하기 위해 매 intermediate component 가 props 의 단순 forward. 2026 React 19+ 매 Server Component / Context / Zustand 의 5가지 해결책으로 회피.
매 핵심
매 문제
Intermediate component 의 매 props type 의 noise.
Refactoring 의 매 cost — 새 prop 추가 시 매 layer 수정.
Type drift: 매 layer 마다 prop spread, original type 잃음.
매 5가지 해결
Component Composition (children prop): 매 first choice.
React Context: 매 theme, auth, locale — 매 cross-cutting concern.
State Management Library: 매 Zustand, Jotai, Redux Toolkit.
React Server Components (RSC): 매 server-side data fetching, props 의 root level resolve.
Custom Hook + Module-level store: 매 small project.
매 응용
Theme propagation: 매 Context.
Auth user: 매 Context + custom hook (useUser()).
Form state: 매 react-hook-form, TanStack Form.
Server data: 매 RSC 또는 TanStack Query.
💻 패턴
Anti: 매 prop drilling
// App → Layout → Sidebar → UserMenu 매 user 4 level 통과
functionApp() {constuser=useAuth();return<Layoutuser={user}/>;}functionLayout({user}:{user: User}){return<Sidebaruser={user}/>;}functionSidebar({user}:{user: User}){return<UserMenuuser={user}/>;}functionUserMenu({user}:{user: User}){return<div>{user.name}</div>;}
constUserContext=createContext<User|null>(null);functionApp() {constuser=useAuth();return(<UserContext.Providervalue={user}><Layout/></UserContext.Provider>);}functionUserMenu() {constuser=useContext(UserContext);return<div>{user?.name}</div>;}// Custom hook for safety
functionuseUser() {constuser=useContext(UserContext);if(!user)thrownewError('useUser must be inside UserProvider');returnuser;}
// 매 simple, no library
let_user: User|null=null;constlisteners=newSet<()=>void>();exportfunctionuseUser() {returnuseSyncExternalStore((cb)=>{listeners.add(cb);return()=>listeners.delete(cb);},()=>_user,);}exportfunctionsetUser(u: User){_user=u;listeners.forEach((l)=>l());}
매 결정 기준
상황
해결
1-2 level only
그냥 props (drilling 아님)
Cross-cutting (theme, auth, locale)
Context
Frequently-changing state shared
Zustand / Jotai
Server-fetched data
RSC + TanStack Query
Complex slot-based UI
Composition (children)
Nested form
react-hook-form FormProvider
기본값: 매 Composition 우선 → 매 Context (cross-cutting) → 매 Zustand (frequently-changing client state).