# [[Rules of React]] ## πŸ“Œ Brief Summary 'Rules of React'λŠ” λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§ μ‚¬μ΄ν΄μ—μ„œ 예츑 κ°€λŠ₯ν•œ λ™μž‘μ„ ν•˜λ„λ‘ 보μž₯ν•˜κΈ° μœ„ν•΄ μ€€μˆ˜ν•΄μ•Ό ν•˜λŠ” μ—„κ²©ν•œ κ°€μ΄λ“œλΌμΈμž…λ‹ˆλ‹€ [1]. 이 κ·œμΉ™μ˜ 핡심은 λ Œλ”λ§ 쀑 λΆˆλ³€μ„±(immutability)을 μœ μ§€ν•˜κ³  μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ(side effects)λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ” κ²ƒμž…λ‹ˆλ‹€ [2]. λ˜ν•œ ν›…(Hooks)을 쑰건문 없이 μ»΄ν¬λ„ŒνŠΈ μ΅œμƒλ‹¨μ—μ„œλ§Œ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€λŠ” 'Rules of Hooks'λ₯Ό ν¬κ΄„ν•˜λ©° [3], 졜근의 React Compilerκ°€ λΉŒλ“œ νƒ€μž„μ— μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ μ΅œμ ν™”(λ©”λͺ¨μ΄μ œμ΄μ…˜)ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이 κ·œμΉ™μ˜ μ—„κ²©ν•œ μ€€μˆ˜κ°€ ν•„μˆ˜μ μž…λ‹ˆλ‹€ [1]. ## πŸ“– Core Content * **λ Œλ”λ§μ˜ 예츑 κ°€λŠ₯μ„± 보μž₯**: λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈλŠ” λͺ¨λ“  λ Œλ”λ§μ—μ„œ μΌκ΄€λ˜κ³  예츑 κ°€λŠ₯ν•œ λ™μž‘μ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1]. 이λ₯Ό μœ„ν•΄ μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§ 과정은 μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ 없이 순수(pure)ν•΄μ•Ό ν•˜λ©°, μƒνƒœμ™€ λ°μ΄ν„°μ˜ λΆˆλ³€μ„±(immutability)을 μ² μ €νžˆ μ§€μΌœμ•Ό ν•©λ‹ˆλ‹€ [2]. * **Rules of Hooks (ν›…μ˜ κ·œμΉ™)**: λ¦¬μ•‘νŠΈμ˜ μƒνƒœμ™€ 생λͺ…μ£ΌκΈ°λ₯Ό λ‹€λ£¨λŠ” ν›… μ‚¬μš© μ‹œ λ°˜λ“œμ‹œ μ§€μΌœμ•Ό ν•˜λŠ” 핡심 μ„ΈλΆ€ κ·œμΉ™μž…λ‹ˆλ‹€ [3]. * **μ΅œμƒλ‹¨ 호좜**: 훅은 항상 λ¦¬μ•‘νŠΈ ν•¨μˆ˜μ˜ μ΅œμƒλ‹¨(top level)μ—μ„œλ§Œ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [3]. * **쑰건뢀 호좜 κΈˆμ§€**: 쑰건문, 루프(loops), μ€‘μ²©λœ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 무쑰건적으둜 훅이 ν˜ΈμΆœλ˜μ–΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€ [3]. * **μ˜¬λ°”λ₯Έ 호좜 μœ„μΉ˜**: 일반 μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜ λ‚΄μ—μ„œλŠ” 훅을 ν˜ΈμΆœν•  수 μ—†μœΌλ©°, λ°˜λ“œμ‹œ λ¦¬μ•‘νŠΈ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ‚˜ μ»€μŠ€ν…€ ν›…(Custom Hooks) λ‚΄λΆ€μ—μ„œλ§Œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€ [3]. * **μˆœμ„œ 일관성**: λͺ¨λ“  λ Œλ”λ§μ—μ„œ ν›…μ˜ 이름과 호좜 μˆœμ„œκ°€ λ™μΌν•˜κ²Œ μœ μ§€λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [3]. * **정적 뢄석 및 λ¦°νŒ…(Linting) λ„κ΅¬μ˜ ν™œμš©**: 'Rules of React' μœ„λ°˜μ„ λ°©μ§€ν•˜κ³  예츑 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό κ°•μ œν•˜κΈ° μœ„ν•΄ 정적 뢄석 도ꡬλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1]. 특히 ESLint의 `eslint-plugin-react-hooks` ν”ŒλŸ¬κ·ΈμΈ(`recommended` λ˜λŠ” `recommended-latest` 프리셋)을 μ„€μ •ν•˜μ—¬ λΉŒλ“œ 전에 였λ₯˜λ₯Ό μž‘μ•„λ‚΄λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [1]. * **React Compilerμ™€μ˜ μ—°κ΄€μ„±**: 2025λ…„ κΈ°μ€€ μ•ˆμ •ν™”λœ React CompilerλŠ” μ½”λ“œκ°€ 'Rules of React'λ₯Ό λ”°λ₯Έλ‹€κ³  κ°€μ •ν•˜κ³  μž‘λ™ν•©λ‹ˆλ‹€ [1]. 정적 뢄석을 톡해 κ·œμΉ™μ„ μ€€μˆ˜ν•˜λŠ” μ½”λ“œ μš”μ†Œ(JSX, ν›… λ“±)에 μžλ™μœΌλ‘œ μ„Έλ°€ν•œ λ©”λͺ¨μ΄μ œμ΄μ…˜ λ‘œμ§μ„ μ£Όμž…ν•©λ‹ˆλ‹€ [1, 4]. λ§Œμ•½ κ·œμΉ™μ„ μœ„λ°˜ν•œ μ½”λ“œκ°€ 발견되면, μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œλ₯Ό λ§κ°€λœ¨λ¦¬μ§€ μ•ŠκΈ° μœ„ν•΄ ν•΄λ‹Ή λΆ€λΆ„μ˜ μ΅œμ ν™”(auto-memoization)λ₯Ό μ•ˆμ „ν•˜κ²Œ κ±΄λ„ˆλœλ‹ˆλ‹€ [1, 5]. ## βš–οΈ Trade-offs & Caveats 'Rules of React'λ₯Ό μ‹œμŠ€ν…œμ μœΌλ‘œ κ°•μ œν•  λ•Œ μ§λ©΄ν•˜λŠ” κ°€μž₯ 큰 μ œμ•½μ€ 기술 뢀채가 μŒ“μΈ λ ˆκ±°μ‹œ μ½”λ“œλ² μ΄μŠ€(Legacy Codebases)μ—μ„œμ˜ λ„μž… λΉ„μš©μž…λ‹ˆλ‹€ [6]. 기쑴의 λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ—λŠ” μ»΄ν¬λ„ŒνŠΈ λΌμ΄ν”„μ‚¬μ΄ν΄μ΄λ‚˜ ν›… μ‚¬μš© μ‹œ 'Rules of React'λ₯Ό μœ„λ°˜ν•˜λŠ” μ½”λ“œκ°€ μ—¬λŸ¬ 곳에 흩어져 μžˆλŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€ [6]. μƒˆλ‘œμš΄ React Compilerλ₯Ό λ„μž…ν•΄ μžλ™ μ΅œμ ν™” 이점을 μ–»μœΌλ €λ©΄, μ»΄νŒŒμΌλŸ¬κ°€ μ œλŒ€λ‘œ μž‘λ™ν•˜κΈ° 전에 μ΄λŸ¬ν•œ κ·œμΉ™ μœ„λ°˜ 사항을 λͺ¨λ‘ μ°Ύμ•„λ‚΄μ–΄ μˆ˜μ •ν•˜λŠ” λŒ€κ·œλͺ¨ λ¦¬νŒ©ν† λ§μ΄ μš”κ΅¬λ©λ‹ˆλ‹€ [6]. λ˜ν•œ, μ„œλ“œνŒŒν‹° 라이브러리(예: TanStack Query, Material UI λ“±)κ°€ λ Œλ”λ§λ§ˆλ‹€ μƒˆλ‘œμš΄ 객체 μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ„€κ³„λœ 경우, μ»΄νŒŒμΌλŸ¬κ°€ κ·œμΉ™μ— κΈ°λ°˜ν•˜μ—¬ 캐싱을 μ‹œλ„ν•˜λ”λΌλ„ 이λ₯Ό μš°νšŒν•˜μ—¬ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ μœ λ°œν•  수 μžˆμœΌλ―€λ‘œ, μ—¬μ „νžˆ μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜ 훅을 μ‘°ν•©ν•΄ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” ν•œκ³„κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€ [6, 7]. ## πŸ”— Knowledge Connections ### Related Concepts #### [μ•„ν‚€ν…μ²˜/기반 기술] - [[React Compiler]] - μ—°κ²° 이유: React CompilerλŠ” μ†ŒμŠ€ μ½”λ“œκ°€ 'Rules of React'λ₯Ό μ€€μˆ˜ν•œλ‹€λŠ” κ°€μ •ν•˜μ— λΉŒλ“œ νƒ€μž„ μžλ™ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μˆ˜ν–‰ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€ [1]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: κ·œμΉ™μ„ μ€€μˆ˜ν•  λ•Œ 얻을 수 μžˆλŠ” ꡬ체적인 μ„±λŠ₯ ν–₯상(INP κ°œμ„  λ“±)κ³Ό 컴파일러의 μ„ΈλΆ„ν™”λœ μ΅œμ ν™” μž‘λ™ 원리λ₯Ό 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [4, 8]. - [[Immutability & Side Effects]] - μ—°κ²° 이유: 'Rules of React'의 κ°€μž₯ 핡심적인 κ·Όλ³Έ 원칙이 λ°”λ‘œ λ Œλ”λ§ 쀑 λΆˆλ³€μ„± μœ μ§€μ™€ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ λ°©μ§€μž…λ‹ˆλ‹€ [2]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ™œ λ¦¬μ•‘νŠΈκ°€ λ Œλ”λ§μ„ 예츑 κ°€λŠ₯ν•˜κ²Œ μœ μ§€ν•΄μ•Ό ν•˜λ©°, λΆ€μˆ˜ νš¨κ³Όκ°€ λ Œλ”λ§ μ„±λŠ₯에 μ–΄λ–€ μ•…μ˜ν–₯을 λ―ΈμΉ˜λŠ”μ§€ μ›λ‘ μ μœΌλ‘œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. #### [κ΅¬ν˜„/ν™œμš© 도ꡬ] - [[eslint-plugin-react-hooks]] - μ—°κ²° 이유: κ°œλ°œμžκ°€ μ‹€μˆ˜λ‘œ 'Rules of React'λ₯Ό μœ„λ°˜ν•˜μ§€ μ•Šλ„λ‘ 정적 뢄석을 톡해 κ²½κ³ ν•˜κ³  κ·œμΉ™μ„ κ°•μ œν•˜λŠ” ν•„μˆ˜ ESLint ν”ŒλŸ¬κ·ΈμΈμž…λ‹ˆλ‹€ [1]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ¦°νŒ… 도ꡬ가 컴파일 νƒ€μž„μ— μ½”λ“œμ˜ μ»¨ν…μŠ€νŠΈλ₯Ό μ–΄λ–»κ²Œ λΆ„μ„ν•˜μ—¬ ν›…μ˜ 호좜 μˆœμ„œμ™€ 쑰건뢀 싀행을 λ§‰λŠ”μ§€ 싀무적 κ΄€μ μ—μ„œ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. - [[React Hooks]] - μ—°κ²° 이유: Rules of React의 κ°€μž₯ λŒ€ν‘œμ μΈ ν•˜μœ„ κ·œμΉ™μΈ 'Rules of Hooks'의 직접적인 λŒ€μƒμž…λ‹ˆλ‹€ [3]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ μƒνƒœ(State)와 생λͺ…μ£ΌκΈ°λ₯Ό λ‹€λ£° λ•Œ μ™œ μ΅œμƒλ‹¨ 호좜 및 무쑰건적 호좜이 ν•„μš”ν•œμ§€ 섀계적 관점을 μ œκ³΅ν•©λ‹ˆλ‹€ [3]. ### Deeper Research Questions - React CompilerλŠ” 정적 뢄석 κ³Όμ •μ—μ„œ 'Rules of React' μœ„λ°˜ μ—¬λΆ€λ₯Ό ꡬ체적으둜 μ–΄λ–»κ²Œ νŒλ³„ν•˜λ©°, μœ„λ°˜ μ‹œ μ»΄νŒŒμΌλŸ¬λŠ” λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–€ Fallback μ „λž΅μ„ μ·¨ν•˜λŠ”κ°€? - λ ˆκ±°μ‹œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 흩어져 μžˆλŠ” 'Rules of React' μœ„λ°˜ μ½”λ“œλ₯Ό React Compiler μΉœν™”μ μœΌλ‘œ λ¦¬νŒ©ν† λ§ν•˜κΈ° μœ„ν•œ 점진적 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜(Incremental Migration) μ „λž΅μ€ 무엇인가? - ν›…(Hooks)의 λ‚΄λΆ€ κ΅¬ν˜„μ²΄ ꡬ쑰상, 호좜 μˆœμ„œκ°€ λ³€κ²½λ˜κ±°λ‚˜ μ‘°κ±΄λΆ€λ‘œ 호좜될 λ•Œ λ¦¬μ•‘νŠΈ μ—”μ§„μ—μ„œ μ •ν™•νžˆ μ–΄λ–€ λ©”λͺ¨λ¦¬ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•˜λŠ”κ°€? - `eslint-plugin-react-hooks` ν”ŒλŸ¬κ·ΈμΈμ€ μ •κ·œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜μ™€ μ»€μŠ€ν…€ 훅을 ꡬ문 뢄석 νŠΈλ¦¬μ— κΈ°λ°˜ν•˜μ—¬ μ–΄λ–»κ²Œ μ •ν™•ν•˜κ²Œ 식별해 λ‚΄λŠ”κ°€? - μ„œλ“œνŒŒν‹° λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μœ λ„ν•˜λŠ” κ·œμΉ™ μœ„λ°˜(μ˜λ„μ μΈ λΆˆμ•ˆμ • μ°Έμ‘° λ°˜ν™˜)κ³Ό React Compiler κ°„μ˜ μΆ©λŒμ„ ν•΄κ²°ν•˜κΈ° μœ„ν•œ 졜적의 우회(workaround) νŒ¨ν„΄μ€ 무엇인가? ### Practical Application Contexts - **Implementation:** λ¦¬μ•‘νŠΈ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•  λ•Œ, λͺ¨λ“  `useState`, `useEffect` λ“±μ˜ 훅을 μ‘°κ±΄λ¬Έμ΄λ‚˜ 반볡문 λ‚΄λΆ€κ°€ μ•„λ‹Œ μ»΄ν¬λ„ŒνŠΈ μ΅œμƒλ‹¨ 계측에 μ„ μ–Έν•˜μ—¬ μƒνƒœ 관리 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€ [3]. - **System Design:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ Œλ” 트리 μ „λ°˜μ—μ„œ μˆœμˆ˜μ„±(purity)을 보μž₯ν•˜κΈ° μœ„ν•΄ 데이터 가곡 및 λΆ€μˆ˜ 효과 λ°œμƒ 지점을 λ Œλ”λ§ 사이클 λ°–(예: 이벀트 ν•Έλ“€λŸ¬λ‚˜ 미듀웨어)으둜 λΆ„λ¦¬ν•˜λŠ” μ•„ν‚€ν…μ²˜λ₯Ό μ„€κ³„ν•©λ‹ˆλ‹€ [2]. - **Operation / Maintenance:** CI/CD νŒŒμ΄ν”„λΌμΈμ— ESLint 섀정을 ν†΅ν•©ν•˜μ—¬ `eslint-plugin-react-hooks`λ₯Ό 톡해 'Rules of React' μœ„λ°˜ μ½”λ“œκ°€ ν”„λ‘œλ•μ…˜ λΈŒλžœμΉ˜μ— 병합(merge)λ˜λŠ” 것을 μžλ™ν™”λœ λ°©μ‹μœΌλ‘œ μ°¨λ‹¨ν•©λ‹ˆλ‹€ [1]. - **Learning Path:** λ¦¬μ•‘νŠΈ μ΄ˆμ‹¬μžκ°€ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ₯Ό ν•™μŠ΅ν•  λ•Œ, ν›…μ˜ μ‚¬μš©λ²•λ³΄λ‹€ λ¨Όμ € λ Œλ”λ§ 원리와 'Rules of Hooks'λ₯Ό ν•™μŠ΅ν•˜μ—¬ μΆ”ν›„ λ°œμƒν•  수 μžˆλŠ” λ‚œν•΄ν•œ 버그λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€ [3]. - **My Project Relevance:** React Compilerλ₯Ό μ μš©ν•˜μ—¬ λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μ „, κΈ°μ‘΄ μ½”λ“œλ² μ΄μŠ€ μ „λ°˜μ— 걸친 'Rules of React' μœ„λ°˜ 사둀듀을 λΆ„μ„ν•˜κ³  이λ₯Ό μ•ˆμ „ν•˜κ²Œ λ¦¬νŒ©ν† λ§ν•˜λŠ” 기반 μž‘μ—…μ— μ§κ²°λ©λ‹ˆλ‹€ [6]. ### Adjacent Topics - [[Automatic Memoization]] - ν™•μž₯ λ°©ν–₯: 'Rules of React'λ₯Ό μ€€μˆ˜ν•¨μœΌλ‘œμ¨ 달성할 수 μžˆλŠ” React Compiler의 핡심 κΈ°λŠ₯으둜, μˆ˜λ™ λ©”λͺ¨μ΄μ œμ΄μ…˜(`useMemo`, `useCallback`)과의 μ„±λŠ₯ 차이 및 좔상화 원리λ₯Ό μ‹¬μΈ΅μ μœΌλ‘œ λΉ„κ΅ν•©λ‹ˆλ‹€ [4, 8]. - [[Technical Debt]] - ν™•μž₯ λ°©ν–₯: λ ˆκ±°μ‹œ μ½”λ“œμ—μ„œ κ·œμΉ™μ„ μœ„λ°˜ν•œ ꡬ쑰적 뢀채가 μƒˆλ‘œμš΄ μ΅œμ ν™” 도ꡬ(React Compiler λ“±)의 λ„μž…μ„ μ–΄λ–»κ²Œ κ°€λ‘œλ§‰κ³  μœ μ§€λ³΄μˆ˜ λΉ„μš©μ„ μ¦κ°€μ‹œν‚€λŠ”μ§€ νƒκ΅¬ν•©λ‹ˆλ‹€ [6]. --- *Last updated: 2026-04-30*