# [[React Performance Optimization]] ## πŸ“Œ Brief Summary React μ„±λŠ₯ μ΅œμ ν™”λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•˜κ³  λ²ˆλ“€ 크기λ₯Ό 쀄여 λΉ λ₯΄κ³  λΆ€λ“œλŸ¬μš΄ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•˜λŠ” 일련의 기법을 μ˜λ―Έν•©λ‹ˆλ‹€. μ£Όμš” μ΅œμ ν™” λŒ€μƒμœΌλ‘œλŠ” μƒνƒœ(state)λ‚˜ μ»΄ν¬λ„ŒνŠΈ 속성(props) 변경에 λ”°λ₯Έ λ Œλ”λ§ λΉ„μš©, λŒ€κ·œλͺ¨ 데이터 λͺ©λ‘ 처리, 그리고 κ±°λŒ€ν•œ JavaScript λ²ˆλ“€ λ‹€μš΄λ‘œλ“œ 등이 μžˆμŠ΅λ‹ˆλ‹€. μ΅œκ·Όμ—λŠ” κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ μ μš©ν•˜λŠ” λ©”λͺ¨μ΄μ œμ΄μ…˜ ν›…(`React.memo`, `useMemo`)뿐만 μ•„λ‹ˆλΌ, React Compilerλ₯Ό ν†΅ν•œ μžλ™ μ΅œμ ν™” 및 Next.js의 μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ(Server Components) 등을 ν™œμš©ν•΄ 초기 λ‘œλ“œ 속도와 λŸ°νƒ€μž„ μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•˜λŠ” λ°©ν–₯으둜 λ°œμ „ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ## πŸ“– Core Content * **λ¦¬λ Œλ”λ§μ˜ 이해 및 μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜** ReactλŠ” 기본적으둜 μƒνƒœλ‚˜ propsκ°€ 변경될 λ•Œ, λ˜λŠ” λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ  λ•Œ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μ‹œ λ Œλ”λ§ν•©λ‹ˆλ‹€ [1]. λΉˆλ²ˆν•˜κ³  λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ€ μ„±λŠ₯ μ €ν•˜μ˜ 주범이 λ˜λ―€λ‘œ, μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§ κ²°κ³Όλ₯Ό μΊμ‹±ν•˜λŠ” `React.memo()`λ₯Ό μ‚¬μš©ν•˜μ—¬ propsκ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ λ Œλ”λ§μ„ κ±΄λ„ˆλ›Έ 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 3]. λ˜ν•œ `useCallback`κ³Ό `useMemo`λ₯Ό μ‚¬μš©ν•΄ 객체와 ν•¨μˆ˜μ˜ μ°Έμ‘°λ₯Ό μ•ˆμ •μ μœΌλ‘œ μœ μ§€ν•¨μœΌλ‘œμ¨ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ˜ λΆˆν•„μš”ν•œ μ—…λ°μ΄νŠΈλ₯Ό λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [4-6]. 단, λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μœ„ν•œ 비ꡐ μ—°μ‚° μžμ²΄κ°€ μ˜€λ²„ν—€λ“œκ°€ 될 수 μžˆμœΌλ―€λ‘œ, 항상 ν”„λ‘œνŒŒμΌλ§μ„ 톡해 병λͺ©μ΄ ν™•μΈλœ κ³³μ—λ§Œ μ„ λ³„μ μœΌλ‘œ μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [4, 7, 8]. * **μƒνƒœ 관리와 React Context μ΅œμ ν™”** React의 λ‚΄μž₯ Context APIλŠ” μƒνƒœκ°€ 변경될 λ•Œ ν•΄λ‹Ή μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬λ…ν•˜λŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈμ˜ λ¦¬λ Œλ”λ§μ„ μœ λ°œν•˜λŠ” ꡬ쑰적 ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€ [9-12]. 이λ₯Ό μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄μ„œλŠ” μƒνƒœμ˜ λ„λ©”μΈλ³„λ‘œ μ»¨ν…μŠ€νŠΈλ₯Ό 잘게 μͺΌκ°œκ±°λ‚˜ [12], μ„ νƒμž(selector) νŒ¨ν„΄μ„ 톡해 μ»΄ν¬λ„ŒνŠΈκ°€ 관심 μžˆλŠ” νŠΉμ • μƒνƒœλ§Œ κ΅¬λ…ν•˜μ—¬ λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•˜λŠ” Zustand, Jotai 같은 μƒνƒœ 관리 라이브러리λ₯Ό λ„μž…ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [13-16]. * **μ½”λ“œ λΆ„ν• (Code Splitting) 및 μ§€μ—° λ‘œλ”©(Lazy Loading)** 초기 λ‘œλ”© 속도(LCP λ“±)λ₯Ό ν–₯μƒν•˜λ €λ©΄ λŒ€κ·œλͺ¨ JavaScript λ²ˆλ“€μ„ 더 μž‘μ€ 청크둜 λ‚˜λˆ„μ–΄μ•Ό ν•©λ‹ˆλ‹€ [17, 18]. `React.lazy()`와 `Suspense`λ₯Ό ν™œμš©ν•˜λ©΄ νŠΉμ • λΌμš°νŠΈλ‚˜ 무거운 μ»΄ν¬λ„ŒνŠΈ(차트, 에디터 λ“±)λ₯Ό μ‚¬μš©μžκ°€ ν•„μš”λ‘œ ν•  λ•Œλ§Œ λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [19-21]. λ˜ν•œ Vite와 같은 μ΅œμ‹  λΉŒλ“œ λ„κ΅¬μ˜ `manualChunks` 섀정을 톡해 변경이 적은 벀더 라이브러리(React μ½”μ–΄ λͺ¨λ“ˆ λ“±)λ₯Ό λ³„λ„μ˜ 청크둜 λΆ„λ¦¬ν•˜λ©΄ λΈŒλΌμš°μ € 캐싱 νš¨μœ¨μ„ 크게 높일 수 μžˆμŠ΅λ‹ˆλ‹€ [21-23]. * **λŒ€κ·œλͺ¨ λͺ©λ‘ 가상화(Virtualization)** μˆ˜λ°±μ—μ„œ 수천 개의 ν•­λͺ©μ΄ ν¬ν•¨λœ κΈ΄ λͺ©λ‘μ„ λ Œλ”λ§ν•  경우, DOM λΉ„λŒ€ν™”λ‘œ 인해 μ‹¬κ°ν•œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•©λ‹ˆλ‹€ [24, 25]. `react-window`와 같은 라이브러리λ₯Ό μ‚¬μš©ν•΄ μ‚¬μš©μžμ˜ ν™”λ©΄(viewport)에 λ³΄μ΄λŠ” ν•­λͺ©λ§Œ λ™μ μœΌλ‘œ λ Œλ”λ§ν•˜λŠ” 가상화(Windowing) 기법을 μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [24, 26, 27]. λ”λΆˆμ–΄ λͺ©λ‘ ν•­λͺ©μ„ λ Œλ”λ§ν•  λ•ŒλŠ” κ³ μœ ν•˜κ³  μ•ˆμ •μ μΈ `key` 값을 λΆ€μ—¬ν•˜μ—¬ React의 μž¬μ‘°μ •(Reconciliation) κ³Όμ •μ—μ„œ λ°œμƒν•˜λŠ” λ Œλ”λ§ λΉ„μš©μ„ 쀄여야 ν•©λ‹ˆλ‹€ [28]. * **λ™μ‹œμ„± κΈ°λŠ₯(Concurrent Features) ν™œμš©** React 18 μ΄μƒμ—μ„œ μ œκ³΅ν•˜λŠ” λ™μ‹œμ„± κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ UI의 응닡성을 높일 수 μžˆμŠ΅λ‹ˆλ‹€ [29, 30]. `useTransition` 훅을 μ‚¬μš©ν•΄ 덜 μ€‘μš”ν•œ λ Œλ”λ§ μ—…λ°μ΄νŠΈλ₯Ό μ§€μ—°μ‹œν‚€κ³ , μ‚¬μš©μžμ˜ νƒ€μ΄ν•‘μ΄λ‚˜ 클릭 λ“± μ€‘μš” μƒν˜Έμž‘μš©μ΄ λŠκΉ€ 없이 μ²˜λ¦¬λ˜λ„λ‘ μš°μ„ μˆœμœ„λ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [31, 32]. * **μžλ™ν™”λœ μ΅œμ ν™” 도ꡬ: React Compiler & Server Components** 2025λ…„ κΈ°μ€€ React μƒνƒœκ³„μ˜ μ£Όμš” λ³€ν™”λ‘œ, λΉŒλ“œ λ‹¨κ³„μ—μ„œ μžλ™μœΌλ‘œ μ½”λ“œλ₯Ό λΆ„μ„ν•˜κ³  κ°œλ³„ JSX μš”μ†Œμ™€ 연산을 μ„ΈλΆ„ν™”ν•˜μ—¬ μΊμ‹±ν•˜λŠ” React Compilerκ°€ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€ [33, 34]. 이 μ»΄νŒŒμΌλŸ¬λŠ” μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜μ˜ μœ μ§€λ³΄μˆ˜ 문제λ₯Ό ν•΄κ²°ν•˜κ³  μ„±λŠ₯을 μ΅œμ ν™”ν•©λ‹ˆλ‹€ [35, 36]. ν•œνŽΈ Next.jsμ—μ„œλŠ” μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ(Server Components)λ₯Ό ν™œμš©ν•΄ μƒν˜Έμž‘μš©μ΄ μ—†λŠ” 정적 UIλ₯Ό μ„œλ²„μ—μ„œ μ „μ μœΌλ‘œ λ Œλ”λ§ν•¨μœΌλ‘œμ¨ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘λ˜λŠ” JavaScript의 양을 획기적으둜 쀄여 초기 ꡬ동 μ‹œκ°„μ„ κ°œμ„ ν•©λ‹ˆλ‹€ [37-39]. ## πŸ”— Knowledge Connections - **Related Topics:** [[React State Management]], [[Clean Code Principles]], [[Debugging Frontend Applications]], [[Scalable React Architecture]], [[React Compiler]] - **Projects/Contexts:** [[Next.js App Router]], [[Vite Build Tool]], [[Zustand]], [[React DevTools Profiler]] - **Contradictions/Notes:** λ§Žμ€ κ°œλ°œμžκ°€ μŠ΅κ΄€μ μœΌλ‘œ `useCallback`μ΄λ‚˜ `useMemo`λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, μ†ŒμŠ€μ—μ„œλŠ” 비ꡐ μ—°μ‚° μ˜€λ²„ν—€λ“œλ‘œ 인해 잘λͺ» μ‚¬μš©λ  경우 였히렀 μ„±λŠ₯이 μ €ν•˜λ  수 μžˆλ‹€κ³  κ²½κ³ ν•©λ‹ˆλ‹€ [7, 8]. λ˜ν•œ 졜근 정식 λ„μž…λœ React Compilerκ°€ μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ λŒ€μ‹  μ²˜λ¦¬ν•΄μ£Όμ–΄ `React.memo` λ“±μ˜ μ‚¬μš©μ΄ λΆˆν•„μš”ν•΄μ§€λŠ” μΆ”μ„Έμž„μ΄ κ°•μ‘°λ©λ‹ˆλ‹€ [22, 33, 40]. --- *Last updated: 2026-04-26*