2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

React에서 useReducer 훅은 어떻게 사용하나요?

_____
Q1: useReducer란 무엇인가요?
A1: useReducer는 React에서 상태 관리를 위해 사용하는 훅 중 하나로, 복잡한 상태 로직을 다룰 때 useState보다 더 명확하고 구조적인 방식을 제공합니다. 상태와 상태를 변경하는 리듀서 함수(순수 함수)를 결합해 사용합니다.

Q2: useReducer를 언제 사용하면 좋은가요?
A2: 상태가 여러 값으로 복잡하거나, 상태 업데이트 로직이 복잡한 분기문으로 구성되어 있을 때, 또는 이전 상태에 기반해 새 상태를 계산할 때 useReducer가 효과적입니다. 또한, 상태 업데이트 과정을 더 구조적으로 관리하고 싶을 때 적합합니다.

Q3: useReducer 사용법은 어떻게 되나요?
A3: useReducer는 다음과 같이 사용합니다.
```jsx
const [state, dispatch] = useReducer(reducer, initialState);
```
- `reducer`: (state, action) => newState 형태의 함수
- `initialState`: 초기 상태 값
- `state`: 현재 상태
- `dispatch`: 액션을 리듀서에 전달하는 함수

Q4: reducer 함수는 어떻게 생겼나요?
A4: reducer는 두 개의 매개변수(`state`, `action`)를 받고 새로운 상태를 반환하는 순수 함수입니다. 예:
```jsx
function reducer(state, action) {
switch(action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
}
```

Q5: 액션(action)은 무엇이며 어떻게 작성하나요?
A5: 액션은 상태 변경을 지시하는 객체로, 보통 `type` 프로퍼티를 포함합니다. 추가 데이터를 전달하려면 `payload` 속성을 사용할 수 있습니다. 예:
```js
{ type: 'add_todo', payload: { id: 1, text: '할 일 추가' } }
```

Q6: useReducer 사용 예제 코드가 궁금합니다.
A6: 간단한 카운터 예제입니다.
```jsx
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 (
<>

Count: {state.count}





);
}

export default Counter;
```

Q7: useReducer의 장점은 무엇인가요?
A7:
- 상태 관리 로직이 중앙 집중화되어 가독성과 유지보수가 편리합니다.
- 복잡한 상태 변경을 명확하게 표현할 수 있습니다.
- useState보다 상태 업데이트 과정을 추적하기 쉽습니다.
- Redux 스타일 상태 관리를 간단히 구현할 수 있습니다.

Q8: useReducer와 useState의 차이는 무엇인가요?
A8: useState는 단순 상태 및 단일 상태 업데이트에 편리합니다. useReducer는 복잡한 상태 로직이나 여러 상태값을 한꺼번에 다뤄야 할 때 더 적합합니다. 리듀서 함수 덕분에 상태 변경 로직이 분리되고 체계적입니다.

Q9: 초기 상태 로직을 지연할 수 있나요?
A9: 네, useReducer의 세 번째 인자로 초기 상태 함수를 넣어 지연 초기화를 할 수 있습니다.
```jsx
const [state, dispatch] = useReducer(reducer, undefined, initFunction);
```
`initFunction`은 `initialArg`를 받아 초기 상태를 계산해 반환합니다.

Q10: useReducer에서 상태를 비동기적으로 업데이트할 수 있나요?
A10: 리듀서는 순수 함수여야 하므로 비동기 로직은 직접 포함하지 않습니다. 대신, 비동기 작업은 컴포넌트 내에서 수행하고 완료 후 `dispatch`를 통해 액션을 전달합니다.

---
이러한 내용으로 useReducer 훅의 사용법과 특징을 충분히 이해할 수 있습니다.
`useReducer` 훅은 React에서 상태 관리를 위한 강력한 도구로, 특히 복잡한 상태 로직을 다루거나 여러 하위 컴포넌트에서 상태를 공유해야 할 때 유용합니다.

`useReducer`는 Redux와 유사한 패턴을 사용하여 상태를 업데이트하는데, 이로 인해 상태 변화의 흐름을 명확하게 관리할 수 있습니다.

기본 사용법 `useReducer`는 두 개의 인자를 받습니다: 리듀서 함수와 초기 상태입니다.

리듀서 함수는 현재 상태와 액션을 인자로 받아 새로운 상태를 반환합니다.

1. 리듀서 함수 정의 리듀서 함수는 다음과 같은 형태를 가집니다: ```javascript const reducer = (state, action) => { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } }; ``` 위의 예시에서 `reducer`는 상태 객체와 액션 객체를 받아서 새로운 상태를 반환합니다.



2. 초기 상태 정의 초기 상태는 보통 객체 형태로 정의됩니다: ```javascript const initialState = { count: 0 }; ```

3. useReducer 훅 사용 이제 `useReducer`를 사용하여 상태를 관리할 수 있습니다: ```javascript import React, { useReducer } from 'react'; const Counter = () => { const initialState = { count: 0 }; const reducer = (state, action) => { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } }; const [state, dispatch] = useReducer(reducer, initialState); return (

Count: {state.count}

); }; export default Counter; ``` 설명 1. 상태와 디스패치 함수 : `useReducer`는 현재 상태와 `dispatch` 함수를 반환합니다.

`dispatch` 함수는 액션을 리듀서에 전달하여 상태를 업데이트합니다.



2. 액션 객체 : 액션은 일반적으로 `type` 속성을 가진 객체입니다.

이 `type`은 리듀서에서 어떤 작업을 수행할지를 결정합니다.



3. 상태 업데이트 : 버튼 클릭 시 `dispatch`를 호출하여 액션을 리듀서에 전달하고, 리듀서는 현재 상태와 액션을 기반으로 새로운 상태를 반환합니다.

장점 - 명확한 상태 관리 : 상태 업데이트 로직이 리듀서에 집중되어 있어, 상태 변화의 흐름을 쉽게 추적할 수 있습니다.

- 복잡한 상태 로직 : 여러 상태를 관리하거나 상태 업데이트가 복잡한 경우에 유용합니다.

- 컴포넌트 간 상태 공유 : 여러 컴포넌트에서 동일한 상태를 사용할 수 있도록 쉽게 구조화할 수 있습니다.

결론 `useReducer`는 React에서 상태 관리를 위한 강력한 도구로, 특히 복잡한 상태 로직을 다루는 데 유용합니다.

리듀서 패턴을 통해 상태 변화의 흐름을 명확하게 관리할 수 있으며, 여러 컴포넌트 간의 상태 공유도 용이합니다.

이를 통해 더 나은 유지보수성과 가독성을 가진 코드를 작성할 수 있습니다.

작성자: 박민지 [비회원] | 작성일자: 1년 전 2024-09-12 15:30:40
조회수: 172 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.