# [[Frontend Refactoring]] ## πŸ“Œ Brief Summary ν”„λ‘ νŠΈμ—”λ“œ λ¦¬νŒ©ν† λ§μ€ κΈ°μ‘΄ ν”„λ‘ νŠΈμ—”λ“œ μ½”λ“œλ² μ΄μŠ€μ˜ μ™ΈλΆ€ λ™μž‘μ„ λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ ꡬ쑰, μœ μ§€λ³΄μˆ˜μ„±, ν’ˆμ§ˆμ„ κ°œμ„ ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [1]. 이 κ³Όμ •μ—λŠ” κ±°λŒ€ν•œ μ»΄ν¬λ„ŒνŠΈμ˜ λΆ„ν• , λ ˆκ±°μ‹œ μ½”λ“œ(예: ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈ)의 ν˜„λŒ€ν™”, 더 λ‚˜μ€ μƒνƒœ 관리 및 μ•„ν‚€ν…μ²˜ 경계 λ„μž… 등이 ν¬ν•¨λ©λ‹ˆλ‹€ [2, 3]. 점진적인 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ „λž΅μ„ μ‚¬μš©ν•˜κ³  사전에 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•¨μœΌλ‘œμ¨ κ°œλ°œμžλŠ” 기술 뢀채λ₯Ό μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [1, 4]. ## πŸ“– Core Content * **사전 μ€€λΉ„ 및 ν…ŒμŠ€νŠΈ:** λ¦¬νŒ©ν† λ§μ„ μ‹œμž‘ν•˜κΈ° 전에 μ½”λ“œ λ³€κ²½μœΌλ‘œ 인해 κΈ°μ‘΄ κΈ°λŠ₯이 μ†μƒλ˜μ§€ μ•Šλ„λ‘ λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit Test)λ‚˜ UI ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € μž‘μ„±ν•˜λŠ” 것이 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [4-6]. λ˜ν•œ 본격적인 λ¦¬νŒ©ν† λ§μ— μ•žμ„œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, μ „μ—­ μƒνƒœ, λΌμš°νŒ… 및 API 호좜 ꡬ쑰λ₯Ό νŒŒμ•…ν•˜μ—¬ ν”„λ‘œμ νŠΈμ— λŒ€ν•œ λ©˜νƒˆ λͺ¨λΈμ„ λͺ…ν™•νžˆ ꡬ좕해야 ν•©λ‹ˆλ‹€ [7, 8]. * **점진적 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ (Incremental Migration):** μ „λ©΄ μž¬μž‘μ„±(Rewrite)의 μœ„ν—˜μ„ ν”Όν•˜κΈ° μœ„ν•΄ λ¦¬νŒ©ν† λ§μ€ "μž¬μž‘μ„±ν•˜μ§€ 말고 λ¦¬νŒ©ν† λ§ν•˜λΌ"λŠ” 철학에 따라 μ μ§„μ μœΌλ‘œ 이루어져야 ν•©λ‹ˆλ‹€ [1]. 예λ₯Ό λ“€μ–΄ Context APIμ—μ„œ Zustand둜 μ „ν™˜ν•  λ•Œ, 전체 μ½”λ“œλ₯Ό ν•œ λ²ˆμ— λ°”κΎΈκΈ°λ³΄λ‹€λŠ” μ•Œλ¦Όκ³Ό 같은 λ‹¨μˆœν•œ μœ ν‹Έλ¦¬ν‹°λΆ€ν„° μ‹œμž‘ν•΄ 결제 흐름 같은 λ³΅μž‘ν•œ λ„λ©”μΈμœΌλ‘œ ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μŠ€ν† μ–΄μ”© λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [1]. * **μ½”λ“œλ² μ΄μŠ€ ν˜„λŒ€ν™”:** λ ˆκ±°μ‹œ React 앱을 λ¦¬νŒ©ν† λ§ν•  λ•Œ μˆ˜ν–‰ν•΄μ•Ό ν•  μ£Όμš” μž‘μ—…μœΌλ‘œλŠ” TypeScript둜의 μ „ν™˜, 클래슀 기반 μ»΄ν¬λ„ŒνŠΈλ₯Ό ν›…(Hooks)을 μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ‘œ λ³€κ²½, λ…Έν›„ν™”λœ 라이브러리λ₯Ό μ΅œμ‹  λ²„μ „μœΌλ‘œ μ—…λ°μ΄νŠΈ, 그리고 λΆˆν•„μš”ν•œ `useEffect` μ‚¬μš© 제거 등이 μžˆμŠ΅λ‹ˆλ‹€ [3]. λ˜ν•œ, μ—¬λŸ¬ 방식이 혼용된 CSS μŠ€νƒ€μΌλ§(예: μ™ΈλΆ€ CSS, sx, style 속성 혼용)을 ν•˜λ‚˜μ˜ λ°©μ‹μœΌλ‘œ ν†΅μΌν•˜μ—¬ ν‘œμ€€ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€ [9-11]. * **μƒνƒœ 관리 μ΅œμ ν™”:** μ„œλ²„ μƒνƒœ 관리λ₯Ό μœ„ν•΄μ„œλŠ” TanStack Queryλ₯Ό λ„μž…ν•˜κ³ , λΆˆν•„μš”ν•΄μ§„ Redux κ΅¬ν˜„μ²΄λ₯Ό μ œκ±°ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [3]. ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ „μ—­ μƒνƒœλŠ” Contextλ‚˜ Zustand둜 κ΄€λ¦¬ν•˜λ˜, 둜컬 μƒνƒœλŠ” κ°€λŠ₯ν•œ ν•œ κ°œλ³„ μ»΄ν¬λ„ŒνŠΈ 내뢀에 κ΅­ν•œμ‹œν‚€λŠ” λ°©ν–₯으둜 μƒνƒœ 관리 ꡬ쑰λ₯Ό κ°œμ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€ [3]. * **μ»€μŠ€ν…€ ν›… 및 μ»΄ν¬λ„ŒνŠΈ λΆ„ν• :** λͺ¨λ˜ Reactμ—μ„œ λ¦¬νŒ©ν† λ§μ˜ κ°€μž₯ μ€‘μš”ν•œ λ‹¨μœ„λŠ” 'μ»€μŠ€ν…€ ν›…(Custom Hooks)'μž…λ‹ˆλ‹€ [2]. λ³΅μž‘ν•œ 데이터 νŽ˜μΉ­μ΄λ‚˜ 폼 처리 λ‘œμ§μ„ `useFetch`λ‚˜ `useForm` 같은 μ»€μŠ€ν…€ ν›…μœΌλ‘œ μΆ”μΆœν•˜λ©΄ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ UIμ—μ„œ λΆ„λ¦¬ν•˜κ³  λ‹¨μœ„ ν…ŒμŠ€νŠΈ 속도λ₯Ό 높일 수 μžˆμŠ΅λ‹ˆλ‹€ [2]. λ”λΆˆμ–΄ 300쀄을 μ΄ˆκ³Όν•˜κ±°λ‚˜ μ±…μž„μ΄ ν˜Όμž¬λ˜μ–΄ 단일 μ±…μž„ 원칙(SRP)을 μœ„λ°˜ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλŠ” μž‘κ³  λͺ…ν™•ν•œ λͺ©μ μ„ κ°€μ§„ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈλ‘œ λΆ„ν• ν•΄μ•Ό ν•©λ‹ˆλ‹€ [12, 13]. * **원칙 및 λ¦°νŒ… 도ꡬ 적용:** DRY 및 YAGNI 원칙을 μ μš©ν•˜μ—¬ λ¬΄μ˜λ―Έν•œ μ£Όμ„μ΄λ‚˜ μž‰μ—¬ μ½”λ“œλ₯Ό μ œκ±°ν•˜κ³  기술 뢀채λ₯Ό 쀄여야 ν•©λ‹ˆλ‹€ [14, 15]. λ˜ν•œ ESLint와 같은 λ¦°νŒ… 도ꡬ(eslint-plugin-react λ“±)λ₯Ό μ„€μ •ν•˜μ—¬ μΌκ΄€λœ μ½”λ”© ν‘œμ€€μ„ μžλ™μœΌλ‘œ κ°•μ œν•˜κ³  더 λ‚˜μ€ μ½”λ“œ ν’ˆμ§ˆμ„ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [14, 16]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Incremental Migration]], [[Custom Hooks]], [[Single Responsibility Principle]], [[Technical Debt]], [[State Management]] - **Projects/Contexts:** [[Legacy React Codebase Modernization]], [[Context API to Zustand Migration]] - **Contradictions/Notes:** μ†Œκ·œλͺ¨ μ½”λ“œλ² μ΄μŠ€μ˜ 경우, κΈ°μ‘΄ μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜λŠ” 것보닀 μ•„μ˜ˆ μ²˜μŒλΆ€ν„° μƒˆ 앱을 μž‘μ„±ν•˜λŠ” 것이 더 μ‰¬μšΈ μˆ˜λ„ μžˆλ‹€λŠ” 의견이 μ‘΄μž¬ν•©λ‹ˆλ‹€ [5]. λ˜ν•œ λ¦¬νŒ©ν† λ§ μ‹œ TypeScript둜의 μ „ν™˜μ΄ 널리 ꢌμž₯λ˜μ§€λ§Œ[3], 인지적 λ³΅μž‘μ„±μ„ κ°€μ€‘μ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ ν•œ λ²ˆμ— μ „λ©΄ λ„μž…ν•˜κΈ°λ³΄λ‹€λŠ” JSμ—μ„œ TS둜 κ°œλ³„ νŒŒμΌμ„ μž¬μž‘μ„±ν•˜λ©° μ μ§„μ μœΌλ‘œ μ±„νƒν•˜λŠ” 것이 λ‚«λ‹€λŠ” μ‹œκ°λ„ μžˆμŠ΅λ‹ˆλ‹€ [17]. --- *Last updated: 2026-04-26*