useState는 리액트 함수형 컴포넌트에서 가장 기본적인 상태 관리 훅입니다. 이 훅은 컴포넌트 내에서 지역적으로 상태를 관리할 때 사용됩니다. 상태의 초기값을 전달하면, 그 상태와 그 상태를 업데이트할 수 있는 함수를 반환합니다.
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0); // count는 상태 값, setCount는 상태 업데이트 함수
return (
<div>
<p>현재 카운트: {count}</p>
<button onClick={() => setCount(count + 1)}>카운트 증가</button>
</div>
);
}
useReducer는 복잡한 상태 로직이 필요하거나, 여러 상태 값이 관련된 경우에 적합한 훅입니다. 이 훅은 리듀서 함수와 현재 상태, 그리고 상태 업데이트를 트리거하는 dispatch 함수를 반환합니다. 상태 업데이트 로직을 외부로 분리해 좀 더 명확한 상태 관리 패턴을 만들 수 있습니다.
import React, { useReducer } from 'react';
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div>
<p>현재 카운트: {state.count}</p>
<button onClick={() => dispatch({ type: 'increment' })}>증가</button>
<button onClick={() => dispatch({ type: 'decrement' })}>감소</button>
</div>
);
}
Context API는 리액트 애플리케이션에서 전역 상태를 관리할 때 사용합니다. 주로 부모-자식 관계의 여러 컴포넌트에서 동일한 상태를 공유해야 할 때 유용합니다. Context는 기본적으로 Provider와 Consumer 패턴을 사용해 데이터를 전달합니다.
import React, { createContext, useState } from 'react';
const CountContext = createContext();
function CounterProvider({ children }) {
const [count, setCount] = useState(0);
return (
<CountContext.Provider value={{ count, setCount }}>
{children}
</CountContext.Provider>
);
}
import React, { useContext } from 'react';
function Counter() {
const { count, setCount } = useContext(CountContext);
return (
<div>
<p>현재 카운트: {count}</p>
<button onClick={() => setCount(count + 1)}>증가</button>
</div>
);
}
애플리케이션의 여러 컴포넌트에서 동일한 상태를 공유해야 할 때.
깊은 컴포넌트 트리 구조에서 상태를 전달할 때 발생하는 props 전달 문제를 해결하고 싶을 때.
상태가 여러 컴포넌트 간에 자주 사용될 때.
훅 | 주요 용도 | 상태 복잡도 | 상태 공유 |
---|---|---|---|
useState | 단순한 상태 관리 (지역 상태) | 단순 | 불가능 |
useReducer | 복잡한 상태 관리 및 상태 로직 분리 | 복잡 (여러 상태/액션) | 불가능 |
Context API | 전역 상태 관리 (여러 컴포넌트 간 상태 공유) | 단순 또는 복잡한 상태 모두 가능 | 가능 (전역 상태) |