개발/React

🌐Redux 3 - Action Creators, Payload, Ducks 패턴

글쓰는쿼카 joymet33 2024. 6. 4. 18:05

#스파르타코딩클럽 #내일배움캠프(프론트엔드_React)

학습주제 : Redux

학습내용 : 리덕스 action creators, action values, payload, Ducks 패턴

학습일 : 2024. 6. 5.(수)


배운 내용 요약

1. Action Creators, Action Values

- 참고: https://joymet33.tistory.com/65

 

2. Payload 

1) Payload 란?

  • 액션객체에 같이 담아 보내는 것
    (예: "N을 더해" 라고 할 때 N(=payload)을 액션객체에 담아 리듀서에게 전달)
  • 반드시 payload 란 이름을 쓸 필요는 없음
{type: "ADD_NUMBER", num: 10} // ??
{type: "ADD_NUMBER", number: 10} // ??
{type: "ADD_NUMBER", data: 10} // ??
{type: "ADD_NUMBER", myNumber: 10} // ??
{type: "ADD_NUMBER", myNum: 10} // ??


{type: "ADD_NUMBER", payload: 10}

 

2) payload를 이용하여 기능 구현하기

(1) 사용자가 입력한 값을 받을 input 구현하기

// src/App.js
// 중략...
 return (
    <div>
      {number} <br />
      <input
        type="number"
        value={count}
        onChange={(e) => setCount(+e.target.value)}
        // '+'역할: State count의 형 변환(string>>number)을 강제로 시킴 ('+'없으면 count가 string으로 인식)
      />
      <button onClick={() => dispatch(addNumber(count))}>더하기</button>{" "}
      <button onClick={() => dispatch(removeNumber(count))}>빼기</button>{" "}
    </div>
  );

 

(2) counter.js 모듈 작성: Initial State, Action Creator , Reducer, 내보내기(export default)

const initialState = {
  number: 0,
};

// action values
const ADD_NUMBER = "ADD_NUMBER";
const REMOVE_NUMBER = "REMOVE_NUMBER";

// action creators
export const addNumber = (payload) => {
  return {
    type: ADD_NUMBER,
    payload: payload, // 인자로 들어오는 payload를 객체로 받는다
  };
};

export const removeNumber = (payload) => {
  return {
    type: REMOVE_NUMBER,
    payload: payload, // (addNumber와 동일) 인자로 들어오는 payload를 객체로 받는다
  };
};

//리듀서 counter
const counter = (state = initialState, action) => {
  console.log("state >> ", state);
  console.log("action >> ", action);
  switch (action.type) {
    // 액션타입이 "ADD_NUMBER" 일 때 state 변화
    case ADD_NUMBER:
      return {
        //기존 state에 있던 number에 +1을 더한다.
        number: state.number + action.payload,
      };
    case REMOVE_NUMBER:
      return {
        //기존 state에 있던 number에 -1을 뺀다.
        number: state.number - action.payload,
      };
    default:
      return state;
  }
};

export default counter;

 

 

 

3. Ducks 패턴

1) Ducks 패턴이란?

  • Redux 앱을 구성할 때 사용하는 방법론 중 하나
  • 일반적으로 분산되어 있던 액션 타입, 액션 생성자, 리듀서를 "하나의 파일로 구성하는 방식"
  • (가벼운 내용) Ducks 라는 이름은 리덕스의 '덕스' 이고 심볼은 '오리' 🦆
  • (가벼운 내용) Erik Rasmussn의 Ducks 제안 : https://github.com/erikras/ducks-modular-redux

2) Ducks 패턴 살펴보기

  • Reducer 함수를 export default 한다.
  • Action creator 함수들을 export 한다.
  • Action type은 app/reducer/ACTION_TYPE 형태로 작성한다.
    (외부 라이브러리로서 사용될 경우 또는 외부 라이브러리가 필요로 할 경우에는 UPPER_SNAKE_CASE 로만 작성해도 괜찮다.)