미들웨어 만들어보고 이해하기
실무에서는 리덕스 미들웨어를 직접 만들게 되는 일은 거의 없지만 한번 직접 만들어보게 된다면 미들웨어가 어떤 역할인지 훨씬 쉽게 이해 할 수 있기 때문에 만들어 보는 것이다.
1. 리덕스 미들웨어의 템플릿
리덕스 미들웨어를 만들 땐 다음 템플릿을 사용한다.
const middleware = store => next => action => { // 하고 싶은 작업... }
미들웨어는 결국 하나의 함수이다. 함수를 연달아서 두번 리턴하는 함수인 것인데. 화살표가 여러번 나타나는게 도대체 뭐지 하고 헷갈릴 수도 있을텐데 이 함수를 function 키워드를 사용하여 작성한다면 다음과 같다.
function middleware(store) { return function (next) { return function (action) { // 하고 싶은 작업... }; }; };
이제 여기서 각 함수에서 받아오는 파라미터가 어떤 것을 의미하는지 알아보겠다.
첫번째 store는 리덕스 스토어 인스턴스이다. 이 안에 dispatch, getState, subscribe 내장함수들이 들어있다.
두번째 next 는 액션을 다음 미들웨어에게 전달하는 함수 이다. next(action) 이런 형태로 사용한다. 만약 다음 미들웨어가 없다면 리듀서에게 액션을 전달해준다. 만약에 next 를 호출하지 않게 된다면 액션이 무시처리되어 리듀서에게로 전달되지 않는다.
세번째 action 은 현재 처리하고 있는 액션 객체이다.
2. 미들웨어 직접 작성해보기
src 디렉터리에 middlewares 라는 디렉터리를 만들고, myLogger.js 라는 파일을 다음과 같이 작성한다.
middlewares/myLogger.js
const myLogger = store => next => action => { console.log(action); // 먼저 액션을 출력 한다. const result = next(action); // 다음 미들웨어 (또는 리듀서) 에게 액션을 전달 한다. return result; // 여기서 반환하는 값은 dispatch(action)의 결과물이 된다. 기본: undefined }; export default myLogger;
지금은 단순히 전달받은 액션을 출력하고 다음으로 넘기는 작업을 구현했다.
3. 미들웨어 적용하기
이제 미들웨어를 스토어에 적용해본다. 스토어에 미들웨어를 적용 할 때에는 applyMiddleware 라는 함수를 사용 한다.
index.js를 다음과 같이 수정하자.
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; import { createStore, applyMiddleware } from 'redux'; import { Provider } from 'react-redux'; import rootReducer from './modules'; import myLogger from './middlewares/myLogger'; const store = createStore(rootReducer, applyMiddleware(myLogger)); ReactDOM.render( <React.StrictMode> <Provider store={store}> <App /> </Provider> </React.StrictMode>, document.getElementById('root') ); reportWebVitals();
App.js
import React from 'react'; import CounterContainer from './containers/CounterContainer'; function App() { return <CounterContainer />; } export default App;
실행 결과

이렇게 카운터 버튼을 눌렀을 때 콘솔창에 액션이 잘 출력 되면 미들웨어가 잘 적용된 것이다.
4. 미들웨어 수정하기
미들웨어를 조금 더 수정해자. 만약 액션이 리듀서까지 전달되고 난 후의 새로운 상태를 확인하고 싶다면 다음과 같이 수정 할 수 있다.
const myLogger = store => next => action => { console.log(action); // 먼저 액션을 출력한다. const result = next(action); // 다음 미들웨어 (또는 리듀서) 에게 액션을 전달한다. // 업데이트 이후의 상태를 조회합니다. console.log('\t', store.getState()); // '\t' 는 탭 문자 이다. return result; // 여기서 반환하는 값은 dispatch(action)의 결과물이 된다. 기본: undefined }; export default myLogger;
실행 결과

업데이트 후의 상태가 잘 나타나는 것을 볼 수 있다.
'개발 공부한 내용 정리 > React' 카테고리의 다른 글
React- redux-thunk (0) | 2020.11.12 |
---|---|
React- redux-logger 사용 및 미들웨어와 DevTools 함께 사용하기 (0) | 2020.11.07 |
React- 리덕스 미들웨어 실습을 위한 리덕스 프로젝트 준비 하기 (0) | 2020.11.05 |
React- 리덕스 미들웨어 (0) | 2020.11.04 |
React- 할 일 목록 구현하기 (0) | 2020.11.03 |