# [[useEffect]] ## πŸ“Œ Brief Summary `useEffect`λŠ” λ¦¬μ•‘νŠΈ(React) ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ(side effects)λ₯Ό κ΄€λ¦¬ν•˜κ³  μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 핡심 ν›…(Hook)μž…λ‹ˆλ‹€ [1, 2]. 이 훅을 효과적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ‹€ν–‰ 타이밍을 μ œμ–΄ν•˜λŠ” μ˜μ‘΄μ„± λ°°μ—΄(dependency array)κ³Ό λ¦¬μ†ŒμŠ€ ν•΄μ œλ₯Ό μœ„ν•œ 클린업(cleanup) ν•¨μˆ˜λ₯Ό μ˜¬λ°”λ₯΄κ²Œ 관리해야 ν•©λ‹ˆλ‹€ [2, 3]. μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ λ‚¨μš©ν•˜κ±°λ‚˜ 관리λ₯Ό μ†Œν™€νžˆ ν•˜λ©΄ 예기치 μ•Šμ€ λ¦¬λ Œλ”λ§κ³Ό μ„±λŠ₯ μ €ν•˜, μ‹¬κ°ν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [3, 4]. ## πŸ“– Core Content - **μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ 관리**: `useEffect`λŠ” 주둜 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ 데이터 ꡬ독, 이벀트 λ¦¬μŠ€λ„ˆ 등둝 λ“±μ˜ μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ 동기화 및 λΆ€μˆ˜ 효과λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€ [2]. - **μ˜μ‘΄μ„± λ°°μ—΄(Dependency Array)의 μ€‘μš”μ„±**: `useEffect`κ°€ μ–Έμ œ 싀행될지 κ²°μ •ν•˜λŠ” μ˜μ‘΄μ„± 배열을 μ •ν™•ν•˜κ²Œ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. 배열이 잘λͺ» 제곡되면 예기치 μ•Šμ€ λ™μž‘, μ»΄ν¬λ„ŒνŠΈμ˜ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§, ν˜Ήμ€ κΌ­ ν•„μš”ν•œ μ—…λ°μ΄νŠΈκ°€ λˆ„λ½λ˜λŠ” 버그가 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [2]. λ§Œμ•½ JSX λ‚΄λΆ€λ‚˜ λ Œλ”λ§ 도쀑 μ„ μ–Έλœ 읡λͺ… ν•¨μˆ˜λ₯Ό `useEffect`의 μ˜μ‘΄μ„±μœΌλ‘œ μ „λ‹¬ν•˜λ©΄, λ§€ λ Œλ”λ§λ§ˆλ‹€ ν•¨μˆ˜ μ°Έμ‘°κ°€ μƒˆλ‘œ μƒμ„±λ˜μ–΄ `useEffect`κ°€ λΆˆν•„μš”ν•˜κ²Œ μž¬μ‹€ν–‰λ˜λŠ” 원인이 λ©λ‹ˆλ‹€ [5]. - **클린업(Cleanup) νŒ¨ν„΄**: 이벀트 λ¦¬μŠ€λ„ˆλ‚˜ κ΅¬λ…μ²˜λŸΌ μ’…λ£Œ μ‹œ μ²˜λ¦¬κ°€ ν•„μš”ν•œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλŠ” `useEffect` λ‚΄λΆ€μ—μ„œ λ°˜λ“œμ‹œ 클린업 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€ [3]. μ»΄ν¬λ„ŒνŠΈκ°€ μ–Έλ§ˆμš΄νŠΈ(unmount)될 λ•Œ 이 클린업 ν•¨μˆ˜κ°€ λ¦¬μ†ŒμŠ€λ₯Ό ν•΄μ œν•˜μ§€ μ•ŠμœΌλ©΄, μ°Έμ‘°κ°€ λ©”λͺ¨λ¦¬μ— 계속 남아 점진적인 μ„±λŠ₯ μ €ν•˜λ₯Ό μœ λ°œν•˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)κ°€ λ°œμƒν•©λ‹ˆλ‹€ [3, 6]. - **μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ(Server Components) ν™˜κ²½μ—μ„œμ˜ μ œν•œ**: Next.js 13 μ΄μƒμ—μ„œ μ‚¬μš©λ˜λŠ” λ¦¬μ•‘νŠΈ μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ(RSC)μ—μ„œλŠ” μƒνƒœλ‚˜ 라이프사이클을 κ°€μ§ˆ 수 μ—†μœΌλ―€λ‘œ `useEffect`λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€ [7]. μ„œλ²„ μ»΄ν¬λ„ŒνŠΈλŠ” ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ 슀크립트 없이 μ„œλ²„μ—μ„œ 데이터λ₯Ό 직접 페칭(fetching)ν•  수 있게 ν•΄μ£Όμ–΄, 전톡적인 `useEffect` 기반 데이터 λ‘œλ”© νŒ¨ν„΄μ„ 상당 λΆ€λΆ„ λŒ€μ²΄ν•©λ‹ˆλ‹€ [8]. ## βš–οΈ Trade-offs & Caveats - **μ„±λŠ₯ μ˜€λ²„ν—€λ“œμ™€ λ Œλ”λ§ μ•…μˆœν™˜**: `useEffect`λ₯Ό λ‚¨μš©ν•˜μ—¬ λ„ˆλ¬΄ λ§Žμ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κ²Œ 되면 μž¦μ€ μ»΄ν¬λ„ŒνŠΈ λ¦¬λ Œλ”λ§μ΄ λ°œμƒν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „λ°˜μ μΈ μ„±λŠ₯κ³Ό μ‚¬μš©μž κ²½ν—˜μ΄ 크게 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€ [4]. - **λ©”λͺ¨λ¦¬ λˆ„μˆ˜ μ œμ•½**: 개발자의 λΆ€μ£Όμ˜λ‘œ 인해 클린업 ν•¨μˆ˜κ°€ λˆ„λ½λ˜κ±°λ‚˜ μ˜μ‘΄μ„± λ°°μ—΄ 관리가 잘λͺ»λ˜λ©΄, μ»΄ν¬λ„ŒνŠΈκ°€ ν™”λ©΄μ—μ„œ 사라진 후에도 λ°±κ·ΈλΌμš΄λ“œ 연산이 계속 μ§„ν–‰λ˜κ±°λ‚˜ DOM μ°Έμ‘°κ°€ λ©”λͺ¨λ¦¬μ— 남아(Detached DOM nodes) 치λͺ…적인 λ©”λͺ¨λ¦¬ λˆ„μˆ˜ μ œμ•½ 상황을 μ΄ˆλž˜ν•©λ‹ˆλ‹€ [3, 4, 6]. - **μ½”λ“œ λ³΅μž‘λ„ 증가**: λ ˆκ±°μ‹œ λ¦¬μ•‘νŠΈ μ½”λ“œλ² μ΄μŠ€ λ¦¬νŒ©ν† λ§ μ‹œ, λΆˆν•„μš”ν•œ `useEffect` μ œκ±°κ°€ 핡심 과제둜 κΌ½νž™λ‹ˆλ‹€ [9]. μƒνƒœ(state) λ„μΆœμ΄λ‚˜ νŒŒμƒ 데이터 생성에 `useEffect`λ₯Ό μ˜€μš©ν•˜λ©΄ μœ μ§€λ³΄μˆ˜μ„±μ΄ λ–¨μ–΄μ§€λ©°, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‘œμ§μ„ κ±·μ–΄λ‚΄κ³  `useMemo`λ‚˜ `useCallback` λ“±μœΌλ‘œ ꡬ쑰λ₯Ό λ‹€μ‹œ 섀계해야 ν•˜λŠ” 뢀담이 μƒκΉλ‹ˆλ‹€ [4, 9]. ## πŸ”— Knowledge Connections ### Related Concepts #### [μ΅œμ ν™” 및 λŒ€μ•ˆ 기술] - [[useMemo]] - μ—°κ²° 이유: `useEffect`λ₯Ό λ‚¨μš©ν•˜μ—¬ νŒŒμƒ 데이터λ₯Ό κ³„μ‚°ν•˜λŠ” λŒ€μ‹ , 계산 λΉ„μš©μ΄ 높은 값을 λ©”λͺ¨μ΄μ œμ΄μ…˜ν•  λ•Œ μ ν•©ν•œ λŒ€μ•ˆμœΌλ‘œ ꢌμž₯λ©λ‹ˆλ‹€ [4]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λΆˆν•„μš”ν•œ μ—°μ‚°κ³Ό λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•˜κ³  μƒνƒœ νŒŒμƒ μ΅œμ ν™”λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법. - [[useCallback]] - μ—°κ²° 이유: `useEffect`의 μ˜μ‘΄μ„± 배열에 λ“€μ–΄κ°€λŠ” ν•¨μˆ˜μ˜ μ°Έμ‘°(Reference Identity)λ₯Ό λ Œλ”λ§ 간에 μ•ˆμ •μ μœΌλ‘œ μœ μ§€μ‹œν‚€κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€ [4, 5]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ°Έμ‘° 동등성(Reference Equality)이 λ¦¬μ•‘νŠΈ λ Œλ”λ§ 사이클 및 μ΄νŽ™νŠΈ μ‹€ν–‰ λΉˆλ„μ— λ―ΈμΉ˜λŠ” 영ν–₯. #### [μ•„ν‚€ν…μ²˜ 및 디버깅 도ꡬ] - [[React Server Components]] - μ—°κ²° 이유: μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ ν™˜κ²½μ—μ„œλŠ” `useEffect`의 μ‚¬μš©μ΄ μ›μ²œμ μœΌλ‘œ μ°¨λ‹¨λ˜λ©°, 이λ₯Ό 톡해 `useEffect`에 μ˜μ‘΄ν•˜λ˜ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ 데이터 페칭 ꡬ쑰λ₯Ό μ„œλ²„λ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [7, 8]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ(Client State)와 μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ˜ μ—­ν•  뢄리 및 ν•˜μ΄λ“œλ ˆμ΄μ…˜(Hydration) μ΅œμ ν™” 방식. - [[Memory Leaks]] - μ—°κ²° 이유: `useEffect`μ—μ„œ 클린업을 λˆ„λ½ν•˜λŠ” 것이 μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ—μ„œ λ°œμƒν•˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ λŒ€ν‘œμ μΈ 원인 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€ [3, 6]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: Chrome DevTools의 Heap Snapshot 등을 ν™œμš©ν•˜μ—¬ λΆ„λ¦¬λœ DOM λ…Έλ“œ 및 μ •λ¦¬λ˜μ§€ μ•Šμ€ ꡬ독을 μΆ”μ ν•˜κ³  λ””λ²„κΉ…ν•˜λŠ” 원리. ### Deeper Research Questions - `useEffect`의 μ˜μ‘΄μ„± λ°°μ—΄ λ‚΄λΆ€μ—μ„œ 얕은 비ꡐ(Shallow Comparison)κ°€ λ™μž‘ν•˜λŠ” 방식은 κ°μ²΄λ‚˜ λ°°μ—΄ 같은 μ°Έμ‘° νƒ€μž… 데이터에 μ–΄λ–€ λΆ€μž‘μš©μ„ μΌμœΌν‚€λŠ”κ°€? - `useEffect`λ₯Ό μ΄μš©ν•œ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ 데이터 νŽ˜μΉ­μ„ TanStack Query (React Query)λ‚˜ Server Components둜 λŒ€μ²΄ν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μ•„ν‚€ν…μ²˜μ  이점과 μ„±λŠ₯ μ°¨μ΄λŠ” 무엇인가? - λΆˆν•„μš”ν•œ `useEffect`λ₯Ό μ‹λ³„ν•˜κ³  μ œκ±°ν•˜κΈ° μœ„ν•΄ `why-did-you-render`λ‚˜ React Profiler와 같은 도ꡬλ₯Ό μ–΄λ–»κ²Œ ν™œμš©ν•˜μ—¬ μ„±λŠ₯ μΈ‘μ •μ˜ μ§€ν‘œλ‘œ 삼을 수 μžˆλŠ”κ°€? - μ»΄ν¬λ„ŒνŠΈκ°€ μ–Έλ§ˆμš΄νŠΈλ˜λŠ” μ‹œμ μ— `useEffect`의 클린업 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 과정은 λΈŒλΌμš°μ €μ˜ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection)κ³Ό μ–΄λ–»κ²Œ μƒν˜Έμž‘μš©ν•˜λŠ”κ°€? - `useEffect` ν›… λ‚΄λΆ€μ˜ λ‘œμ§μ„ `useTransition`μ΄λ‚˜ `useDeferredValue` λ“± λ™μ‹œμ„±(Concurrent) κΈ°λŠ₯κ³Ό κ²°ν•©ν•  λ•Œ κ³ λ €ν•΄μ•Ό ν•  동기화 λ¬Έμ œλŠ” 무엇인가? ### Practical Application Contexts - **Implementation:** ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ 이벀트 λ¦¬μŠ€λ„ˆ(예: 슀크둀, λ¦¬μ‚¬μ΄μ¦ˆ)λ₯Ό λΆ™μ΄κ±°λ‚˜ μ™ΈλΆ€ 라이브러리λ₯Ό λ§ˆμš΄νŠΈν•  λ•Œ ν™œμš©ν•˜λ©°, λ°˜ν™˜ ν•¨μˆ˜λ₯Ό 톡해 λͺ…μ‹œμ μΈ 클린업(removeEventListener λ“±)을 κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€ [2, 3]. - **System Design:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ Œλ”λ§ μ„±λŠ₯을 섀계할 λ•Œ, 자주 λ³€κ²½λ˜λŠ” μƒνƒœμ˜ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλŠ” μ»΄ν¬λ„ŒνŠΈ 트리의 μ΅œν•˜λ‹¨μœΌλ‘œ κ²©λ¦¬ν•˜κ±°λ‚˜ Context API λŒ€μ‹  Zustand와 같은 μƒνƒœ κ΄€λ¦¬μžλ₯Ό ν™œμš©ν•˜μ—¬ λ¦¬λ Œλ”λ§ λ²”μœ„λ₯Ό μ œν•œν•΄μ•Ό ν•©λ‹ˆλ‹€ [10, 11]. - **Operation / Maintenance:** ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ μ‹œκ°„μ΄ 지남에 따라 앱이 λŠλ €μ§€κ±°λ‚˜ λ©ˆμΆ”λŠ” ν˜„μƒμ΄ λ°œμƒν•  경우, Chrome DevTools의 Memory 탭을 톡해 `useEffect`의 ꡬ독 ν•΄μ œ λˆ„λ½ μ—¬λΆ€λ₯Ό ν”„λ‘œνŒŒμΌλ§ν•˜κ³  λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ””λ²„κΉ…ν•©λ‹ˆλ‹€ [6, 12]. - **Learning Path:** λ¦¬μ•‘νŠΈλ₯Ό 처음 λ°°μš°λŠ” λ‹¨κ³„μ—μ„œ ν›…μ˜ κ·œμΉ™(Rules of Hooks)을 μ΄ν•΄ν•˜κ³ , 생λͺ…μ£ΌκΈ°(Lifecycle) λ©”μ„œλ“œκ°€ ν•¨μˆ˜ν˜•μ˜ `useEffect`둜 μ–΄λ–»κ²Œ λŒ€μ²΄λ˜λŠ”μ§€, 그리고 μ˜μ‘΄μ„± λ°°μ—΄ 관리가 μ™œ μ€‘μš”ν•œμ§€λ₯Ό νŒŒμ•…ν•˜λŠ” 핡심 ν•™μŠ΅ κ²½λ‘œμž…λ‹ˆλ‹€ [2, 13]. - **My Project Relevance:** λ ˆκ±°μ‹œ λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈλ₯Ό λ¦¬νŒ©ν† λ§ν•˜κ±°λ‚˜ 클래슀 기반 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•  λ•Œ, λΆˆν•„μš”ν•œ `useEffect` 체인을 μ œκ±°ν•˜κ³  μ˜μ‘΄μ„± 배열을 κ΅μ •ν•˜μ—¬ μ½”λ“œ 슀멜(Code Smell)을 μ—†μ• κ³  ν™•μž₯성을 λ†’μ΄λŠ” 싀무 κ³Όμ œμ™€ μ§κ²°λ©λ‹ˆλ‹€ [9]. ### Adjacent Topics - [[Rules of Hooks]] - ν™•μž₯ λ°©ν–₯: `useEffect`λ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  λ¦¬μ•‘νŠΈ 훅이 반볡문, 쑰건문 λ‚΄λΆ€κ°€ μ•„λ‹Œ μ»΄ν¬λ„ŒνŠΈμ˜ μ΅œμƒμœ„μ—μ„œλ§Œ μΌκ΄€λ˜κ²Œ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•˜λŠ” ꡬ쑰적 원리λ₯Ό μ΄ν•΄ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€ [13]. --- *Last updated: 2026-04-30*