"매 reconciliation 을 interruptible 한 unit 으로 쪼갠다". 매 React 16 (2017) 에서 stack reconciler 를 대체 — 매 work loop 가 매 fiber node 단위로 yield 가능하므로 매 concurrent rendering, Suspense, transitions 의 토대. 2026 React 19 의 Server Components, Actions, use hook 모두 매 fiber tree 위에서 동작.
매 핵심
매 fiber node
매 React element 1:1 의 mutable bookkeeping object.
매 child / sibling / return pointer 로 tree linkage (매 array 가 아닌 linked list).
import{useTransition,useState}from"react";exportfunctionSearch() {const[query,setQuery]=useState("");const[results,setResults]=useState<string[]>([]);const[isPending,startTransition]=useTransition();return(<><inputvalue={query}onChange={e=>{setQuery(e.target.value);// sync lane
startTransition(()=>setResults(filter(e.target.value)));// transition lane
}}/>{isPending?<Spinner/>:<Listitems={results}/>}</>);}
Suspense + use (React 19)
import{Suspense,use}from"react";functionProfile({promise}:{promise: Promise<User>}){constuser=use(promise);// 매 throw 시 Suspense fallback
return<h1>{user.name}</h1>;}exportdefault()=>(<Suspensefallback={<Skeleton/>}><Profilepromise={fetchUser()}/></Suspense>);
Server Component (RSC)
// app/page.tsx — 매 server fiber, payload 로 serialize
exportdefaultasyncfunctionPage() {constposts=awaitdb.posts.findMany();return<PostListposts={posts}/>;// 매 client 로는 RSC payload 전송
}
useDeferredValue
constdeferred=useDeferredValue(query);// 매 stale value 로 render, urgent update 우선
Lane priority debug (React DevTools)
Profiler tab → Highlight transitions → 매 어느 lane 에서 commit 됐는지 확인
매 결정 기준
상황
Approach
즉시 반영 input
직접 setState (sync lane)
무거운 list filter
startTransition (transition lane)
Async data 의 render
Suspense + use
Server-only data fetch
RSC (async function Page)
Stale UI 허용 + responsive
useDeferredValue
기본값: React 19 + RSC (Next.js App Router), client side 는 transition + Suspense.