이러한 불편한 점 해결 위하여 리덕스를 사용할 수 있다. 리덕스를 사용하면State를 공유하고자 할때 부-모 관계가 아니여도 되고, 중간에 .의미없이 컴포넌트를 거치지 않아도 됩니다 그리고 자식 컴포넌트에서 만든 State를 부모 컴포넌트에서도 사용할 수 있게 됩니다.
(2) Global state와 Local state
중앙 State관리소에서 State를 생성하고, 만약 어떤 컴포넌트에서 State가 필요하다면 컴포넌트가 어디에 위치하고 있든 상관없이 State를 불러와서 사용 할 수 있게 된다. 이렇게 특정 컴포넌트에 종속되어 있는 것이 아니라 “중앙 state 관리소”에서 생성된 State를 Global state. 그리고 이러한 값들을 관리하는 것을 전역 상태 관리.
(1) 리덕스 정의
리덕스란,
우리가 위에서 말한 “중앙 state 관리소”를 사용할 수 있게 도와주는 패키지(라이브러리).
프론트엔드 개발자들은 “리덕스”를 전역 상태관리 라이브러리 라고 많이 표현한다. 전역 상태, 즉 Global State를 의미하고 그것을 관리하게 도와주는 라이브러리 (패키지) 이기 때문.
중앙 State 관리소
를 가지고 있으며, 모든 State는 이곳에서 생성된다.(1) 리덕스 설치
리액트에서 리덕스를 사용하기 위해서는 2개의 패키지를 설치.
yarn add redux react-redux
참고로 react-redux
패키지는 리덕스를 리액트에서 사용할 수 있도록 서로 연결시켜주는 패키지.
(2) 폴더 구조 생성하기
위 이미지와 같이 폴더 구조를 생성.
src
폴더 안에 redux
폴더를 생성redux
폴더 안에 config
, modules
폴더를 생성config
폴더 안에 configStore.js
파일을 생성합니다. 각각의 폴더와 파일은 역할이 있다.
redux
: 리덕스와 관련된 코드를 모두 모아 놓을 폴더.config
: 리덕스 설정과 관련된 파일들을 놓을 폴더.configStore
: “중앙 state 관리소" 인 Store를 만드는 설정 코드들이 있는 파일.modules
: 우리가 만들 State들의 그룹이라고 생각하기. 예를 들어 Todo List
를 만든다고 한다면, Todo List에 필요한 state
들이 모두 모여있을 todos.js
를 생성하게 되는데, 이 todos.js
파일이 곧 하나의 모듈.작성하는 설정코드는 완벽히 이해할 필요까지 없다, 코드 분석은 ❌
설정 코드를 작성하는 이유는 리덕스를 만든 리덕스팀에서 이렇게 설정을 하라고 안내하고 있기 때문.
리덕스 사용 “방법”을 중점으로 공부하기.
핸드폰을 샀을 때, 핸드폰을 잘 사용하기위해서 핸드폰을 분해해서 어떤 부품으로 핸드폰을 만들었는지, 그 부품의 목적은 무엇인지 공부하지않지?
지금 공부하는 리덕스도 마찬가지. 리덕스를 어떻게 만들었는지, 왜 이렇게 설정하는지는 중요하지 않다. 해야할 것은 단지 리덕스를 쓰는 방법만 익히면 된다.
src/configStore.js
에 아래 코드를 입력.import { createStore } from "redux";
import { combineReducers } from "redux";
/*
1. createStore()
리덕스의 가장 핵심이 되는 스토어를 만드는 메소드(함수).
리덕스는 단일 스토어로 모든 상태 트리를 관리.
리덕스를 사용할 시 creatorStore를 호출할 일은 한 번밖에 없을 것이다.
*/
/*
2. combineReducers()
리덕스는 action —> dispatch —> reducer 순으로 동작.
이때 애플리케이션이 복잡해지게 되면 reducer 부분을 여러 개로 나눠야 하는 경우가 발생.
combineReducers은 여러 개의 독립적인 reducer의 반환 값을 하나의 상태 객체로 만들어준다.
*/
const rootReducer = combineReducers({});
const store = createStore(rootReducer);
export default store;
index.js
에 아래 내용을 입력.// 원래부터 있던 코드
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
// 추가할 코드
import store from "./redux/config/configStore";
import { Provider } from "react-redux";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
//App을 Provider로 감싸주고, configStore에서 export default 한 store를 넣어준다.
<Provider store={store}>
<App />
</Provider>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
redux
, react-redux
가 필요.