# [[React Hooks]] ## πŸ“Œ Brief Summary React HooksλŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœ(State)와 λΆ€μˆ˜ 효과(Side effects)λ₯Ό 관리할 수 있게 ν•΄μ£ΌλŠ” ν˜„λŒ€μ μΈ 섀계 νŒ¨ν„΄μ΄λ‹€ [1, 2]. 기쑴의 λ Œλ” ν”„λ‘œν”„(Render Props) νŒ¨ν„΄μ΄ μ•ΌκΈ°ν•˜λ˜ 깊게 μ€‘μ²©λ˜λŠ” '래퍼 μ§€μ˜₯(Wrapper hell)' 문제λ₯Ό ν•΄κ²°ν•˜λ©°, μ»΄ν¬λ„ŒνŠΈ 합성이 μ•„λ‹Œ ν•¨μˆ˜ 합성을 톡해 μƒνƒœ 기반 λ‘œμ§μ„ κ³΅μœ ν•œλ‹€ [3, 4]. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” 클래슀 μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•  ν•„μš” 없이 더 κΉ”λ”ν•˜κ³  κ°„κ²°ν•œ μ½”λ“œλ‘œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ λ‘œμ§μ„ μΊ‘μŠν™”ν•  수 μžˆλ‹€ [1, 5]. ## πŸ“– Core Content * **ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ ν‘œμ€€ν™” 및 둜직 μž¬μ‚¬μš©** * Hooks의 λ„μž…μœΌλ‘œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈκ°€ React 개발의 사싀상 ν‘œμ€€μ΄ λ˜μ—ˆμœΌλ©°, `useState`와 `useEffect`λ₯Ό ν™œμš©ν•΄ μƒνƒœμ™€ λΆ€μˆ˜ 효과λ₯Ό μ§κ΄€μ μœΌλ‘œ 관리할 수 μžˆλ‹€ [1, 2, 6]. * **μ»€μŠ€ν…€ ν›…(Custom Hooks)**: μƒνƒœ μ €μž₯ λ‘œμ§μ„ `use`둜 μ‹œμž‘ν•˜λŠ” ν•¨μˆ˜λ‘œ μΆ”μΆœν•˜μ—¬ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μž¬μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” κ°•λ ₯ν•œ νŒ¨ν„΄μ΄λ‹€ [2, 4, 7]. 예λ₯Ό λ“€μ–΄, 데이터 페칭(`useFetchUser`)κ³Ό 같은 λ³΅μž‘ν•œ λ‘œμ§μ„ μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ μΊ‘μŠν™”ν•˜μ—¬ μ½”λ“œμ˜ 쀑볡을 막고(DRY 원칙) μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§μ—λ§Œ μ§‘μ€‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€ [2, 5, 7]. * **ν•¨μˆ˜ ν•©μ„±(Function Composition) λͺ¨λΈ** * λ Œλ” ν”„λ‘œν”„ νŒ¨ν„΄μ΄ μ»΄ν¬λ„ŒνŠΈ ꡬ성을 톡해 λ‘œμ§μ„ κ³΅μœ ν–ˆλ‹€λ©΄, μ»€μŠ€ν…€ 훅은 ν•¨μˆ˜ ꡬ성을 톡해 λ‘œμ§μ„ κ³΅μœ ν•œλ‹€ [4]. * μ—¬λŸ¬ 개의 단일 μ±…μž„ 훅을 μ‘°ν•©ν•˜μ—¬ λ³΅μž‘ν•œ λ™μž‘μ„ λ§€λ„λŸ½κ²Œ ꡬ좕할 수 μžˆλ‹€(예: λ””λ°”μš΄μ‹± 둜직과 데이터 페칭, 검색 둜직의 μ‘°ν•©) [4, 8]. * **React 19의 μƒˆλ‘œμš΄ ν›… λ„μž…** * React 19λŠ” 폼 핸듀링과 낙관적 UI μ—…λ°μ΄νŠΈλ₯Ό μš°μ•„ν•˜κ²Œ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ `useActionState`, `useFormStatus`, `useOptimistic`, 그리고 μƒˆλ‘œμš΄ `use` APIλ₯Ό λ„μž…ν–ˆλ‹€ [9]. * `useOptimistic` 훅은 λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ μ™„λ£Œλ˜κΈ° 전에 UI에 μ¦‰κ°μ μœΌλ‘œ λ³€κ²½ 사항을 ν‘œμ‹œν•˜μ—¬ μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚¨λ‹€ [9]. * μƒˆλ‘œμš΄ `use()` ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜λ©΄ Context API의 값에 더 μœ μ—°ν•˜κ²Œ μ ‘κ·Όν•˜κ³  μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€ [10, 11]. * **React Server Components (RSC) ν™˜κ²½μ—μ„œμ˜ μ œμ•½** * μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” μƒνƒœλ‚˜ λΆ€μˆ˜ 효과λ₯Ό κ°€μ§ˆ 수 μ—†μœΌλ―€λ‘œ `useState`, `useEffect`, `useContext` λ“±μ˜ 훅을 μ‚¬μš©ν•  수 μ—†λ‹€ [12, 13]. * μ΄λŸ¬ν•œ μƒνƒœ 훅듀은 파일 μ΅œμƒλ‹¨μ— `'use client'` μ§€μ‹œμ–΄κ°€ μ„ μ–Έλœ **ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈ(Client Components)** λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [13, 14]. ## βš–οΈ Trade-offs & Caveats * **'Vibe Coding'κ³Ό μ΅œμ ν™”μ˜ 함정**: μ„±κ³Ό μΈ‘μ • 없이 λŠλ‚Œλ§ŒμœΌλ‘œ `useCallback`μ΄λ‚˜ `React.memo`λ₯Ό λ‚¨μš©ν•˜λŠ” 것은 였히렀 μ½”λ“œλ₯Ό 읽고 λ””λ²„κΉ…ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€λ©°, μ„±λŠ₯을 이전보닀 더 느리게 λ§Œλ“œλŠ” λΆ€μž‘μš©(μ„±λŠ₯ μ €ν•˜)을 μ΄ˆλž˜ν•  수 μžˆλ‹€ [15, 16]. * **μ˜μ‘΄μ„± 및 ν•˜μœ„ μ°Έμ‘° μ•ˆμ •μ„± μœ μ§€**: ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ˜ λ©”λͺ¨μ΄μ œμ΄μ…˜μ΄ κΉ¨μ§€λŠ” 것을 λ°©μ§€ν•˜λ €λ©΄ `useCallback`κ³Ό `useMemo`λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•ˆμ •μ μΈ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€ [17]. * **λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°©μ§€**: μ΄λ²€νŠΈλ‚˜ μ™ΈλΆ€ λ¦¬μ†ŒμŠ€μ— 등둝(Subscribe)ν•œ 경우, λ°˜λ“œμ‹œ `useEffect` λ‚΄λΆ€μ—μ„œ 클린업(Cleanup) ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜μ—¬ λΆ€μˆ˜ 효과λ₯Ό 정리해야 ν•œλ‹€ [17]. * **μ—„κ²©ν•œ λͺ…λͺ… κ·œμΉ™**: λͺ¨λ“  훅은 `use` 접두사 κ·œμΉ™μ„ 따라야 ν•˜λ©°, μ΄λŠ” λ‹¨μˆœν•œ μŠ€νƒ€μΌλ§μ΄ μ•„λ‹ˆλΌ React의 λ¦°νŒ…(Linting) κ·œμΉ™μ΄ μ˜μ‘΄ν•˜λŠ” ν•„μˆ˜ 사항이닀 [17]. * **μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ ν™˜κ²½ μ œμ•½**: μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” ν›… 기반의 ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ 관리가 λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ, μƒνƒœκ°€ ν•„μš”ν•œ 경우 ν΄λΌμ΄μ–ΈνŠΈ 경계('use client')λ₯Ό μ‹ μ€‘ν•˜κ²Œ 섀계해야 ν•˜λ©° λ²ˆλ“€ μ‚¬μ΄μ¦ˆκ°€ μ¦κ°€ν•˜λŠ” νŠΈλ ˆμ΄λ“œμ˜€ν”„κ°€ λ°œμƒν•œλ‹€ [12-14]. ## πŸ”— Knowledge Connections ### Related Concepts #### [μ•„ν‚€ν…μ²˜/기반 기술] * [[Custom Hooks]] * μ—°κ²° 이유: λ Œλ” ν”„λ‘œν”„μ™€ κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈ(HOC)의 λ³΅μž‘μ„±μ„ λŒ€μ²΄ν•˜λŠ” React의 핡심 둜직 μΊ‘μŠν™” νŒ¨ν„΄μ΄κΈ° λ•Œλ¬Έμ΄λ‹€ [2, 3, 18]. * 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μƒνƒœμ™€ λ Œλ”λ§μ„ μ™„λ²½νžˆ λΆ„λ¦¬ν•˜κ³ , ν•¨μˆ˜ 기반의 μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ•„ν‚€ν…μ²˜λ₯Ό μ„€κ³„ν•˜λŠ” 방법. * [[React Server Components (RSC)]] * μ—°κ²° 이유: μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ νŒ¨λŸ¬λ‹€μž„ λ„μž…μœΌλ‘œ 인해 κΈ°μ‘΄ React Hooks의 μ‹€ν–‰ ν™˜κ²½(Client vs Server)이 λͺ…ν™•νžˆ μ œν•œλ˜κΈ° λ•Œλ¬Έμ΄λ‹€ [12, 13]. * 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: Hooksκ°€ 적용될 수 μžˆλŠ” ν΄λΌμ΄μ–ΈνŠΈ 경계('use client') μ„€μ • 및 μ„œλ²„/ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ ν˜Όν•© ꡬ성 μ „λž΅. #### [κ΅¬ν˜„/ν™œμš© 도ꡬ] * [[useOptimistic]] * μ—°κ²° 이유: React 19μ—μ„œ μƒˆλ‘œ μΆ”κ°€λœ 핡심 ν›…μœΌλ‘œ, λ„€νŠΈμ›Œν¬ 지연을 κ·Ήλ³΅ν•˜λŠ” 낙관적 UI μ—…λ°μ΄νŠΈ νŒ¨ν„΄μ„ μ§μ ‘μ μœΌλ‘œ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€ [9]. * 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ‚¬μš©μž μƒν˜Έμž‘μš© 속도λ₯Ό λŒμ–΄μ˜¬λ¦¬κΈ° μœ„ν•œ μ΅œμ‹  React의 λ Œλ”λ§ UX μ΅œμ ν™” 방법. * [[Context API]] * μ—°κ²° 이유: 'prop drilling' 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­ μƒνƒœλ₯Ό κ³΅μœ ν•  λ•Œ Hooks(`useContext` λ˜λŠ” React 19의 `use()`)와 ν•¨κ»˜ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ΄λ‹€ [5, 10]. * 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 볡합 μ»΄ν¬λ„ŒνŠΈ(Compound Components) νŒ¨ν„΄ λ“±μ—μ„œ μžμ‹ μ»΄ν¬λ„ŒνŠΈ 간에 μ•”μ‹œμ  μƒνƒœλ₯Ό κ³΅μœ ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜ [19, 20]. ### Deeper Research Questions * ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ `useContext`λ₯Ό ν™œμš©ν•œ μƒνƒœ κ³΅μœ μ™€, URL 기반 쿼리 νŒŒλΌλ―Έν„°λ₯Ό ν™œμš©ν•œ μƒνƒœ κ³΅μœ λŠ” μ–΄λ–€ μ„±λŠ₯적/ꡬ쑰적 νŠΈλ ˆμ΄λ“œμ˜€ν”„λ₯Ό κ°€μ§€λŠ”κ°€? * λ¬΄λΆ„λ³„ν•œ `useCallback` 및 `useMemo` 적용이 λ Œλ”λ§ μ„±λŠ₯에 ꡬ체적으둜 μ–΄λ– ν•œ μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œν‚€λ©°, 이λ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•œ ν”„λ‘œνŒŒμΌλ§ 기법은 무엇인가? * React 19의 `useActionState` 및 `useFormStatus` 훅은 기쑴의 μ œμ–΄ μ»΄ν¬λ„ŒνŠΈ(Controlled Components) νŒ¨ν„΄κ³Ό μ»€μŠ€ν…€ 폼 ν›… λ‘œμ§μ„ μ–΄λ–»κ²Œ λŒ€μ²΄ν•˜κ³  λ‹¨μˆœν™”ν•˜λŠ”κ°€? * `use` ν•¨μˆ˜λ₯Ό 톡해 Contextλ‚˜ Promiseλ₯Ό μ½μ–΄μ˜¬ λ•Œμ˜ μš°μ„ μˆœμœ„ λ Œλ”λ§ 및 비동기 쀑단(Suspense) λ§€μ»€λ‹ˆμ¦˜μ€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”κ°€? * RSC(React Server Components) ν™˜κ²½μ—μ„œ μ„œλ²„ 둜직 처리 κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ ν›…(예: React Query의 `useSuspenseQuery`)κ³Ό 동기화할 λ•Œ, μΊμ‹œ λ¬΄νš¨ν™” 및 이쀑 λΌμš΄λ“œνŠΈλ¦½ 문제λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆλŠ”κ°€? ### Practical Application Contexts * **Implementation:** `useState`와 `useEffect`λ₯Ό κ²°ν•©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈ λ‚΄ κΈ°λ³Έ μƒνƒœ 및 API 호좜 λΆ€μˆ˜ 효과λ₯Ό κ΅¬ν˜„ν•˜λ©°, TypeScriptλ₯Ό μ μš©ν•˜μ—¬ μƒνƒœμ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž… μ•ˆμ „μ„±μ„ 보μž₯ν•˜λŠ” μ»€μŠ€ν…€ 훅을 μž‘μ„±ν•œλ‹€ [1, 2, 21]. * **System Design:** UI의 ꡬ쑰적 ν˜•νƒœ(Presentational)와 데이터 페칭 및 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Custom Hooks)을 μ² μ €νžˆ λΆ„λ¦¬ν•˜μ—¬ μ„€κ³„ν•¨μœΌλ‘œμ¨, 'κ°€μ§œ(Dummy) 데이터'μ—μ„œ μ‹€μ œ λ°μ΄ν„°λ‘œμ˜ μ „ν™˜ 및 μ»΄ν¬λ„ŒνŠΈ μž¬μ‚¬μš©μ„±μ„ 높인닀 [2, 5]. * **Operation / Maintenance:** λ¦°ν„°(Linter)λ₯Ό 톡해 `use` 접두어 κ·œμΉ™κ³Ό `useEffect`의 μ˜μ‘΄μ„± 배열을 κ²€μ‚¬ν•˜κ³ , μ„±λŠ₯ μ΅œμ ν™”κ°€ λͺ…ν™•νžˆ μž…μ¦λœ 병λͺ© κ΅¬κ°„μ—λ§Œ μ œν•œμ μœΌλ‘œ λ©”λͺ¨μ΄μ œμ΄μ…˜ 훅을 μ μš©ν•˜μ—¬ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μœ μ§€ν•œλ‹€ [16, 17]. * **Learning Path:** 클래슀 μ»΄ν¬λ„ŒνŠΈμ˜ 라이프사이클 λ©”μ„œλ“œκ°€ Hooks νŒ¨ν„΄μœΌλ‘œ μ–΄λ–»κ²Œ λ³€ν™˜λ˜λŠ”μ§€ μ΄ν•΄ν•œ ν›„, Context 및 μ»€μŠ€ν…€ ν›…μ˜ νŒ¨ν„΄μ„ 읡히고, μ΅œμ’…μ μœΌλ‘œ React 19 μ‹ κ·œ ν›…κ³Ό μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ˜ μ œμ•½ 사항을 ν•™μŠ΅ν•˜λŠ” νλ¦„μœΌλ‘œ μ ‘κ·Όν•œλ‹€ [1, 6, 9]. * **My Project Relevance:** ν”„λ ˆμž„μ›Œν¬λ³„ μ‹€μ „ μ•„ν‚€ν…μ²˜ νŒ¨ν„΄μ„ ꡬ좕할 λ•Œ, ν”„λ‘ νŠΈμ—”λ“œ νŒŒνŠΈμ—μ„œλŠ” UI μš”μ†Œμ™€ μƒνƒœ 훅을 λͺ…ν™•νžˆ λΆ„λ¦¬ν•˜κ³ , μ„œλ²„/ν΄λΌμ΄μ–ΈνŠΈ ν™˜κ²½ 경계λ₯Ό λ‚˜λˆ„μ–΄ 효율적이고 μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ μ»΄ν¬λ„ŒνŠΈ 트리λ₯Ό κ΅¬μ„±ν•˜λŠ” κ°€μ΄λ“œλΌμΈμœΌλ‘œ ν™œμš©λœλ‹€. ### Adjacent Topics * [[Composition API]] * ν™•μž₯ λ°©ν–₯: React Hooks와 λ™μΌν•œ λ¬Έμ œμ˜μ‹(둜직 μž¬μ‚¬μš©μ„± 및 μ½”λ“œ ꡬ성)을 λ°”νƒ•μœΌλ‘œ νƒ„μƒν•œ Vue 3의 핡심 μ•„ν‚€ν…μ²˜ νŒ¨ν„΄μœΌλ‘œ, 두 ν”„λ ˆμž„μ›Œν¬μ˜ μƒνƒœ 관리 μ² ν•™ 차이λ₯Ό 비ꡐ μ—°κ΅¬ν•˜λŠ” 데 ν™œμš©λœλ‹€ [22, 23]. * [[State Management]] * ν™•μž₯ λ°©ν–₯: 둜컬 및 μ „μ—­ μƒνƒœλ₯Ό 효과적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ React의 Context API 및 μ„œλ“œνŒŒν‹° μƒνƒœ 관리 라이브러리(Redux Toolkit, Zustand, Jotai λ“±)둜의 연ꡬ ν™•μž₯ [10, 24]. --- *Last updated: 2026-05-03*