"매 React 의 component re-render 의 최소화". 2026 React 19+ 매 React Compiler (auto-memo) 의 default 로 manual useMemo/useCallback 의 의미 약화. 매 measure first, optimize where needed.
매 핵심
매 Re-render Trigger
State change (useState, useReducer).
Parent re-render → child re-render (default).
Context value change → 매 consumer 전체 re-render.
Hook 의 internal state.
매 Tool (2026)
React Compiler (default in React 19+): 매 auto-memoization, useMemo/useCallback 거의 불필요.
React DevTools Profiler: 매 flame graph 로 re-render cost.
why-did-you-render: 매 dev-time unnecessary re-render 감지.
React Scan: 매 visual highlight (real-time).
매 핵심 기법
Component 분할 (state collocation).
React.memo (props equality).
useMemo / useCallback (compiler 가 대부분 자동).
Context split (frequently-changing 분리).
Virtualization (TanStack Virtual, react-window).
매 응용
Large list rendering: virtualization.
Form with many fields: react-hook-form register (uncontrolled).
Heavy chart: memo + Canvas/WebGL.
💻 패턴
React Compiler (default 2026)
// React 19 with Compiler — 매 manual memo 거의 불필요
functionExpensiveList({items,filter}:Props){constfiltered=items.filter(i=>i.name.includes(filter));// auto-memoized
return<ul>{filtered.map(i=><likey={i.id}>{i.name}</li>)}</ul>;}
매 State Collocation
// Bad: state in App, but only Modal needs it
functionApp() {const[modalOpen,setModalOpen]=useState(false);return(<><ExpensiveTree/>{/* re-renders on toggle */}<Modalopen={modalOpen}/></>);}// Good: state in wrapper
functionApp() {return(<><ExpensiveTree/><ModalWrapper/></>);}functionModalWrapper() {const[open,setOpen]=useState(false);return<Modalopen={open}/>;}
React.memo + useMemo 의 props
constChild=React.memo(({data}:{data: Item[]})=>{return<ul>{data.map(i=><likey={i.id}>{i.name}</li>)}</ul>;});functionParent({items,query}:Props){// Without compiler: useMemo necessary
constfiltered=useMemo(()=>items.filter(i=>i.name.includes(query)),[items,query]);return<Childdata={filtered}/>;}
Context Split
// Bad: single context, every change re-renders all
constAppContext=createContext({user: null,theme:'light',cart:[]});// Good: split by change frequency
constUserContext=createContext<User|null>(null);constThemeContext=createContext<Theme>('light');constCartContext=createContext<Cart>([]);
useSyncExternalStore (selector 의 fine-grained)
import{useSyncExternalStore}from'react';import{create}from'zustand';constuseStore=create<State>(()=>({count: 0,name:'a'}));functionCountDisplay() {// Only re-render on count change
constcount=useStore((s)=>s.count);return<div>{count}</div>;}