Redux는 애플리케이션에서 상태 관리를 위한 라이브러리 입니다.
단일 상태 트리(single state tree) 개념을 사용해 애플리케이션의 상태를 중앙에서 관리하며
예측 가능한 방식으로 상태 변화를 처리합니다.
대규모 애플리케이션에서 상태관리의 복잡성을 줄이는데 도움을 주고
상태를 예측 가능하고 일관성 있게 관리할 수 있도록 도와줍니다.
데이터는 Action -> Reducer -> Store -> View의 순서로 단방향으로 흐르며, 이는 데이터 관리의 일관성을 유지하는 데 도움을 줍니다.
(간단한 사용 예시코드도 함께 작성해 주세요.)
Action은 애플리케이션에서 발생하는 사건을 기술하는 객체입니다.type이라는 속성을 가지고 있으며 선택적으로 데이터를 포함할 수 있습니다.const upAction = {
type: 'UP',
payload: 1,
};
Dispatch는 Action을 Store에 보내는 역할을 합니다.Store는 전달된 Action을 받아서 적절한 Reducer로 전달하고, 상태를 업데이트합니다.Dispatch합니다.
store.dispatch(upAction);
Reducer는 Action을 처리하여 새로운 상태를 반환하는 함수입니다.Action을 입력받아 새로운 상태를 반환합니다.Reducer는 순수 함수여야 하며 입력 값에만 의존하고 부수 효과(side effect)를 가지지 않아야 합니다.Reducer 함수입니다.const counterReducer = (state = 0, action) => {
switch (action.type) {
case 'UP':
return state + action.payload;
case 'DOWN':
return state - action.payload;
default:
return state;
}
};
Store는 애플리케이션의 상태를 관리하는 객체입니다.Action을 Dispatch하며 상태가 변경될 때마다Redux Store를 생성하는 코드입니다.import { createStore } from 'redux';
const store = createStore(counterReducer);
// 초기 상태 조회
console.log(store.getState()); // 출력: 0
// 상태 변경 (Action Dispatch)
store.dispatch(upAction);
console.log(store.getState()); // 출력: 1
store.dispatch({ type: 'DOWN', payload: 1 });
console.log(store.getState()); // 출력: 0
useDispatch()dispatch)를 반환합니다.useSelector()Thunk는 Redux 앱에서 비동기 로직을 작성하기 위한 표준적인 접근 방식 이며 일반적으로 데이터 페칭에
사용됩니다. 그러나 다양한 작업에 사용할 수 있으며 동기 및 비동기 로직을 모두 포함할 수 있습니다.
Redux Toolkit은 Redux애플리케이션을 개발할 때 발생하는 반복적이고 복잡한 작업을 간소화하기 위해 제공되는 공식 패키지입니다. Redux는 상태 관리를 위해 널리 사용되는 JavaScript 라이브러리인데
(설정이 다소 복잡하고 보일러플레이트 코드가 많다는 단점이 있습니다.)
이러한 문제를 해결하기 위해 Redux Toolkit이 도입되었습니다.
configureStore, createSlice 등을 통해 설정을 단순화하고 코드를 줄여줍니다.createAsyncThunk를 통해 비동기 작업을 쉽게 처리할 수 있습니다.Redux Toolkit은 Redux의 복잡성을 줄이고 사용을 쉽게 하기 위해 만들어진 도구입니다.
(간단한 사용 예시코드도 함께 작성해 주세요.)
createSlice는 Redux의 리듀서와 액션을 함께 생성해주는 함수입니다.createSlice는 내부적으로 액션 생성자와 타입을 자동으로 생성해 주기 때문에 보일러플레이트 코드가 줄어듭니다.import { configureStore, createSlice } from '@reduxjs/toolkit';
// 1. createSlice로 상태, 리듀서, 액션 생성
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: state => { state.value += 1 }, // 액션 함수 정의
decrement: state => { state.value -= 1 },
reset: state => { state.value = 0 }
}
});
configureStore는 Redux 스토어를 설정하고 생성하는 함수입니다.
이 함수는 미들웨어, Redux DevTools 통합, 리듀서 결합 등의 설정을 간편하게 할 수 있도록 도와줍니다.
// 액션 추출
export const { increment, decrement, reset } = counterSlice.actions;
// 2. configureStore로 스토어 생성
const store = configureStore({
reducer: {
counter: counterSlice.reducer
}
});
// 스토어 사용 예시
store.dispatch(increment()); // 상태가 1 증가
store.dispatch(decrement()); // 상태가 1 감소
store.dispatch(reset()); // 상태가 0으로 리셋
console.log(store.getState()); // { counter: { value: 0 } }
→ createAsyncThunk()란?
createAsyncThunk()는 Redux Toolkit에서 비동기 작업(예: API 호출)을 간단하게 처리할 수 있도록 도와주는 유틸리티 함수입니다.
비동기 작업의 상태(요청 중, 성공, 실패)를 자동으로 관리하고 해당 상태에 맞는 액션을 자동으로 생성해줍니다.
createAsyncThunk()의 사용법:createAsyncThunk를 사용해 비동기 작업을 정의합니다.extraReducers에서 정의합니다.