๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โœ๏ธ/React

React ๊ณต๋ถ€ํ•˜๊ธฐ(7) - ๋ฆฌ๋•์Šค ๋ฏธ๋“ค์›จ์–ด

๋ณดํ†ต ๋ฆฌ๋•์Šค์—์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์‚ฌ์šฉ ์šฉ๋„๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ์ด๋‹ค. (redux-thunk, redux-sage ๋“ฑ)

 

$ yarn add redux react-redux

 

 

2. ๋ฏธ๋“ค์›จ์–ด ๋งŒ๋“ค์–ด๋ณด๊ณ  ์ดํ•ดํ•˜๊ธฐ

 

๋ฆฌ๋•์Šค ๋ฏธ๋“ค์›จ์–ด์˜ ํ…œํ”Œ๋ฆฟ

const middleware = store => next => action => {
  // ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…...
}
function middleware(store) {
  return function (next) {
    return function (action) {
      // ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…...
    };
  };
};

store: ๋ฆฌ๋•์Šค ์Šคํ† ์–ด

next: ์•ก์…˜์„ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜ next(action)

action: ํ˜„์žฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ์•ก์…˜ ๊ฐ์ฒด

 

๋ฏธ๋“ค์›จ์–ด ์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด๊ธฐ

<middlewares/myLogger.js>

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;

 

๋ฏธ๋“ค์›จ์–ด ์ ์šฉํ•˜๊ธฐ

import { applyMiddleware } from 'redux';

<index.js>

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
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(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

serviceWorker.unregister();

 

 

3. redux-logger ์‚ฌ์šฉ

 

$ yarn add redux-logger

<index.js>

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import rootReducer from './modules';
import logger from 'redux-logger';

const store = createStore(rootReducer, applyMiddleware(logger)); // ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

serviceWorker.unregister();

 

Redux DevTools ์‚ฌ์šฉํ•˜๊ธฐ

$ yarn add redux-devtools-extension
import { composeWithDevTools } from 'redux-devtools-extension';

<index.js>

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import rootReducer from './modules';
import logger from 'redux-logger';
import { composeWithDevTools } from 'redux-devtools-extension';

const store = createStore(
  rootReducer,
  composeWithDevTools(applyMiddleware(logger))
); // ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);


serviceWorker.unregister();

 

 

8. json-server => ๊ฐ€์งœ ์—ฐ์Šต์šฉ ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ!

 

https://react.vlpt.us/redux-middleware/08-json-server.html

 

8. json-server · GitBook

8. json-server ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์—ฐ์Šต์„ ํ•˜๊ฒŒ ๋  ๋•Œ๋งˆ๋‹ค ์—ฐ์Šต์„ ํ•˜๋Š” ๊ฒƒ ๋ถ„์ธ๋ฐ ์ง์ ‘ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋Š”๊ฒƒ์€ ์กฐ๊ธˆ ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ๋‚˜ ์•„์ง ๋ฐฑ์—”๋“œ์ชฝ ์ง€์‹์ด ์—†๋‹ค๋ฉด ๋”์šฑ ํž˜๋“ค์ฃ . ์šฐ๋ฆฌ๋Š” ์—ฐ์Šต์„ ์œ„

react.vlpt.us

 

 

9. CORS์™€ WebpackDevServer Proxy

=> ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜„์žฌ ์ฃผ์†Œ์™€ API ์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๋•Œ CORS ์„ค์ •ํ•  ํ•„์š”์—†์Œ

 

 ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์ง์ ‘์ ์œผ๋กœ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ , ํ˜„์žฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋กœ ์š”์ฒญํ•œ๋‹ค.

 

https://react.vlpt.us/redux-middleware/09-cors-and-proxy.html

 

9. CORS ์™€ Webpack DevServer Proxy · GitBook

9. CORS ์™€ Webpack DevServer Proxy ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ API๋ฅผ ์š”์ฒญ ํ•  ๋•Œ์—๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜„์žฌ ์ฃผ์†Œ์™€ API ์˜ ์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•ด์•ผ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ๋„๋ฉ”

react.vlpt.us