출처는 공식 문서입니다.
https://ko.redux.js.org/
공식 문서의 설명에 따르면...
Redux의 아키텍쳐는 엄격한 일방향 데이터 흐름을 따라 전개된다.
이는 어플리케이션 내의 모든 데이터가 같은 생명주기 패턴을 따르며, 앱의 로직을 좀 더 에측가능하게 하고 이해하기 쉽게 만든다는 뜻이다. 이는 또한 데이터 정규화를 도와서 같은 데이터의 복제본들이 서로를 모르고 여럿으로 나눠지지 않도록 해준다.
Redux의 기초 개념들이 어떻게 상호작용하는지 정리하였다.
Action Creator > Action > dispatch > Reducer > State
Redux를 사용한 React의 렌더링 과정
- component 내에 이벤트 호출(클릭, 입력 등)
- 이벤트와 연결된 action creator 호출
- action creator가 생성한 action 호출
- action이 reducer로 전달(dispatch)
- dispatch된 action의 영향으로 reducer의 state값이 변화
- 렌더링
1 import React from "react"; import ReactDOM from "react-dom";
2 // react-redux에서 Provider를 가져온다. import { Provider } from "react-redux"; // redux에서 createStore를 가져온다. import { createStore } from "redux";
3 import App from "./components/App"; // combineReducer를 가져온다. import reducers from "./reducers";
4 ReactDOM.render( <Provider store={createStore(reducers)}> <App /> </Provider>, document.querySelector("#root") );
1 //redux에서 combineReducers를 가져온다. import { combineReducers } from 'redux'
2 //reducer 선언1(만들기) const numbersReducer = () => { return [ {number: 0}, {number: 1}, {number: 2}, {number: 3}, ] }
3 //reducer 선언2(액션에 영향을 받는 리듀서) //reducer(previousState, action)의 형태 //최초의 state 값은 없고 action을 받는다. const selectNumberReducer = (selectNumber = null, action) => { if(action.type === 'SELECTED_NUMBER){ return action.payload } return selectNumber }
4 //combineReducers로 reducer들 합치기 export default combineReducers({ numbers: numbersReducer, //numbers라는 키의 값으로 numbersReducer 할당 selectedNumber: selectNumberReducer, //selectNumber라는 키의 값으로 selectNumberReducer 할당 })
//action creator 선언 export const selectNumber = () => { return { //action 선언 type: "SELECTED_NUMBER", //액션은 대문자와 스네이크 표기법을 사용. payload: 1, //액션이 전달하는 내용 } }
1 import React from 'react' // react-redux 라이브러리에서 connect를 가져옴 import { connect } from 'react-redux; // action 폴더에서 selectNumber 가져오기 import { selectNumber } from '../actions'
2 class 예시컴포넌트 extends Component { render(){ return( <div> <div> {this.props.numbers[0].number} <div>
3 <button onClick={()=>this.props.selectNumber()}> 클릭하세요 </button>
4 <div>{this.props.selectedNumber}</div> </div> ) } //컴포넌트 생성 코드 종료.
5 // 컴포넌트 생성 코드의 외부에서 mapStateToProps 사용(store 에서 데이터 받아오기) const mapStateToProps = (state) => { return { //받아올때 쓸 state의 이름' : state.'reducer에서 정한 데이터 이름' numbers : state.numbers, selectedNumber: state.selectedNumber } }
6 // connect()로 컴포넌트와 redux store 연결하기 // connect()의 첫번째 인자, mapStateToProps는 store에서 state를 받아온다. export default connect(mapStateToProps, {selectNumber})(예시컴포넌트)
1번 > 5번 > 6번 > 2번 > 3번 > 4번 순서이다.
Redux의 흐름을 이해하기 위해 작성한 코드이며 완벽한 코드는 아니다.
아마 최초의 selectNumber의 값이 null이기에 에러가 발생할 수 있다.
2-2-2에서 작성한 리듀서를 활용한 map과 함께 사용하는 액션이나 액션의 인자를 넣어 사용하는 등의 코드는 아니다.
배열, 객체의 형태를 띈 리듀서가 액션을 통해 바뀌는 코드는 아니다.
api, axios, routing 등의 개념과 함께 쓰는 코드는 아니다.
이후 추가 예정이다.