# [[Functional Components]] ## πŸ“Œ Brief Summary Functional Components(ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ)λŠ” κ³Όκ±° 클래슀 기반 μ»΄ν¬λ„ŒνŠΈλ₯Ό λŒ€μ²΄ν•˜μ—¬ ν˜„λŒ€ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발의 ν‘œμ€€μœΌλ‘œ 자리 μž‘μ€ 핡심 UI μž‘μ„± λ‹¨μœ„μž…λ‹ˆλ‹€ [1, 2]. 자체적으둜 μƒνƒœ(state)와 λΆ€μˆ˜ 효과(side effect)λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ `useState`, `useEffect` λ“±μ˜ React ν›…(Hooks)κ³Ό κ²°ν•©ν•˜μ—¬ μ‚¬μš©λ©λ‹ˆλ‹€ [3-5]. κ°•λ ₯ν•˜κ³  μœ μ—°ν•œ κΈ°λŠ₯성을 μ œκ³΅ν•˜μ§€λ§Œ, 자체적으둜 Error Boundary(μ—λŸ¬ 경계) 역할을 ν•  수 μ—†λ‹€λŠ” λͺ…ν™•ν•œ ꡬ쑰적 μ œμ•½λ„ μ‘΄μž¬ν•©λ‹ˆλ‹€ [6, 7]. ## πŸ“– Core Content * **ν›…(Hooks)을 ν†΅ν•œ μƒνƒœ 및 둜직 관리:** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” `useState`, `useReducer`, `useEffect` 등을 μ‚¬μš©ν•˜μ—¬ μƒνƒœ 관리와 λΆ€μˆ˜ 효과λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€ [3-5]. 훅은 λ°˜λ“œμ‹œ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ˜ μ΅œμƒλ‹¨μ—μ„œλ§Œ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•˜λ©° λ£¨ν”„λ‚˜ 쑰건문 λ‚΄μ—μ„œ μ‚¬μš©λ˜μ–΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€ [8]. * **λ ˆκ±°μ‹œ μ½”λ“œλ² μ΄μŠ€μ˜ ν˜„λŒ€ν™” κΈ°μ€€:** React μ½”λ“œλ² μ΄μŠ€λ₯Ό λ¦¬νŒ©ν† λ§ν•  λ•Œ 클래슀 기반 μ»΄ν¬λ„ŒνŠΈλ₯Ό ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ ν›…μœΌλ‘œ μ „ν™˜ν•˜λŠ” 것은 κ°€μž₯ 효과적인 μ•„ν‚€ν…μ²˜ κ°œμ„ (solid win)으둜 ν‰κ°€λ°›μŠ΅λ‹ˆλ‹€ [2]. * **μ†Œν”„νŠΈμ›¨μ–΄ 곡학 원칙(SOLID & Clean Code)의 적용:** ν΄λž˜μŠ€μ—μ„œ ν•¨μˆ˜ν˜•μœΌλ‘œ ν˜•νƒœκ°€ λ³€ν–ˆλ”λΌλ„ 단일 μ±…μž„ 원칙(SRP) 등은 μ—¬μ „νžˆ μœ νš¨ν•©λ‹ˆλ‹€ [1]. μ»΄ν¬λ„ŒνŠΈκ°€ 300쀄 이상 κΈΈμ–΄μ§€κ±°λ‚˜ μƒνƒœ 관리, 데이터 페칭, UI λ Œλ”λ§ μ±…μž„μ„ λ™μ‹œμ— κ°€μ§€κ²Œ λœλ‹€λ©΄, μ±…μž„μ„ λΆ„λ¦¬ν•˜μ—¬ 더 μž‘μ€ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ‚˜ μ»€μŠ€ν…€ ν›…μœΌλ‘œ μͺΌκ°œμ•Ό ν•©λ‹ˆλ‹€ [1, 9, 10]. μ΄λŠ” μ½”λ“œμ˜ λ°˜λ³΅μ„ μ€„μ΄λŠ” DRY 원칙과 λ³΅μž‘μ„±μ„ μ€„μ΄λŠ” KISS 원칙을 λ‹¬μ„±ν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [11, 12]. * **μ»΄ν¬λ„ŒνŠΈμ˜ μ°Έμ‘°(Reference) λ™μž‘ 및 λ Œλ”λ§ 주의점:** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ JSX의 props둜 인라인 읡λͺ… ν•¨μˆ˜(`() => {...}`)λ₯Ό 직접 λ„˜κΈ°λŠ” 것은 μ§€μ–‘ν•΄μ•Ό ν•©λ‹ˆλ‹€ [13, 14]. ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” λ Œλ”λ§λ  λ•Œλ§ˆλ‹€ λ‚΄λΆ€μ˜ 인라인 ν•¨μˆ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆλ‘œ μƒμ„±ν•˜λ―€λ‘œ, μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— μƒˆλ‘œμš΄ μ°Έμ‘°(Reference)κ°€ μ „λ‹¬λ˜μ–΄ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ μœ λ°œν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ [14, 15]. ## βš–οΈ Trade-offs & Caveats * **Error Boundary둜써의 μ‚¬μš© λΆˆκ°€ (μ œμ•½ 사항):** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ κ°€μž₯ 큰 μ œμ•½ 쀑 ν•˜λ‚˜λŠ” 자체적으둜 Error Boundary(μ—λŸ¬ 경계) 역할을 ν•  수 μ—†λ‹€λŠ” μ μž…λ‹ˆλ‹€. μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ μ—λŸ¬λ₯Ό 작기 μœ„ν•΄ μ‚¬μš©λ˜λŠ” `getDerivedStateFromError` λ˜λŠ” `componentDidCatch` 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ, μ—λŸ¬ 처리λ₯Ό μœ„ν•΄μ„œλŠ” μ—¬μ „νžˆ 클래슀 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ `react-error-boundary`와 같은 μ™ΈλΆ€ 라이브러리 래퍼(Wrapper)λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [6, 7]. * **λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ™€ ν΄λ‘œμ €(Closure)둜 μΈν•œ λΆ€μž‘μš©:** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ 훅을 μ‚¬μš©ν•  λ•Œ ν΄λ‘œμ € νŠΉμ„±μœΌλ‘œ 인해 였래된 λ³€μˆ˜λ‚˜ 객체가 λ©”λͺ¨λ¦¬μ— μœ μ§€λ˜λŠ” 'Stale Closure' λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [16, 17]. 특히 `useEffect` λ‚΄λΆ€μ—μ„œ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό ꡬ독(subscribe)ν•˜κ³  μ–Έλ§ˆμš΄νŠΈ μ‹œ 클린업(cleanup) ν•¨μˆ˜λ‘œ μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄ μ‹¬κ°ν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€ [18-20]. * **κ³Όλ„ν•œ ν›… μ‚¬μš©μœΌλ‘œ μΈν•œ λ³΅μž‘μ„±(Trade-off):** λ¬΄λΆ„λ³„ν•œ `useEffect` μ‚¬μš©μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μž¦μ€ λ¦¬λ Œλ”λ§μ„ μœ λ°œν•˜μ—¬ 퍼포먼슀λ₯Ό 크게 λ–¨μ–΄λœ¨λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€ [21]. λ˜ν•œ μ„±λŠ₯을 높이겠닀고 `useCallback`κ³Ό `useMemo`λ₯Ό λͺ¨λ“  곳에 λ‚¨μš©ν•˜λŠ” 것은 였히렀 λ©”λͺ¨μ΄μ œμ΄μ…˜ 비ꡐ에 λ“œλŠ” μ˜€λ²„ν—€λ“œκ°€ 더 컀질 수 μžˆμœΌλ―€λ‘œ, Chrome DevTools 및 React Profilerλ₯Ό ν†΅ν•œ μ„±λŠ₯ 츑정이 μ„ ν–‰λœ ν›„ κΌ­ ν•„μš”ν•œ κ³³μ—λ§Œ μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [22-24]. ## πŸ”— Knowledge Connections ### Related Concepts #### [관계 μœ ν˜• A: μ•„ν‚€ν…μ²˜ 및 핡심 기술] - `[[React Hooks]]` - μ—°κ²° 이유: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈκ°€ λ‹¨μˆœν•œ UI λ Œλ”λ§ ν•¨μˆ˜λ₯Ό λ„˜μ–΄ 라이프사이클 및 μƒνƒœ 관리λ₯Ό ν•  수 있게 λ§Œλ“€μ–΄μ£ΌλŠ” 핡심 λ©”μ»€λ‹ˆμ¦˜μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ [3]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: `useState`와 `useEffect`λ₯Ό ν†΅ν•œ μƒνƒœ 및 λΆ€μˆ˜ 효과 관리, μ˜μ‘΄μ„± λ°°μ—΄(dependency array)의 μ˜¬λ°”λ₯Έ μ‚¬μš©λ²• 및 λ Œλ”λ§ 사이클 [3, 4, 21]. - `[[SOLID Principles]]` - μ—°κ²° 이유: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ₯Ό μ„€κ³„ν•˜κ³  λ¦¬νŒ©ν† λ§ν•  λ•Œ μ½”λ“œλ₯Ό λͺ¨λ“ˆν™”ν•˜λŠ” 기쀀점(예: 단일 μ±…μž„ 원칙)을 μ œκ³΅ν•©λ‹ˆλ‹€ [1, 25]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: κ±°λŒ€ν•œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ₯Ό λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Custom Hooks)κ³Ό 순수 UI μ»΄ν¬λ„ŒνŠΈλ‘œ λΆ„λ¦¬ν•˜λŠ” 클린 μ½”λ“œ(Clean Code) νŒ¨ν„΄ [1, 10, 11]. #### [관계 μœ ν˜• B: μ΅œμ ν™” 및 ν™œμš© 도ꡬ] - `[[Memoization (React.memo, useMemo, useCallback)]]` - μ—°κ²° 이유: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” μƒμœ„ μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§ μ‹œ 기본적으둜 ν•¨κ»˜ μž¬μ‹€ν–‰λ˜λ―€λ‘œ, 이λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•œ μˆ˜λ™ μ΅œμ ν™” 기법이 ν•„μˆ˜μ μœΌλ‘œ μˆ˜λ°˜λ©λ‹ˆλ‹€ [26, 27]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: ν•¨μˆ˜μ™€ 객체의 μ°Έμ‘° μ•ˆμ •μ„±(Reference Equality), λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§ 차단 원리 및 잘λͺ»λœ μ‚¬μš©μœΌλ‘œ μΈν•œ μ˜€λ²„ν—€λ“œ μœ„ν—˜μ„± [14, 24, 28]. - `[[Error Boundaries]]` - μ—°κ²° 이유: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ λͺ…ν™•ν•œ 기술적 ν•œκ³„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κΈ°λŠ₯으둜, λ Œλ”λ§ 쀑 λ°œμƒν•˜λŠ” λŸ°νƒ€μž„ 였λ₯˜λ₯Ό 우회 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ κΈ°λ²•μž…λ‹ˆλ‹€ [7, 29]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ 트리λ₯Ό λΆ•κ΄΄μ‹œν‚€μ§€ μ•Šκ³ , 였λ₯˜ λ°œμƒ μ‹œ λΆ€λΆ„μ μœΌλ‘œ 폴백(fallback) UIλ₯Ό μ œκ³΅ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•ˆμ •μ„± 확보 방법 [30, 31]. ### Deeper Research Questions - ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ„μž…μœΌλ‘œ 사라진 클래슀 μ»΄ν¬λ„ŒνŠΈμ˜ 라이프사이클 λ©”μ„œλ“œ(예: `componentDidMount`, `componentDidUpdate`)λŠ” `useEffect` λ‚΄λΆ€μ—μ„œ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ λŒ€μ²΄λ˜κ³  μŠ€μΌ€μ€„λ§λ˜λŠ”κ°€? - ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν΄λ‘œμ €(Closure) λ™μž‘μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ™€ 'Stale Closure' 문제λ₯Ό Chrome DevTools (Memory Profiler)λ₯Ό μ‚¬μš©ν•΄ μ–΄λ–»κ²Œ μΆ”μ ν•˜κ³  ν•΄κ²°ν•  수 μžˆλŠ”κ°€? - μžλ™ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μ§€μ›ν•˜λŠ” `React Compiler`의 λ„μž…μ΄ μ•ˆμ •ν™”λ  경우, κ°œλ°œμžκ°€ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” νŒ¨ν„΄(기쑴의 `useMemo`, `useCallback` μ˜μ‘΄μ„± νƒˆν”Ό λ“±)에 μ–΄λ–€ 근본적인 λ³€ν™”κ°€ μΌμ–΄λ‚˜λŠ”κ°€? - μ™œ React μ•„ν‚€ν…μ²˜ 상 Error Boundary κΈ°λŠ₯은 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ ν›…μœΌλ‘œ μ›ν˜• κ·ΈλŒ€λ‘œ κ΅¬ν˜„λ  수 μ—†μœΌλ©°, 클래슀 μ»΄ν¬λ„ŒνŠΈμ˜ 생λͺ…μ£ΌκΈ°μ—λ§Œ μ’…μ†λ˜λ„λ‘ μ„€κ³„λ˜μ—ˆλŠ”κ°€? - ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ— μ˜μ‘΄μ„± μ—­μ „ 원칙(DIP)κ³Ό 단일 μ±…μž„ 원칙(SRP)을 μ μš©ν•˜μ—¬ UI, μ„œλ²„ μƒνƒœ(TanStack Query), μ „μ—­ μƒνƒœ(Zustand)λ₯Ό μ™„λ²½νžˆ κ²©λ¦¬ν•˜λŠ” κ°€μž₯ λͺ¨λ²”적인 μ½”λ“œ κ΅¬μ‘°λŠ” 무엇인가? ### Practical Application Contexts - **Implementation:** 클래슀 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°°μ œν•˜κ³  `useState`와 `useEffect`λ₯Ό μ‚¬μš©ν•΄ μ΅œμ‹  λ¦¬μ•‘νŠΈ ν‘œμ€€μ— 맞좰 ν™”λ©΄ λ‹¨μœ„μ™€ UI μš”μ†Œλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€ [2, 3]. - **System Design:** 둜직과 뷰의 강결합을 ν”Όν•˜κΈ° μœ„ν•΄, 데이터 페칭과 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ λ³„λ„μ˜ Custom Hookμ΄λ‚˜ μ„œλΉ„μŠ€ κ³„μΈ΅μœΌλ‘œ λΆ„λ¦¬ν•˜κ³  ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” μ‹œκ°μ  λ Œλ”λ§(Presentation) κΈ°λŠ₯만 μˆ˜ν–‰ν•˜λ„λ‘ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•©λ‹ˆλ‹€ [9, 32]. - **Operation / Maintenance:** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ 읡λͺ… ν•¨μˆ˜ 및 인라인 객체가 λ‚¨μš©λ˜μ§€ μ•Šλ„λ‘ ESLint(`eslint-plugin-react-hooks`) 및 `why-did-you-render` 같은 도ꡬλ₯Ό CI/CD νŒŒμ΄ν”„λΌμΈμ— 톡합해 λΆˆν•„μš”ν•œ λ Œλ”λ§ λˆ„μˆ˜λ₯Ό λ§‰μŠ΅λ‹ˆλ‹€ [33-35]. - **Learning Path:** (기초) JSX와 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ 이해 βž” (쀑급) React Hooks 기반 μƒνƒœ/라이프사이클 μ œμ–΄ 및 μ»€μŠ€ν…€ ν›… 뢄리 βž” (κ³ κΈ‰) Memoization 기법, Closure 함정 극볡 및 React Compiler λ™μž‘ 원리 νŒŒμ•… [3, 36-38]. - **My Project Relevance:** ν˜„μž¬ λ ˆκ±°μ‹œ μ½”λ“œλ‘œ 이루어진 React ν”„λ‘œμ νŠΈλ₯Ό λ¦¬νŒ©ν† λ§ν•΄μ•Ό ν•  경우, 클래슀 μ»΄ν¬λ„ŒνŠΈλ₯Ό λͺ¨λ‘ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ‘œ λ³€ν™˜(Migration)ν•˜κ³  λΆˆν•„μš”ν•œ λ‘œμ§μ„ μ»€μŠ€ν…€ ν›…μœΌλ‘œ λ“€μ–΄λ‚΄μ–΄ 가독성 및 μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 첫 번째 λ§ˆμΌμŠ€ν†€μœΌλ‘œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [2, 9, 39]. ### Adjacent Topics - `[[React Compiler]]` - ν™•μž₯ λ°©ν–₯: κ°œλ°œμžκ°€ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μˆ˜λ™μœΌλ‘œ μ²˜λ¦¬ν•˜λ˜ `useMemo`와 `useCallback`의 λΆˆνŽΈν•¨μ„ λΉŒλ“œ νƒ€μž„μ— μžλ™μœΌλ‘œ 뢄석해 μ΅œμ ν™”(Auto-memoization)ν•΄μ£ΌλŠ” 미래의 React μ„±λŠ₯ κ°œμ„  λ„κ΅¬μ˜ 원리 이해 [37, 40]. - `[[Feature-Sliced Design (FSD)]]` - ν™•μž₯ λ°©ν–₯: 수백 개의 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ μ»€μŠ€ν…€ 훅듀이 μ–½νžŒ κ±°λŒ€ν•œ μ½”λ“œλ² μ΄μŠ€λ₯Ό 도메인(Domain)κ³Ό κΈ°λŠ₯(Feature) λ‹¨μœ„μ˜ 계측 ꡬ쑰둜 λͺ…ν™•ν•˜κ²Œ λͺ¨λ“ˆν™”ν•˜λŠ” μŠ€μΌ€μΌλ§ 방법둠 탐ꡬ [41-43]. --- *Last updated: 2026-04-30*