2. 리덕스 설정하기

리덕스 관련 로직들을 작성하기 전에, 필요한 기본적인 파일들을 만들고 프로젝트에 리덕스를 적용해보겠습니다.

apod 모듈 틀 만들기

리덕스 액션, 액션생성함수, 리듀서가 담겨있는 모듈을 만들어보겠습니다. 비록 이 프로젝트에서 만들 모듈은 하나밖에 존재하지 않지만, 앞으로 여러분들이 만들 프로젝트들에서는 여러개의 모듈들이 존재하게 될 것이므로, combineReducers 를 하는 방향으로 작업을 진행하겠습니다.

앞으로 우리가 만들 액션들은 꽤 많지만, 하나만 미리 만들어두겠습니다.

src/modules/apod.js

import { createAction, handleActions } from 'redux-actions';
import { Map } from 'immutable';

// 액션 타입
const PREVIOUS = 'apod/PREVIOUS';

// 액션 생성 함수
export const previous = createAction(PREVIOUS);

// 리듀서의 초깃값
const initialState = Map({});

// 리듀서
export default handleActions({
  [PREVIOUS]: (state, action) => state // 나중에 구현
}, initialState);

모듈을 만들었으니까, (나중에 모듈의 종류가 많아질때를 대비하기 위해서) combineReducers 를 통하여 루트 리듀서를 만들겠습니다.

src/store/modules/index.js

import { combineReducers } from 'redux';
import apod from './apod';

export default combineReducers({
  apod
});

스토어 만들기

스토어를 만들어주는 configure 함수를 작성하고 내보내주세요. 우리는 리덕스 개발자도구와 미들웨어를 사용하기 위해서 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ 를 사용합니다. (크롬 확장 프로그램에 작성되어있는 자바스크립트 함수입니다.) 만약에 리덕스 개발자도구가 설치되어있지 않다면 일반 compose 를 사용합니다.

import { createStore, applyMiddleware, compose } from 'redux';
import modules from './modules';

const configure = () => {
  const devTools = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;
  const composeEnhancers = devTools || compose;

  const middlewares = []; // 나중에 이 자리에 미들웨어 추가

  const store = createStore(modules, composeEnhancers(
    applyMiddleware(...middlewares)
  ));

  return store;
}

export default configure;

그럼 이제 이 함수를 사용하여 스토어를 만들고 내보내줍시다.

src/store/index.js

import configure from './configure';
export default configure();

프로젝트에 리덕스 적용하기

프로젝트에 리덕스를 적용하기 위해서, App 보다도 더 위에 있는 컴포넌트인 Root 컴포넌트를 만들어주겠습니다.

src/Root.js

import React from 'react';
import { Provider } from 'react-redux';
import App from './components/App';
import store from './store';

const Root = () => {
  return (
    <Provider store={store}>
      <App />
    </Provider>
  );
};

export default Root;

그리고, 이제 App 컴포넌트는 components 로 이동시켜준 뒤, 기존의 로직들을 다 지우세요.

src/components/App.js

import React, { Component } from 'react';
import ViewerTemplate from './ViewerTemplate';
import SpaceNavigator from 'components/SpaceNavigator';
import Viewer from 'components/Viewer';

class App extends Component {
  render() {
    return (
      <ViewerTemplate
        spaceNavigator={<SpaceNavigator/>}
        viewer={(
          <Viewer/>
        )}
      />
    );
  }
}

export default App;

그 다음엔, index.js 엔트리 파일에서 App 대신 Root 컴포넌트를 렌더링하세요.

src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import './styles/base.scss';

ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();

results matching ""

    No results matching ""