75 lines
8.8 KiB
Markdown
75 lines
8.8 KiB
Markdown
# [[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* |