# [[Functional Programming in React]] ## πŸ“Œ Brief Summary Reactμ—μ„œμ˜ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)λ₯Ό μƒνƒœ(State)와 속성(Props)의 순수 ν•¨μˆ˜(Pure function)둜 ν‘œν˜„ν•˜λŠ” μ•„ν‚€ν…μ²˜ νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€ [1]. 클래슀 기반 μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ²—μ–΄λ‚˜ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ Hooksλ₯Ό ν™œμš©ν•˜μ—¬ μƒνƒœ 및 λΆ€μž‘μš©(Side effects)을 κ΄€λ¦¬ν•˜λ©°, 이λ₯Ό 톡해 μ½”λ“œμ˜ 예츑 κ°€λŠ₯μ„±κ³Ό ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ κ·ΉλŒ€ν™”ν•©λ‹ˆλ‹€ [2, 3]. λΆˆλ³€μ„±(Immutability)을 μœ μ§€ν•˜κ³  λ Œλ”λ§ 쀑 λΆ€μž‘μš©μ„ λ°°μ œν•˜λŠ” 것이 이 νŒ¨λŸ¬λ‹€μž„μ΄ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜κΈ° μœ„ν•œ 핡심 κ·œμΉ™μž…λ‹ˆλ‹€ [4]. ## πŸ“– Core Content * **순수 ν•¨μˆ˜λ‘œμ„œμ˜ UI (UI as Pure Functions):** React의 JSX와 선언적 λ Œλ”λ§ κ΅¬μ‘°λŠ” UIλ₯Ό μ»΄ν¬λ„ŒνŠΈ 트리의 κ΄€μ μ—μ„œ μƒκ°ν•˜λ„λ‘ ꢌμž₯ν•˜λ©°, 각 μ»΄ν¬λ„ŒνŠΈλŠ” μƒνƒœμ™€ propsλ₯Ό λ°›μ•„ UIλ₯Ό λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€ [1]. μ΄λŠ” μ½”λ“œμ˜ 예츑 κ°€λŠ₯성을 높이고 ν…ŒμŠ€νŠΈλ₯Ό μ‰½κ²Œ λ§Œλ“­λ‹ˆλ‹€ [1]. * **ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ Hooks νŒ¨λŸ¬λ‹€μž„:** React μƒνƒœκ³„λŠ” 과거의 클래슀 기반 μ„€κ³„μ—μ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° ꡬ쑰둜 μ „ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€ [3]. ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ μƒνƒœ(State)와 λΆ€μž‘μš©μ„ μ œμ–΄ν•˜κΈ° μœ„ν•΄ React Hooks(`useState`, `useEffect` λ“±)κ°€ λ„μž…λ˜μ—ˆμœΌλ©°, μ΄λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λ Œλ”λ§μ„ κΉ”λ”ν•˜κ²Œ λΆ„λ¦¬ν•˜λŠ” κ°•λ ₯ν•œ μˆ˜λ‹¨μ„ μ œκ³΅ν•©λ‹ˆλ‹€ [2, 5]. * **λΆˆλ³€μ„±κ³Ό λΆ€μž‘μš© 격리 (Immutability & Side-effect Isolation):** ν•¨μˆ˜ν˜• React의 κΈ°λ³Έ κ·œμΉ™μ€ λ Œλ”λ§ κ³Όμ • 쀑 λ°μ΄ν„°μ˜ λΆˆλ³€μ„±μ„ μœ μ§€ν•˜κ³  λΆ€μž‘μš©μ„ λ°°μ œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ [4]. 데이터 ν†΅μ‹ μ΄λ‚˜ ꡬ독과 같은 λΆ€μž‘μš©μ€ `useEffect` ν›… λ‚΄λΆ€λ‘œ λͺ…μ‹œμ μœΌλ‘œ κ²©λ¦¬ν•˜μ—¬, λ Œλ”λ§ μžμ²΄λŠ” μˆœμˆ˜ν•˜κ²Œ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [6, 7]. * **κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈ (Higher-Order Components, HOC):** ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ κ³ μ°¨ ν•¨μˆ˜ κ°œλ…μ„ μ°¨μš©ν•œ νŒ¨ν„΄μœΌλ‘œ, ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό 인자둜 λ°›μ•„ 좔가적인 κΈ°λŠ₯을 λΆ€μ—¬ν•œ μƒˆλ‘œμš΄ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€ [8]. 이λ₯Ό 톡해 μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ λ‘œμ§μ„ ν•¨μˆ˜ μˆ˜μ€€μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [8]. ## βš–οΈ Trade-offs & Caveats * **λ Œλ”λ§ 주기와 μ°Έμ‘° μ•ˆμ •μ„±(Reference Stability) 문제:** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” λ Œλ”λ§ μ‹œλ§ˆλ‹€ ν•¨μˆ˜ λ‚΄λΆ€μ˜ λͺ¨λ“  λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό μƒˆλ‘œ μƒμ„±ν•©λ‹ˆλ‹€ [9, 10]. JSX 내뢀에 읡λͺ… ν•¨μˆ˜λ‚˜ 인라인 객체λ₯Ό λ‚¨μš©ν•˜λ©΄, 얕은 비ꡐ(Shallow comparison)λ₯Ό μˆ˜ν–‰ν•˜λŠ” μžμ‹ μ»΄ν¬λ„ŒνŠΈ(`React.memo` λ“±)에 맀번 μƒˆλ‘œμš΄ μ°Έμ‘°κ°€ μ „λ‹¬λ˜μ–΄ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ μœ λ°œν•˜λŠ” λΆ€μž‘μš©μ΄ μžˆμŠ΅λ‹ˆλ‹€ [11, 12]. * **였래된 ν΄λ‘œμ € (Stale Closures):** ν•¨μˆ˜ν˜• νŒ¨λŸ¬λ‹€μž„μ—μ„œ 비동기 μž‘μ—… 등을 μˆ˜ν–‰ν•  λ•Œ, ν•¨μˆ˜κ°€ 과거의 λ Œλ”λ§ μ‹œμ μ˜ μƒνƒœλ₯Ό "κΈ°μ–΅"ν•˜λŠ” ν΄λ‘œμ € νŠΉμ„±μœΌλ‘œ 인해 μ΅œμ‹  μƒνƒœκ°€ λ°˜μ˜λ˜μ§€ μ•ŠλŠ” 버그(Stale Closures)κ°€ λ°œμƒν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€ [13, 14]. * **μ΅œμ ν™” λ„κ΅¬μ˜ λ‚¨μš© (Overhead of Memoization):** λΆˆν•„μš”ν•œ λ Œλ”λ§μ„ 막기 μœ„ν•΄ `useCallback`, `useMemo` 등을 λ¬΄λΆ„λ³„ν•˜κ²Œ μ‚¬μš©ν•˜λ©΄, μ˜μ‘΄μ„± 배열을 λΉ„κ΅ν•˜κ³  μΊμ‹±ν•˜λŠ” λΉ„μš©μ΄ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹¨μˆœνžˆ λ‹€μ‹œ λ Œλ”λ§ν•˜λŠ” λΉ„μš©λ³΄λ‹€ 였히렀 더 컀져 μ„±λŠ₯을 μ €ν•˜μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€ [12, 15]. * **λΆ€μž‘μš© 정리 λˆ„λ½μœΌλ‘œ μΈν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜:** `useEffect` λ‚΄λΆ€μ—μ„œ λ°œμƒν•œ ꡬ독(Subscription)μ΄λ‚˜ 이벀트 λ¦¬μŠ€λ„ˆ 등을 λ°˜ν™˜(cleanup) ν•¨μˆ˜λ‘œ μ •λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄, ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈκ°€ μ–Έλ§ˆμš΄νŠΈλœ 후에도 μ°Έμ‘°κ°€ 남아 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ €ν•˜μ‹œν‚€λŠ” μ‹¬κ°ν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€ [7, 16, 17]. ## πŸ”— Knowledge Connections ### Related Concepts #### [μ•„ν‚€ν…μ²˜/기반 기술] - [[Pure Function]] - μ—°κ²° 이유: React의 λ Œλ”λ§ 철학은 UIλ₯Ό μƒνƒœμ™€ Props의 순수 ν•¨μˆ˜λ‘œ μ·¨κΈ‰ν•˜λŠ” κ²ƒμ—μ„œ μΆœλ°œν•©λ‹ˆλ‹€ [1]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μž…λ ₯값이 λ™μΌν•˜λ©΄ 항상 λ™μΌν•œ UIλ₯Ό λ Œλ”λ§ν•΄μ•Ό ν•œλ‹€λŠ” 원칙과 React Compilerκ°€ μž‘λ™ν•˜κΈ° μœ„ν•œ μ „μ œ 쑰건 [1, 4]. - [[Immutability]] - μ—°κ²° 이유: Reactκ°€ μ»΄ν¬λ„ŒνŠΈμ˜ λ³€κ²½ 사항을 감지(Diffing)ν•˜κ³  λ Œλ”λ§ μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ ν•„μˆ˜ κ·œμΉ™μž…λ‹ˆλ‹€ [4, 18]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•΄μ•Όλ§Œ `React.memo`와 같은 μ΅œμ ν™”κ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜λŠ” 원리 [11, 18]. #### [κ΅¬ν˜„/ν™œμš© 도ꡬ] - [[React Hooks]] - μ—°κ²° 이유: 순수 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ— μƒνƒœ μœ μ§€μ™€ λΆ€μž‘μš© 처리 λŠ₯λ ₯을 λΆ€μ—¬ν•˜λŠ” 핡심 κ΅¬ν˜„μ²΄μž…λ‹ˆλ‹€ [2]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ˜μ‘΄μ„± λ°°μ—΄(Dependency array)의 관리와 ν΄λ‘œμ €(Closure)λ₯Ό ν™œμš©ν•œ μƒνƒœ 캑처 λ©”μ»€λ‹ˆμ¦˜ [6, 19]. - [[React Compiler]] - μ—°κ²° 이유: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈκ°€ React의 κ·œμΉ™(λΆˆλ³€μ„±, λΆ€μž‘μš© μ—†μŒ)을 μ€€μˆ˜ν•  경우, μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜ 없이도 λΉŒλ“œ νƒ€μž„μ— μžλ™μœΌλ‘œ μ½”λ“œλ₯Ό μ΅œμ ν™”ν•΄ μ£ΌλŠ” λ„κ΅¬μž…λ‹ˆλ‹€ [4, 20, 21]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ Œλ”λ§ 결과물을 μΊμ‹±ν•˜μ—¬ μˆ˜λ™μœΌλ‘œ `useMemo`λ‚˜ `useCallback`을 μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 뢀담을 μ€„μ΄λŠ” 방식 [22, 23]. ### Deeper Research Questions - React μ»΄νŒŒμΌλŸ¬κ°€ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§ λΆ€μž‘μš©(side effects)κ³Ό λΆˆλ³€μ„±(immutability)을 μ–΄λ–€ λ°©μ‹μ˜ 정적 뢄석을 톡해 κ²€μ¦ν•˜κ³  μžλ™ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μˆ˜ν–‰ν•˜λŠ”κ°€? - ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ 비동기 μž‘μ—… 처리 μ‹œ λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•˜λŠ” '였래된 ν΄λ‘œμ €(Stale Closures)' λ¬Έμ œλŠ” 클래슀 μ»΄ν¬λ„ŒνŠΈμ˜ `this` μ°Έμ‘° 방식과 λΉ„κ΅ν•˜μ—¬ μ–΄λ–€ ꡬ쑰적 μ°¨μ΄μ—μ„œ λΉ„λ‘―λ˜λŠ”κ°€? - React의 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ°Έμ‘° μ•ˆμ •μ„±(Reference Equality) κ²°μ—¬κ°€ `React.memo`의 얕은 비ꡐ(Shallow comparison)에 λ―ΈμΉ˜λŠ” ꡬ체적인 μ„±λŠ₯ μ €ν•˜ 과정은 무엇인가? - ν•¨μˆ˜ν˜• 기반의 λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ Context API와 Zustand 같은 μ „μ—­ μƒνƒœ 관리 λ„κ΅¬λŠ” λ¦¬λ Œλ”λ§ ν†΅μ œ(Selector νŒ¨ν„΄ 유무) μΈ‘λ©΄μ—μ„œ μ–΄λ–€ μ„±λŠ₯적 μ•„ν‚€ν…μ²˜ 차이λ₯Ό λ³΄μ΄λŠ”κ°€? - μ»€μŠ€ν…€ ν›…(Custom Hooks)으둜 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 좔상화할 λ•Œ λ°œμƒν•˜λŠ” DRY(Don't Repeat Yourself) 원칙과 KISS(Keep It Simple, Stupid) 원칙 κ°„μ˜ νŠΈλ ˆμ΄λ“œμ˜€ν”„λ₯Ό μ–΄λ–»κ²Œ μ‘°μœ¨ν•΄μ•Ό ν•˜λŠ”κ°€? ### Practical Application Contexts - **Implementation:** React μ»΄ν¬λ„ŒνŠΈλ₯Ό 섀계할 λ•Œ 단일 μ±…μž„ 원칙(SRP)을 μ€€μˆ˜ν•˜μ—¬ 300쀄 μ΄μƒμ˜ κ±°λŒ€ν•œ ν•¨μˆ˜λ₯Ό μž‘κ³  μˆœμˆ˜ν•œ μ»΄ν¬λ„ŒνŠΈλ‘œ λΆ„λ¦¬ν•˜κ³ , λΆ€μž‘μš©μ€ `useEffect` λ‚΄λΆ€λ‘œ λͺ…μ‹œμ μœΌλ‘œ κ²©λ¦¬ν•˜μ—¬ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€ [3, 6, 24]. - **System Design:** 둜직과 UI λ Œλ”λ§ 관심사λ₯Ό λΆ„λ¦¬ν•˜κΈ° μœ„ν•΄, μž¬μ‚¬μš© κ°€λŠ₯ν•œ μƒνƒœ λ‘œμ§μ€ 'Custom Hooks' 디렉토리(예: `useAuth`, `useFetch`)에 λͺ¨μœΌκ³  순수 UIλŠ” 'Components' ν΄λ”λ‘œ κ΅¬μ‘°ν™”ν•˜λŠ” 섀계λ₯Ό μ μš©ν•©λ‹ˆλ‹€ [25, 26]. - **Operation / Maintenance:** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 운영 μ‹œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ μ˜μ‹¬λ˜λ©΄, Chrome DevTools의 Memory ν”„λ‘œνŒŒμΌλŸ¬λ₯Ό μ‚¬μš©ν•˜μ—¬ ν›… 정리(cleanup) λˆ„λ½μœΌλ‘œ μΈν•œ 'λΆ„λ¦¬λœ DOM λ…Έλ“œ(Detached DOM Nodes)'λ‚˜ λ‹«νžŒ ν΄λ‘œμ € μ°Έμ‘°λ₯Ό μΆ”μ ν•˜μ—¬ μœ μ§€λ³΄μˆ˜ν•©λ‹ˆλ‹€ [7, 17, 27]. - **Learning Path:** μš°μ„  React Hooks의 κΈ°λ³Έ κ·œμΉ™κ³Ό ν•¨μˆ˜ 생λͺ…μ£ΌκΈ°(ν΄λ‘œμ €, μ˜μ‘΄μ„± λ°°μ—΄)λ₯Ό μˆ™μ§€ν•œ λ’€, λ©”λͺ¨μ΄μ œμ΄μ…˜(`useMemo`, `React.memo`)을 ν†΅ν•œ λ Œλ”λ§ μ΅œμ ν™” 기법을 배우고, 이후 μƒνƒœ 관리 μ‹œμŠ€ν…œ(Zustand λ“±) μ„€κ³„λ‘œ λ‚˜μ•„κ°€λŠ” κ²½λ‘œκ°€ ꢌμž₯λ©λ‹ˆλ‹€ [2, 28, 29]. - **My Project Relevance:** 였래된 클래슀 μ»΄ν¬λ„ŒνŠΈ 기반 λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό κΈ°λŠ₯ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ μ»€μŠ€ν…€ ν›…μœΌλ‘œ λ¦¬νŒ©ν† λ§(Refactoring)ν•˜μ—¬ μ½”λ“œ 가독성과 λͺ¨λ“ˆμ„±μ„ κ°œμ„ ν•˜κ³ , 둜직 쀑볡을 제거(DRY)ν•˜λŠ” 싀무 과정에 μ§κ²°λ©λ‹ˆλ‹€ [5, 26]. ### Adjacent Topics - [[React Hooks Pitfalls]] - ν™•μž₯ λ°©ν–₯: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ˜μ‘΄μ„± λ°°μ—΄ λˆ„λ½, 잘λͺ»λœ μƒνƒœ μ—…λ°μ΄νŠΈ, 정리(cleanup) λˆ„λ½ λ“± Hooksλ₯Ό μ‚¬μš©ν•  λ•Œ λΉˆλ²ˆν•˜κ²Œ κ²ͺλŠ” μ•ˆν‹°νŒ¨ν„΄κ³Ό 방어적 ν”„λ‘œκ·Έλž˜λ° 방법 탐ꡬ [6, 7, 19]. - [[React Performance Optimization]] - ν™•μž₯ λ°©ν–₯: ν•¨μˆ˜ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ λΉˆλ²ˆν•œ λ¦¬λ Œλ”λ§μ„ 막기 μœ„ν•œ μ§€μ—° λ‘œλ”©(`React.lazy`), 가상화(Virtualization), 그리고 μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜μ˜ ν•œκ³„ 돌파 μ „λž΅ 연ꡬ [30-32]. - [[Feature-Sliced Design (FSD)]] - ν™•μž₯ λ°©ν–₯: λ‹¨μˆœνžˆ κΈ°λŠ₯적(Functional)으둜 λΆ„λ¦¬λœ μ»΄ν¬λ„ŒνŠΈμ™€ 훅듀을 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ 도메인 κ΄€μ μ—μ„œ 계측(Layers)κ³Ό 슬라이슀(Slices)둜 κ·œκ²©ν™”ν•˜μ—¬ ν™•μž₯ κ°€λŠ₯ν•œ μ•„ν‚€ν…μ²˜λ‘œ μ‘°ν•©ν•˜λŠ” 방법둠 [33-35]. --- *Last updated: 2026-04-30*