React Hooks 및 상태 관리
React Hooks 란 무엇이며 왜 도입되었나요?
답변:
React Hooks 는 함수형 컴포넌트에서 React 상태 및 생명주기 기능에 '연결 (hook into)'할 수 있게 해주는 함수입니다. Hooks 는 개발자가 클래스 컴포넌트를 작성하지 않고도 상태 및 기타 React 기능을 사용할 수 있도록 도입되었으며, 코드 재사용성, 가독성 향상, '래퍼 지옥 (wrapper hell)' 및 복잡한 생명주기 메서드와 같은 문제 해결을 촉진합니다.
useState Hook 의 목적을 설명해주세요.
답변:
useState Hook 은 함수형 컴포넌트가 상태를 관리할 수 있도록 합니다. 상태 값과 이를 업데이트하는 함수를 반환합니다. setter 함수가 호출되면 React 는 새로운 상태 값으로 컴포넌트를 다시 렌더링합니다.
useEffect Hook 은 어떻게 작동하며 일반적인 사용 사례는 무엇인가요?
답변:
useEffect Hook 은 함수형 컴포넌트에서 데이터 가져오기, 구독 설정 또는 DOM 수동 변경과 같은 부수 효과 (side effects) 를 수행할 수 있도록 합니다. 기본적으로 모든 렌더링 후에 실행되지만, 의존성 배열 (dependency array) 을 지정하여 실행을 제어할 수 있습니다. 일반적인 사용 사례로는 컴포넌트 마운트 시 데이터 가져오기, 이벤트 리스너 설정 및 리소스 정리 등이 있습니다.
useEffect에서 의존성 배열 (dependency array) 의 중요성은 무엇인가요?
답변:
useEffect의 의존성 배열은 효과 (effect) 가 언제 다시 실행될지를 제어합니다. 배열이 비어 있으면 ([]), 효과는 초기 렌더링 후에 한 번만 실행됩니다. 생략하면 모든 렌더링 후에 실행됩니다. 값이 포함되어 있으면, 해당 값 중 하나가 변경될 때만 효과가 다시 실행되어 불필요한 재실행 및 잠재적인 무한 루프를 방지합니다.
useContext는 언제 사용해야 하나요?
답변:
useContext는 React Context 에서 값을 가져오는 데 사용됩니다. 각 레벨에서 수동으로 props 를 전달하지 않고도 컴포넌트 트리를 통해 데이터를 깊숙이 전달할 수 있는 방법을 제공하여 'prop drilling'을 피할 수 있게 합니다. 테마, 사용자 인증 또는 로케일과 같은 전역 상태에 이상적입니다.
useState와 useReducer의 차이점을 설명해주세요.
답변:
useState는 일반적으로 기본값 (primitive values) 또는 작은 객체를 위한 간단한 상태 관리에 사용됩니다. useReducer는 더 복잡한 상태 로직, 특히 상태 전환이 여러 하위 값을 포함하거나 다음 상태가 이전 상태에 의존하는 경우에 useState의 대안입니다. 애플리케이션 전체 상태를 관리하거나 상태 업데이트가 복잡하고 'reducer' 함수를 포함하는 경우에 자주 사용됩니다.
useCallback이란 무엇이며 언제 사용해야 하나요?
답변:
useCallback은 메모이제이션된 (memoized) 콜백 함수를 반환하는 Hook 입니다. 특히 부모 컴포넌트에서 전달된 콜백에 의존하는 자식 컴포넌트의 불필요한 리렌더링을 방지하는 데 사용됩니다. 참조 동등성 (referential equality) 을 유지하기 위해 최적화된 자식 컴포넌트 (예: React.memo) 에 콜백을 전달할 때 유용합니다.
useMemo란 무엇이며 useCallback과 어떻게 다른가요?
답변:
useMemo는 메모이제이션된 값을 반환하는 Hook 입니다. 의존성이 변경되지 않은 경우 비용이 많이 드는 계산이 렌더링 시마다 다시 실행되는 것을 방지하여 성능을 최적화하는 데 사용됩니다. useCallback이 함수를 메모이제이션하는 반면, useMemo는 함수 호출의 결과 (값) 를 메모이제이션합니다.
'Hooks 규칙'을 설명해주세요.
답변:
두 가지 주요 규칙이 있습니다: 1) Hooks 는 React 함수형 컴포넌트 또는 사용자 정의 Hooks 의 최상위 레벨에서만 호출해야 합니다. 루프, 조건문 또는 중첩 함수 내에서는 호출하지 마세요. 2) Hooks 는 React 함수형 컴포넌트 또는 사용자 정의 Hooks 에서만 호출해야 합니다. 일반 JavaScript 함수에서는 호출하지 마세요. 이러한 규칙은 모든 렌더링에서 Hooks 가 동일한 순서로 호출되도록 보장합니다.
사용자 정의 Hooks 는 어떻게 작동하며 어떤 이점이 있나요?
답변:
사용자 정의 Hooks 는 이름이 use로 시작하고 다른 Hooks 를 호출할 수 있는 JavaScript 함수입니다. 이를 통해 컴포넌트에서 재사용 가능한 상태 로직을 추출할 수 있어, prop drilling 이나 render props 없이도 다른 컴포넌트 간에 로직을 쉽게 공유할 수 있습니다. 이점으로는 코드 구성, 재사용성 및 테스트 용이성 향상이 있습니다.
React 의 내장 Hooks 인 useState 및 useContext 대신 전역 상태 관리 라이브러리 (예: Redux, Zustand) 를 선택하는 경우는 언제인가요?
답변:
소규모 및 중간 규모 애플리케이션의 경우 useState와 useContext로도 충분한 경우가 많습니다. 그러나 복잡한 상태 상호 작용, 빈번한 업데이트 또는 중앙 집중식 디버깅 도구 (예: Redux DevTools) 가 필요한 대규모 애플리케이션의 경우, 전용 전역 상태 관리 라이브러리가 더 나은 확장성, 예측 가능성 및 유지 관리성을 제공합니다. 이러한 라이브러리는 미들웨어, 불변성 강제 및 단일 진실 공급원 (single source of truth) 과 같은 기능을 제공합니다.
useRef의 목적은 무엇인가요?
답변:
useRef는 .current 속성이 전달된 인수로 초기화된 변경 가능한 ref 객체를 반환합니다. 반환된 객체는 컴포넌트의 전체 수명 주기 동안 지속됩니다. 일반적으로 DOM 요소에 직접 액세스하고 상호 작용하거나, 업데이트 시 리렌더링을 유발하지 않는 변경 가능한 값 (예: 타이머 ID) 을 저장하는 데 사용됩니다.