개발 노트
frontend
2025
3
React Hooks 가이드

React Hooks 가이드

React Hooks는 함수형 컴포넌트에 상태 관리와 생명주기 기능을 도입한 혁신적인 기능입니다.

1. useState: 상태 관리의 기본

import React, { useState } from 'react';
 
function Counter() {
  const [count, setCount] = useState(0);
 
  return (
    <div>
      <p>현재 카운트: {count}</p>
      <button onClick={() => setCount(count + 1)}>증가</button>
      <button onClick={() => setCount(prevCount => prevCount - 1)}>감소</button>
    </div>
  );
}

2. useEffect: 생명주기와 부수 효과 관리

import React, { useState, useEffect } from 'react';
 
function DataFetcher() {
  const [data, setData] = useState(null);
 
  useEffect(() => {
    async function fetchData() {
      const response = await fetch('https://api.example.com/data');
      const result = await response.json();
      setData(result);
    }
 
    fetchData();
  }, []); // 빈 의존성 배열: 최초 1회만 실행
 
  return <div>{/* 데이터 렌더링 */}</div>;
}

3. useContext: 컴포넌트 간 상태 공유

import React, { createContext, useContext, useState } from 'react';
 
const ThemeContext = createContext();
 
function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');
 
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}
 
function ThemedComponent() {
  const { theme, setTheme } = useContext(ThemeContext);
 
  return (
    <div>
      <p>현재 테마: {theme}</p>
      <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
        테마 전환
      </button>
    </div>
  );
}

4. useReducer: 복잡한 상태 관리

import React, { useReducer } from 'react';
 
function todoReducer(state, action) {
  switch (action.type) {
    case 'ADD_TODO':
      return [...state, { 
        id: Date.now(), 
        text: action.payload, 
        completed: false 
      }];
    case 'TOGGLE_TODO':
      return state.map(todo => 
        todo.id === action.payload 
          ? { ...todo, completed: !todo.completed }
          : todo
      );
    default:
      return state;
  }
}
 
function TodoList() {
  const [todos, dispatch] = useReducer(todoReducer, []);
 
  const addTodo = (text) => {
    dispatch({ type: 'ADD_TODO', payload: text });
  };
 
  return (
    <div>
      {/* Todo 목록 렌더링 로직 */}
    </div>
  );
}

주의사항

  • Hooks는 함수형 컴포넌트의 최상위 레벨에서만 호출
  • 조건문, 반복문, 중첩 함수 내에서 Hooks 사용 금지
  • 성능 최적화를 위해 useMemo, useCallback 적절히 활용

결론

React Hooks는 컴포넌트 로직을 더 간결하고 재사용 가능하게 만들어줍니다. 각 Hook의 특성을 잘 이해하고 적절히 활용하세요.