# [[Legacy React Code Refactoring]] ## πŸ“Œ Brief Summary λ ˆκ±°μ‹œ React μ½”λ“œ λ¦¬νŒ©ν† λ§μ€ κΈ°μ‘΄ μ½”λ“œμ˜ λ™μž‘ 방식을 κ·ΈλŒ€λ‘œ λ³΄μ‘΄ν•˜λ©΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ쑰, 가독성, μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚€λŠ” 체계적인 κ³Όμ •μž…λ‹ˆλ‹€ [1]. μ΄λŠ” λ‹¨μˆœνžˆ μ½”λ“œλ₯Ό κ³ μΉ˜λŠ”(fixing) μž‘μ—…μ΄ μ•„λ‹ˆλΌ 점진적인 ꡬ쑰 κ°œμ„ μ„ λͺ©ν‘œλ‘œ ν•˜λ©°, ν…ŒμŠ€νŠΈ μž‘μ„±μ„ 톡해 μ‹œμŠ€ν…œμ„ λ³΄ν˜Έν•˜λŠ” κ²ƒμ—μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€ [1, 2]. μ£Όμš” μ ‘κ·Όλ²•μœΌλ‘œλŠ” 클래슀 기반 μ»΄ν¬λ„ŒνŠΈμ˜ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μ „ν™˜, μ»€μŠ€ν…€ ν›…(Custom Hooks)을 ν†΅ν•œ 둜직 뢄리, μƒνƒœ 관리 λ„κ΅¬μ˜ ν˜„λŒ€ν™” 등이 μžˆμŠ΅λ‹ˆλ‹€ [3, 4]. ## πŸ“– Core Content * **ν…ŒμŠ€νŠΈ 기반의 λ¦¬νŒ©ν† λ§ μ‹œμž‘** λ¦¬νŒ©ν† λ§μ„ μˆ˜ν–‰ν•  λ•Œ κ°€μž₯ μš°μ„ μ‹œν•΄μ•Ό ν•  μž‘μ—…μ€ λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit test)λ₯Ό μž‘μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ [2]. ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©΄ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λŠ” κ³Όμ •μ—μ„œ κΈ°μ‘΄ κΈ°λŠ₯이 λ§κ°€μ§€λŠ” 것을 μ¦‰κ°μ μœΌλ‘œ νŒŒμ•…ν•  수 있으며, κΈ°μ‘΄ 앱이 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ κ°•μ œλ‘œ ν•™μŠ΅ν•  수 μžˆλŠ” 이점도 μžˆμŠ΅λ‹ˆλ‹€ [2, 5]. TypeScript둜의 μ „ν™˜μ΄λ‚˜ 라이브러리 μ—…κ·Έλ ˆμ΄λ“œ μ‹œ UI ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό μž‘μ„±ν•˜μ—¬ νšŒκ·€(Regression) 였λ₯˜λ₯Ό λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [6]. * **ꡬ쑰 및 μƒνƒœ 관리 ν˜„λŒ€ν™”** * **점진적 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜:** κΈ°μ‘΄ 기술(예: Context API)μ—μ„œ μƒˆλ‘œμš΄ 도ꡬ(예: Zustand)둜 μ „ν™˜ν•  λ•Œ ν•œ λ²ˆμ— λͺ¨λ“  것을 μž¬μž‘μ„±(Rewrite)ν•˜λŠ” 것은 μœ„ν—˜ν•˜λ―€λ‘œ, μ•Œλ¦Ό κΈ°λŠ₯κ³Ό 같은 λ‹¨μˆœν•œ μœ ν‹Έλ¦¬ν‹°μ—μ„œ μ‹œμž‘ν•΄ 점차 λ³΅μž‘ν•œ μ˜μ—­μœΌλ‘œ ν™•μž₯ν•˜λŠ” 점진적 접근이 ν•„μš”ν•©λ‹ˆλ‹€ [1]. * **클래슀 μ»΄ν¬λ„ŒνŠΈ 제거:** κΈ°μ‘΄ 클래슀 기반 μ»΄ν¬λ„ŒνŠΈλ“€μ„ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ 및 ν›…(Hooks) ꡬ쑰둜 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€ [4]. * **μƒνƒœ 관리 도ꡬ 뢄리:** λΆˆν•„μš”ν•œ `useEffect` μ‚¬μš©μ„ μ œκ±°ν•˜κ³ , μ„œλ²„ μƒνƒœ κ΄€λ¦¬μ—λŠ” TanStack Queryλ₯Ό λ„μž…ν•˜μ—¬ 기쑴의 λ³΅μž‘ν•œ Redux κ΅¬ν˜„μ„ κ±·μ–΄λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ „μ—­ ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœλŠ” Contextλ‚˜ Zustand둜 κ΄€λ¦¬ν•˜κ³ , 둜컬 μƒνƒœλŠ” ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ—λ§Œ κ΅­ν•œν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [4]. * **μ»€μŠ€ν…€ 훅을 ν™œμš©ν•œ 둜직 뢄리 및 μ±…μž„ λΆ„λ°°** 였래된 μ½”λ“œλ² μ΄μŠ€μ˜ 큰 문제 쀑 ν•˜λ‚˜λŠ” 단일 μ»΄ν¬λ„ŒνŠΈ μ•ˆμ— λ‹€μ–‘ν•œ μ±…μž„μ΄ ν˜Όμž¬λ˜μ–΄ μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€ [7]. ν˜„λŒ€ React λ¦¬νŒ©ν† λ§μ˜ 핡심 λ‹¨μœ„λŠ” 'μ»€μŠ€ν…€ ν›…(Custom Hooks)'μž…λ‹ˆλ‹€ [3]. λ°©λŒ€ν•œ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 데이터 νŒ¨μΉ­μ΄λ‚˜ 폼 핸듀링과 같은 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ»€μŠ€ν…€ ν›…μœΌλ‘œ μΆ”μΆœν•˜λ©΄, UI와 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λΆ„λ¦¬λ˜μ–΄ λ…λ¦½μ μœΌλ‘œ 더 λΉ λ₯Έ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•  수 있게 λ©λ‹ˆλ‹€ [3]. * **클린 μ½”λ“œμ™€ 일관성 κ°•μ œ** * **μŠ€νƒ€μΌλ§ ν‘œμ€€ν™”:** 인라인 μŠ€νƒ€μΌ, μ™ΈλΆ€ CSS, sx λ“± λ¬΄λΆ„λ³„ν•˜κ²Œ 혼재된 CSS 적용 방식을 단일 ν‘œμ€€(예: Plain CSS, CSS Modules λ“±)으둜 톡일해야 ν•©λ‹ˆλ‹€ [8-10]. * **원칙 적용:** 'DRY(Don't Repeat Yourself)' 및 'YAGNI(You Aren't Gonna Need It)' 원칙을 λ°”νƒ•μœΌλ‘œ μ½”λ“œλ₯Ό κ°œμ„ ν•˜κ³ , λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…κ³Ό λŒμ—°λ³€μ΄(Mutation)λ₯Ό λ°©μ§€ν•˜λ©° λͺ…ν™•ν•œ λ³€μˆ˜λͺ…을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [11]. * **κ±°λ²„λ„ŒμŠ€ 도ꡬ λ„μž…:** ESLint(특히 `eslint-plugin-react`, `eslint-plugin-react-hooks`)λ₯Ό λ„μž…ν•˜μ—¬ 개발 λͺ¨λ²” 사둀λ₯Ό κ°•μ œν•¨μœΌλ‘œμ¨ μ½”λ“œλ² μ΄μŠ€ 전체에 κ·œμΉ™μ„ μΌκ΄€λ˜κ²Œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [12]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Unit Testing]], [[Custom Hooks]], [[State Management Migration]], [[Clean Code Principles]] - **Projects/Contexts:** [[Frontend System Architecture]], [[Legacy Code Modernization]] - **Contradictions/Notes:** 일반적으둜 전체λ₯Ό ν•œ λ²ˆμ— μƒˆλ‘œ μ§œλŠ” κ²ƒλ³΄λ‹€λŠ” κΈ°μ‘΄ κΈ°λŠ₯ κ°œλ°œμ„ μ§€μ†ν•˜λ©΄μ„œ μ μ§„μ μœΌλ‘œ κ°œμ„ (Refactor)ν•˜λŠ” 것이 ꢌμž₯λ˜μ§€λ§Œ [1], μ½”λ“œλ² μ΄μŠ€μ˜ 규λͺ¨κ°€ 맀우 μž‘μ„ κ²½μš°μ—λŠ” μ•„μ˜ˆ μ²˜μŒλΆ€ν„° λ‹€μ‹œ μž‘μ„±ν•˜λŠ” 것이 더 μ‰¬μšΈ μˆ˜λ„ μžˆλ‹€λŠ” μ˜κ²¬λ„ μ‘΄μž¬ν•©λ‹ˆλ‹€ [6]. --- *Last updated: 2026-04-26*