# [[Re-renders Optimization|Re-renders Optimization]] ## πŸ“Œ Brief Summary Re-renders Optimization은 React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λΆˆν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈ μ—…λ°μ΄νŠΈλ₯Ό μ΅œμ†Œν™”ν•˜μ—¬ μ„±λŠ₯, λ°˜μ‘μ„± 및 μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚€λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [1, 2]. 주둜 μƒνƒœ(state), 속성(props), μ»¨ν…μŠ€νŠΈ(context)의 λ³€κ²½μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” κ³Όλ„ν•œ λ Œλ”λ§μ„ νƒ€κ²ŸμœΌλ‘œ ν•©λ‹ˆλ‹€ [3]. 이λ₯Ό μœ„ν•΄ μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜, μƒνƒœ 관리 μ΅œμ ν™”, 가상화 기법, 그리고 React Compiler와 같은 μ΅œμ‹  μžλ™ν™” 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ 병λͺ© ν˜„μƒμ„ λ°©μ§€ν•©λ‹ˆλ‹€ [4-6]. ## πŸ“– Core Content * **λ¦¬λ Œλ”λ§μ˜ 원인과 μ„±λŠ₯적 영ν–₯:** React μ»΄ν¬λ„ŒνŠΈλŠ” λ‚΄λΆ€ μƒνƒœ(state) λ³€κ²½, 속성(props) λ³€κ²½, ꡬ독 쀑인 μ»¨ν…μŠ€νŠΈ(context) κ°’ λ³€κ²½, ν˜Ήμ€ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§λ  λ•Œ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€ [3]. λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ΄ λˆ„μ λ˜λ©΄ UI λ°˜μ‘μ„± μ €ν•˜, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 증가, μƒν˜Έμž‘μš©μ„±(TTI) μ§€μ—° 등을 μ΄ˆλž˜ν•˜λ©°, κΉŠμ€ μ»΄ν¬λ„ŒνŠΈ νŠΈλ¦¬μ—μ„œλŠ” μŠ€ν¬λ¦½νŒ… μ‹œκ°„μ„ 30~60%κΉŒμ§€ μ¦κ°€μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€ [2]. * **μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜ (Manual Memoization):** `React.memo()`λ₯Ό μ‚¬μš©ν•˜λ©΄ propsκ°€ λ³€κ²½λ˜μ§€ μ•Šμ€ 경우 이전 λ Œλ”λ§ κ²°κ³Όλ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ λ Œλ”λ§ 횟수λ₯Ό 30~50%κ°€λŸ‰ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€ [7, 8]. 이와 ν•¨κ»˜ `useCallback`κ³Ό `useMemo` 훅을 μ‚¬μš©ν•˜μ—¬ κ°μ²΄λ‚˜ ν•¨μˆ˜μ˜ μ°Έμ‘° 동등성(Reference Equality)을 μœ μ§€ν•΄μ•Ό μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ λΆˆν•„μš”ν•œ λ Œλ”λ§μ„ 막을 수 μžˆμŠ΅λ‹ˆλ‹€ [9, 10]. 단, λ¬΄λΆ„λ³„ν•œ μ‚¬μš©μ€ 비ꡐ μ—°μ‚°μ˜ μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œν‚€λ―€λ‘œ ν”„λ‘œνŒŒμΌλ§μ„ 톡해 ν™•μΈλœ 병λͺ© κ΅¬κ°„μ—λ§Œ μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [11, 12]. * **μ»¨ν…μŠ€νŠΈ μ΅œμ ν™” (Context Optimization):** React의 κΈ°λ³Έ Context APIλŠ” κ°’μ˜ μΌλΆ€λ§Œ λ³€κ²½λ˜μ–΄λ„ ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬λ…ν•˜λŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλ₯Ό λ¦¬λ Œλ”λ§ν•©λ‹ˆλ‹€ [13, 14]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ»¨ν…μŠ€νŠΈλ₯Ό μž‘μ€ 도메인 λ‹¨μœ„λ‘œ μͺΌκ°œκ±°λ‚˜ [15], μ„ νƒμž(Selector)λ₯Ό 톡해 μƒνƒœμ˜ νŠΉμ • 쑰각이 변경될 λ•Œλ§Œ λ¦¬λ Œλ”λ§μ„ νŠΈλ¦¬κ±°ν•˜λŠ” Zustand, Jotai λ“±μ˜ μ™ΈλΆ€ μƒνƒœ 관리 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [16-18]. * **React Compiler의 λ„μž…:** λΉŒλ“œ νƒ€μž„ μ΅œμ ν™” 도ꡬ인 React CompilerλŠ” μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜(`useMemo`, `useCallback`, `React.memo`) μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ 컴파일 λ‹¨κ³„μ—μ„œ μžλ™μœΌλ‘œ 캐싱 λ‘œμ§μ„ μ‚½μž…ν•©λ‹ˆλ‹€ [4, 19]. μ»΄ν¬λ„ŒνŠΈ 전체가 μ•„λ‹Œ κ°œλ³„ JSX μš”μ†Œ λ‹¨μœ„λ‘œ μ„ΈλΆ„ν™”ν•˜μ—¬ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μˆ˜ν–‰ν•¨μœΌλ‘œμ¨, μ½”λ“œμ˜ 가독성을 높이고 λΆˆν•„μš”ν•œ λ Œλ”λ§μ„ μ›μ²œμ μœΌλ‘œ μ°¨λ‹¨ν•©λ‹ˆλ‹€ [19, 20]. * **λ Œλ”λ§ νŒ¨ν„΄ 및 λ™μ‹œμ„± μ΅œμ ν™”:** 수백 개 μ΄μƒμ˜ ν•­λͺ©μ„ λ Œλ”λ§ν•˜λŠ” λŒ€κ·œλͺ¨ λ¦¬μŠ€νŠΈμ—μ„œλŠ” κ³ μœ ν•˜κ³  μ•ˆμ •μ μΈ `key` 속성을 λΆ€μ—¬ν•˜κ³ , 화면에 λ³΄μ΄λŠ” ν•­λͺ©λ§Œ λ Œλ”λ§ν•˜λŠ” 가상화(Windowing) 라이브러리(예: `react-window`)λ₯Ό μ μš©ν•˜μ—¬ DOM μ˜€λ²„ν—€λ“œλ₯Ό 쀄여야 ν•©λ‹ˆλ‹€ [6, 21]. λ˜ν•œ JSX 내뢀에 읡λͺ… ν•¨μˆ˜λ₯Ό 직접 μž‘μ„±ν•˜λ©΄ λ§€ λ Œλ”λ§λ§ˆλ‹€ μƒˆλ‘œμš΄ μ°Έμ‘°κ°€ μƒμ„±λ˜λ―€λ‘œ μ§€μ–‘ν•΄μ•Ό ν•©λ‹ˆλ‹€ [22, 23]. λΆ€κ°€μ μœΌλ‘œ `useTransition` 및 `useDeferredValue`와 같은 λ™μ‹œμ„± κΈ°λŠ₯을 ν™œμš©ν•΄ 무거운 μ—…λ°μ΄νŠΈλ₯Ό μ§€μ—°μ‹œν‚€κ³  μ‚¬μš©μž μž…λ ₯에 λŒ€ν•œ UI λ°˜μ‘μ„±μ„ μš°μ„ μˆœμœ„μ— λ‘˜ 수 μžˆμŠ΅λ‹ˆλ‹€ [24, 25]. ## πŸ”— Knowledge Connections ### Related Concepts - [[React Compiler|React Compiler]] - μ—°κ²° 이유: κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ λ¦¬λ Œλ”λ§μ„ μ΅œμ ν™”ν•˜λ˜ κΈ°μ‘΄ 방식을 λŒ€μ²΄ν•˜μ—¬, λΉŒλ“œ νƒ€μž„μ— μžλ™μœΌλ‘œ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μ μš©ν•˜λŠ” 2025λ…„ κΈ°μ€€ 핡심 기술이기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [4]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ»΄ν¬λ„ŒνŠΈ 전체가 μ•„λ‹Œ κ°œλ³„ JSX μš”μ†Œμ™€ 연산이 μ–΄λ–»κ²Œ λ…λ¦½μ μœΌλ‘œ μΊμ‹±λ˜λŠ”μ§€μ˜ 원리와 μ„œλ“œνŒŒν‹° 라이브러리 ν˜Έν™˜μ„± ν•œκ³„ [19, 26]. - State Management (Zustand vs Context) - μ—°κ²° 이유: λΆˆν•„μš”ν•œ 전체 λ¦¬λ Œλ”λ§μ„ μœ λ°œν•˜λŠ” Context API의 ꡬ쑰적 ν•œκ³„λ₯Ό Zustand의 μ„ νƒμž(Selector) νŒ¨ν„΄μ΄ μ–΄λ–»κ²Œ κ·Ήλ³΅ν•˜μ—¬ λ Œλ”λ§μ„ μ΅œμ ν™”ν•˜λŠ”μ§€ μ„€λͺ…ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ [13, 17]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 자주 λ³€κ²½λ˜λŠ” μ „μ—­ μƒνƒœ κ΄€λ¦¬μ—μ„œ React λ Œλ”λ§ 사이클 μ™ΈλΆ€μ˜ μŠ€ν† μ–΄κ°€ μ–΄λ–»κ²Œ μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§μ„ μ •λ°€ν•˜κ²Œ μ œμ–΄ν•˜λŠ”μ§€ [17, 27]. - Memoization (useMemo, useCallback) - μ—°κ²° 이유: React의 얕은 비ꡐ(Shallow comparison) νŠΉμ„±μ„ κ·Ήλ³΅ν•˜κ³  μ°Έμ‘° 동등성을 μœ μ§€ν•˜μ—¬ `React.memo`와 κ²°ν•©ν•œ λ¦¬λ Œλ”λ§ μ΅œμ ν™”μ˜ 기반이 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [10]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ¬΄λΆ„λ³„ν•œ λ©”λͺ¨μ΄μ œμ΄μ…˜μ΄ 였히렀 λ Œλ”λ§ λΉ„μš©λ³΄λ‹€ 큰 μ„±λŠ₯ μ˜€λ²„ν—€λ“œλ₯Ό μœ λ°œν•˜λŠ” μ΄μœ μ™€ μ˜¬λ°”λ₯Έ 적용 쑰건 [11, 12]. ### Deeper Research Questions - React Compilerκ°€ 적용된 ν™˜κ²½μ—μ„œ κΈ°μ‘΄ `React.memo`, `useMemo`, `useCallback`으둜 μž‘μ„±λœ μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜ μ½”λ“œλŠ” μ–΄λ–€ λ°©μ‹μœΌλ‘œ λ¦¬νŒ©ν† λ§λ˜κ±°λ‚˜ 곡쑴해야 ν•˜λŠ”κ°€? - Context APIλ₯Ό λ‹€μˆ˜μ˜ μž‘μ€ λ„λ©”μΈμœΌλ‘œ λΆ„ν• ν•˜λŠ” μ•„ν‚€ν…μ²˜μ™€ Zustandλ₯Ό λ„μž…ν•˜μ—¬ μ„ νƒμžλ₯Ό μ‚¬μš©ν•˜λŠ” μ•„ν‚€ν…μ²˜ κ°„μ˜ λ Œλ”λ§ μ„±λŠ₯ 및 μœ μ§€λ³΄μˆ˜μ„± νŠΈλ ˆμ΄λ“œμ˜€ν”„λŠ” 무엇인가? - λŒ€κ·œλͺ¨ λ¦¬μŠ€νŠΈμ—μ„œ μ•ˆμ •μ μΈ `key` 속성 뢀여와 가상화(Windowing) 기법을 ν•¨κ»˜ μ μš©ν•  λ•Œ, DOM λ…Έλ“œ 관리와 λ©”λͺ¨λ¦¬ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ μΈ‘λ©΄μ—μ„œ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–€ μ΅œμ ν™”κ°€ λ°œμƒν•˜λŠ”κ°€? - JSX λ‚΄ 읡λͺ… ν•¨μˆ˜ μ‚¬μš©μ΄ μœ λ°œν•˜λŠ” μ°Έμ‘° λ³€κ²½(Reference change) 문제λ₯Ό `useCallback` 외에 μ»΄ν¬λ„ŒνŠΈ μ™ΈλΆ€ μ„ μ–Έ 방식 λ“±μœΌλ‘œ ν•΄κ²°ν•  λ•Œ λ°œμƒν•˜λŠ” μƒνƒœ μ ‘κ·Όμ„± μ œμ•½μ€ μ–΄λ–»κ²Œ 극볡할 수 μžˆλŠ”κ°€? - `useTransition`κ³Ό `useDeferredValue`λ₯Ό ν™œμš©ν•œ λ™μ‹œμ„± λ Œλ”λ§(Concurrent rendering)이 λ¦¬λ Œλ”λ§μ„ μ°¨λ‹¨ν•˜μ§€ μ•Šκ³  μ§€μ—°μ‹œν‚¬ λ•Œ, 무거운 연산이 메인 μŠ€λ ˆλ“œλ₯Ό μ μœ ν•˜λŠ” ν•œκ³„λŠ” μ–΄λ–»κ²Œ 보완할 수 μžˆλŠ”κ°€? ### Practical Application Contexts - **Implementation:** 무거운 μ»΄ν¬λ„ŒνŠΈλ‚˜ μžμ‹μ—κ²Œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜/객체 prop에 λŒ€ν•΄ `React.memo()`, `useCallback`, `useMemo`λ₯Ό μ„ νƒμ μœΌλ‘œ μ μš©ν•˜μ—¬ λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•©λ‹ˆλ‹€ [7, 10]. λŒ€κ·œλͺ¨ 리슀트 κ΅¬ν˜„ μ‹œ `react-window`λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€ [6]. - **System Design:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „μ—­ μƒνƒœλ₯Ό 섀계할 λ•Œ, ν…Œλ§ˆλ‚˜ λ‹€κ΅­μ–΄μ²˜λŸΌ 변경이 적은 정적 λ°μ΄ν„°λŠ” Context APIλ₯Ό, μ•Œλ¦Όμ΄λ‚˜ μž₯λ°”κ΅¬λ‹ˆμ²˜λŸΌ λΉˆλ²ˆν•˜κ²Œ λ³€κ²½λ˜λŠ” 동적 λ°μ΄ν„°λŠ” λΆ€λΆ„ ꡬ독(Selector)을 μ§€μ›ν•˜λŠ” μ™ΈλΆ€ μƒνƒœ 라이브러리(Zustand λ“±)둜 μ„€κ³„ν•˜μ—¬ λ Œλ”λ§ λ²”μœ„λ₯Ό μ œν•œν•©λ‹ˆλ‹€ [18, 28, 29]. - **Operation / Maintenance:** React DevTools Profiler, `why-did-you-render` 라이브러리, Chrome DevTools Performance Tab을 ν™œμš©ν•˜μ—¬ ν”„λ‘œλ•μ…˜ 배포 μ „ 및 운영 쀑에 λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§κ³Ό κ·Έ 원인을 μ§€μ†μ μœΌλ‘œ μΈ‘μ •ν•˜κ³  κ°œμ„ ν•©λ‹ˆλ‹€ [30-32]. - **Learning Path:** React의 κΈ°λ³Έ λ Œλ”λ§ λ™μž‘ 원리(μƒνƒœ, props, μ°Έμ‘° 동등성)λ₯Ό λ¨Όμ € ν•™μŠ΅ν•˜κ³  μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜μ˜ λΉ„μš©μ„ μ΄ν•΄ν•œ λ’€, λ™μ‹œμ„± κΈ°λŠ₯(Concurrent Features)κ³Ό React Compilerλ₯Ό ν†΅ν•œ μžλ™ν™” μ΅œμ ν™” νŒ¨λŸ¬λ‹€μž„μœΌλ‘œ 지식을 ν™•μž₯ν•©λ‹ˆλ‹€ [5]. - **My Project Relevance:** ν˜„μž¬ μœ μ§€λ³΄μˆ˜ν•˜κ±°λ‚˜ μƒˆλ‘œ κ΅¬μΆ•ν•˜λŠ” React ν”„λ‘œμ νŠΈμ—μ„œ μ„±λŠ₯ μ €ν•˜λ₯Ό κ²ͺκ³  μžˆλ‹€λ©΄, 읡λͺ… ν•¨μˆ˜ 인라인 μž‘μ„± νŒ¨ν„΄μ„ μˆ˜μ •ν•˜κ³ , λΆˆν•„μš”ν•œ κ±°λŒ€ Contextλ₯Ό λΆ„λ¦¬ν•˜λ©°, 식별 κ°€λŠ₯ν•œ 병λͺ© 지점에 ν”„λ‘œνŒŒμΌλ§ 기반의 λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μ μš©ν•΄ 즉각적인 μ„±λŠ₯ κ°œμ„ μ„ 이룰 수 μžˆμŠ΅λ‹ˆλ‹€ [5, 15, 22]. ### Adjacent Topics - Core Web Vitals (INP, FCP, TTI) - ν™•μž₯ λ°©ν–₯: ν”„λ‘ νŠΈμ—”λ“œ μ½”λ“œμ˜ λ¦¬λ Œλ”λ§ μ΅œμ ν™”κ°€ μ‹€μ œ μ‚¬μš©μžμ˜ 체감 μ„±λŠ₯을 μΈ‘μ •ν•˜λŠ” μ§€ν‘œ(특히 Interaction to Next Paint)에 λΈŒλΌμš°μ € λ ˆλ²¨μ—μ„œ μ–΄λ–€ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€ ν™•μž₯ν•˜μ—¬ μ‘°μ‚¬ν•©λ‹ˆλ‹€ [2, 33]. - Code Splitting & Lazy Loading - ν™•μž₯ λ°©ν–₯: μ»΄ν¬λ„ŒνŠΈ μ—…λ°μ΄νŠΈ μ‹œμ (λ¦¬λ Œλ”λ§)의 μ΅œμ ν™”λΏλ§Œ μ•„λ‹ˆλΌ, μ»΄ν¬λ„ŒνŠΈ 졜초 λ‘œλ“œ μ‹œμ μ˜ λ²ˆλ“€ 크기λ₯Ό 쀄여 초기 λ Œλ”λ§ μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•˜λŠ” `React.lazy`와 동적 μž„ν¬νŠΈ 기법을 ν•¨κ»˜ ν•™μŠ΅ν•©λ‹ˆλ‹€ [34]. --- *Last updated: 2026-04-30*