Redux 정리 - redux 및 reducer 만들기

하영·2024년 8월 27일
1

React

목록 보기
13/17

갑자기 불어난 폴더와… 이리갔다가 저리갔다가 하는게 도무지 정리가 안 되어서 강의 중지하고 정리해야겠다 싶었다… 내 방식대로 정리해보자 싶어서 편하게(?) 쓴거라 말투도 기존 글과 다를지도…ㅎ

아무튼 이 글은 << 내 입맛대로 정리해보는 Redux 👊🏻👊🏻👊🏻👊🏻 >> 이고.. 틀린거 있으면 (누군가 본다면) 댓글로 알려주쉐이~

Redux 정리 (redux 및 reducer 만들기)

01. redux 폴더 구조 세팅하기

redux 폴더 생성

  1. config > configStore.js
  2. modules > 내가 만들 State (todos.js)
  • config: 이름에서 알 수 있듯이 ‘설정’ 과 관련된 모든 것이 들어있는 폴더

  • configStore: 리덕스는 중앙 관리소가 있다 = store!
    Store를 만드는 파일인데 설정담당 config파일 안에 있으니까 Store 만드는 ‘설정’이 담긴 파일이다.

  • modules : 우리가 만드는 State가 있는 공간


02. config한 거 어디에 쓸까요?

configStore에서 할 일

✋ configStore는 뭐다? Store를 만드는 '설정'을 모아두는 곳! 따라서 Store 설정을 해주고 export해주는 곳!

  1. rootReducer 는 조각난 리듀서들을 모아줄 combineReducer
  2. Store를 만들 때는 createStore()

createStore 안에 리듀서가 담긴 rootReducer를 담아주고 최종적으로 이 store를 export한다.

import { createStore } from "redux";
import { combineReducers } from "redux";

/*
combineReducers()
애플리케이션이 복잡해지게 되면 reducer 부분을 여러 개로 나눠야 하는 경우가 발생합니다. 
combineReducers은 여러 개의 독립적인 reducer의 반환 값을 하나의 상태 객체로 만들어줍니다.
*/

const rootReducer = combineReducers({}); 
const store = createStore(rootReducer); 

export default store; 

열심히 만든 store 넌 최상위 컴포넌트(ex.Main.jsx / App.jsx)에서 일해라

// 원래있던 코드
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";

// 우리가 추가할 코드
import store from "./redux/config/configStore";
import { Provider } from "react-redux";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(

  <Provider store={store}> 
    <App />
  </Provider>
);

만드는 놈 따로 쓰는 놈 따로임…ㅎ

config 폴더에서 열심히 만든 Store를 사용하기 위해 제일 최상단 컴포넌트로 import 해오자

import store from "./redux/config/configStore";

불러온 Store는 또 곱게 오지 않아서 Provider라는 놈이 안내를 해줘야 따라온다.

우리는 App컴포넌트 안에 있는 모-든 애들이 store에 접근해서 뽑아먹을 수 있게 하기 위해 Provider를 아래 코드처럼 감싸준다.

⭐️ 주의할 것: Provider는 무조건 store를 써줘야한다! (안 쓰면 에러나용~)

<Provider store={store}> 
  <App />
</Provider>

03. 낰낰.. modules 나도 있어요…

zㅏ! config에서 할 일은 끝났고 이제 내 기준 깐깐징어였던 모듈을 정리해보자

모듈은 State 그룹!, State는? 변경되는 값들이다 > 리덕스에서 변경하는거 뉘기야?! = reducer

모듈에서 reducer 맨드는구나~~ 하기

1) 초기값을 설정해보자

react state 만들때 우리 초기값 줬던거 기억 나는 살암? 모듈은 state 그룹이니까 똑같이 초기값이 필요하다.

초기값에는 원시데이터, 객체, 배열 모두 다 됨다.

// 초기값이 0
const initialState = 0;

// 초기값이 0이 있는 배열 
const initialState = [0];

// 초기값이 number = 0, name = '리덕스놈'인 객체
const initialState = {
	number: 0,
	name: '리덕스놈'
};

2) Reducer를 만들어보자

앙딱정 reducer는 함수다!
reducer2개의 인자가 필요한데 1) state 2) action 이다.
보통 state에는 우리가 맨 처음 만들었던 초기값을 할당해주고 action 객체에서 필요한 걸 꺼내서 사용하는 방식이다.

// src/redux/modules/counter.js

// counter 리듀서
const counter = (state = initialState, action) => {
  switch (action.type) {
    default:
      return state;
  }
};

export default counter; 

잘 만든 이 counter라는 함수 잘 내보내주자!
(예시 코드가 counter라서 counter를 내보낸것, todo를 만들었다면 todo 내보내기!)

🤯 중!간!정!리

지금까지 한 일이 뭔디여

config 폴더에서 Store 만들기 / modules 폴더에서 reducer만들기

아까 조각난 reducercombineReducer 해줬던거 기억나는 살암?
좀 전에 reducer 조각 하나를 만들었으니까 이걸 합쳐주는 combineReducer 한테 연결해서 이거 모아달라고 말해야한다.

그럼 이제 우리가 만든 reducer를 쓸 수 있도록 combineReducer 찾아서 연결해주자!

// src/redux/config/configStore.js

// 원래 있던 코드
import { createStore } from "redux";
import { combineReducers } from "redux";

// 모듈에서 만든 reducer 함수를 불러오고
import counter from "../modules/counter";

const rootReducer = combineReducers({
  counter: counter, // reducer 조각 모아달라고 낑겨넣기
});
const store = createStore(rootReducer); // 그럼 store에 reducer가 들어있겟쥬?

export default store;

04. 연결 다 했니? 이제 확인을 하자

끝났다고 생각하지마!!! 이제부터 시작이니ㄲㅏ
또 이런거 잘 연결됐는지 확인하고 싶어하는 그런 맘… 그래서 무좍건 콘솔찍어보고 그러자네?
그래서 이제 뭘 할거냐면 우리가 만든 모듈이 스토어에 잘 연결됐는지 확인할거예여
자 이제 useSelector 를 써봅시다.

useSelectorStore가 잘 연결되어있는지 “컴포넌트에서 스토어를 직접 조회”할 때 쓰는 훅이다.

⭐️ 훅!을 사용하는거니까 import {useSelector} 하는거 잊지 말기!!

// 1. store에서 꺼낸 값을 할당 할 변수 선언
const number = 

// 2. useSelector()를 변수에 할당해줍니다.
const number = useSelector() 

// 3. useSelector의 인자에 화살표 함수를 넣어줍니다.
const number = useSelector( ()=>{} )

// 4. 화살표 함수의 인자에서 값을 꺼내 return 합니다. 
const number = useSelector((state) => {
	console.log(state)
	return state
});

내 입맛대로 정리해보면

  1. 집에서 장바구니 챙겨감 (변수 선언)
  2. 마트 입장 (useSelector 변수에 할당)
  3. 마트 장바구니에 물건 담기 (useSelector의 인자에 화살표 함수 넣기)
  4. 맘에 든 상품 담고 계산 (인자에서 값 꺼내서 return)

App 컴포넌트에 위 코드 적용해보기

// src/App.js

import React from "react";
import { useSelector } from "react-redux"; // useSelector 훅 import

const App = () => {
  const counterReducer = useSelector((state) => state); // 추가해주세요.
  console.log("🚀 counterReducer:", counterReducer); // 콘솔로 확인

  return <div></div>;
}

export default App;
  1. counterStore 변수 선언
  2. counterStore에 useSelector 할당
  3. 콜백 화살표 함수로 state 추가

콘솔을 확인해보면 객체 안에 우리가 만든 counter 모듈이 들어있다.

✅ state 확인하면 이 안에 있는 모든 값이 나온다.


05. 축하합니다! 스세권이세요🎊

이제 우리는 어!떤! 컴포넌트에서도 접근할 수 있는 Store를 가지게 되었다.

아까 counter 모듈을 만들 때 넣었던 counter를 쓰고 싶다면 아래 코드처럼 쓰면 된다.

const counterReducer = useSelector((state) => {
    return state.counter;
  });

콘솔창 확인

더 디테일하게 뽑아서 사용하기

const number = useSelector(state => state.counter.number); // 0

나름 간단하게 정리한다고 해봤는데 또 길어진 느낌이다.

  1. redux 폴더에는 '설정'담당 : config 폴더 / state 그룹 담당 : modules 폴더가 있다.

  2. createStore()store를 만들고, combineReducers({})에 의해 reducer 조각이 합쳐진 rootReducer 변수를 넣어준다. (!! store 설정 완 )

  3. 최상단 컴포넌트 (ex. App 컴포넌트) 에 Provider로 감싸준다. store 넣어주기!

  4. 초기값, reducer 함수 그리고 이 함수를 export 한 모듈을 만들어준다.

  5. 리듀서 함수가 받는 인자 state에는 초기값 할당, action 객체를 만든다.

  6. 만든 리듀서를 combineReducer에 넣어주고 useSelector 훅으로 연결하여 사용한다.

profile
왕쪼랩 탈출 목표자의 코딩 공부기록

0개의 댓글