λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ‘©‍πŸ’» 개발 곡뢀

[React] Redux κ°œλ… 및 μ—­ν• , 파일 ꡬ쑰 디렉토링

728x90
λ°˜μ‘ν˜•

κ°œλ°œμ„ 처음 진행할 λ•ŒλŠ” λ¦¬λ•μŠ€ λ‚΄μš©μ„ ν•œ νŒŒμΌμ—λ‹€κ°€ λͺ¨μ•„두닀가,

인턴 ν•˜λ©΄μ„œ 디렉토링 ν•˜λŠ” 방법을 λ°°μ› μ—ˆλŠ”λ° 또 써먹을 일이 생겨 기둝해둔닀.


 

ReduxλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό ν•œκ³³μ—μ„œ κ΄€λ¦¬ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€.

μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 같은 데이터λ₯Ό κ³΅μœ ν•  λ•Œ μœ μš©ν•˜λ‹€.

 

1️⃣  Redux 파일 ꡬ쑰 (in React typescript)

 

/redux
  /actions         # μ•‘μ…˜ μ •μ˜ (이벀트 λ°œμƒ μ‹œ ν•„μš”ν•œ 데이터 μ •μ˜)
    categoryActions.ts
  /reducers        # λ¦¬λ“€μ„œ μ •μ˜ (μƒνƒœκ°€ μ–΄λ–»κ²Œ 변경될지 κ²°μ •)
    categoryReducer.ts
  store.ts           # μŠ€ν† μ–΄ μ„€μ • (전체 μƒνƒœ 관리)

 

각 νŒŒμΌμ€ Redux의 핡심 μš”μ†ŒμΈ μ•‘μ…˜(Actions), λ¦¬λ“€μ„œ(Reducers), μŠ€ν† μ–΄(Store)λ₯Ό λ‹΄λ‹Ήν•œλ‹€.

 


2️⃣  νŒŒμΌλ³„ μ—­ν• 

πŸ“Œ  redux/actions/categoryActions.ts

 

Reduxμ—μ„œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λ €λ©΄ "μ•‘μ…˜(Action)"이 ν•„μš”ν•˜λ‹€.

μ•‘μ…˜μ€ μ–΄λ–€ μƒνƒœλ₯Ό λ³€κ²½ν•  것인지 μ•Œλ €μ£ΌλŠ” "λ©”μ‹œμ§€" 역할을 ν•œλ‹€.

 

import { createAction } from "@reduxjs/toolkit";

export const setCategories = createAction<string[]>("SET_CATEGORIES");

 

βœ… setCategoriesλŠ” μΉ΄ν…Œκ³ λ¦¬ 리슀트λ₯Ό λ³€κ²½ν•˜λŠ” μ•‘μ…˜μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.
βœ… "SET_CATEGORIES"λΌλŠ” νƒ€μž…μ„ 가진 μ•‘μ…˜μ„ λ§Œλ“€κ³ , string[] λ°μ΄ν„°λ₯Ό 전달할 수 μžˆλ‹€.

 


πŸ“Œ  redux/reducers/categoryReducer.ts

 

ReducerλŠ” μ•‘μ…˜μ„ λ°›μ•„μ„œ μƒνƒœλ₯Ό μ‹€μ œλ‘œ λ³€κ²½ν•˜λŠ” 역할을 ν•œλ‹€.

 

import { createReducer } from "@reduxjs/toolkit";
import { setCategories } from "../actions/categoryActions";

interface CategoryState {
  categoryList: string[];
}

const initialState: CategoryState = {
  categoryList: [],
};

const categoryReducer = createReducer(initialState, (builder) => {
  builder.addCase(setCategories, (state, action) => {
    state.categoryList = action.payload;
  });
});

export default categoryReducer;

 

βœ… initialState: 초기 μƒνƒœ κ°’ (categoryList λ°°μ—΄)
βœ… createReducer: setCategories μ•‘μ…˜μ΄ 호좜되면 categoryListλ₯Ό λ³€κ²½
βœ… action.payload: μ•‘μ…˜μ΄ μ „λ‹¬ν•œ 데이터 (string[])

 


πŸ“Œ  store.ts

 

μŠ€ν† μ–΄(Store)λŠ” Redux의 쀑앙 μ €μž₯μ†Œμ΄λ‹€. λͺ¨λ“  μƒνƒœμ™€ λ¦¬λ“€μ„œλ₯Ό λͺ¨μ•„μ„œ κ΄€λ¦¬ν•œλ‹€.

 

import { configureStore } from "@reduxjs/toolkit";
import categoryReducer from "./reducers/categoryReducer";

const store = configureStore({
  reducer: {
    category: categoryReducer, // μƒνƒœ 이름을 category둜 μ„€μ •
  },
});

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

export default store;

 

βœ… configureStore: μ—¬λŸ¬ λ¦¬λ“€μ„œλ₯Ό ν•©μ³μ„œ Redux μŠ€ν† μ–΄λ₯Ό 생성
βœ… RootState: Redux μƒνƒœμ˜ νƒ€μž… μ •μ˜
βœ… store.dispatch: μ•‘μ…˜μ„ Redux에 μ „λ‹¬ν•˜λŠ” ν•¨μˆ˜

 


3️⃣ Redux λ³€μˆ˜ μž‘λ™ 방식

  1. μ»΄ν¬λ„ŒνŠΈμ—μ„œ dispatch(setCategories([...]) μ‹€ν–‰
    • μƒˆλ‘œμš΄ μΉ΄ν…Œκ³ λ¦¬ 리슀트λ₯Ό Redux에 전달
  2. Reducerκ°€ setCategories μ•‘μ…˜μ„ κ°μ§€ν•˜κ³  state.categoryList λ³€κ²½
    • categoryListκ°€ μƒˆλ‘œμš΄ λ°μ΄ν„°λ‘œ μ—…λ°μ΄νŠΈλ¨
  3. μ»΄ν¬λ„ŒνŠΈμ—μ„œ useSelector(state => state.category.categoryList)둜 μƒνƒœ κ°€μ Έμ˜€κΈ°
    • λ³€κ²½λœ μƒνƒœλ₯Ό μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš© κ°€λŠ₯

 


4️⃣  Redux λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법

 

Redux의 μƒνƒœλ₯Ό React μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ useSelector와useDispatchλ₯Ό ν™œμš©ν•΄μ•Ό ν•œλ‹€.

 

import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { setCategories } from "../redux/actions/categoryActions";
import { RootState } from "./redux/store";

const CategoryComponent: React.FC = () => {
  const dispatch = useDispatch();
  const categoryList = useSelector((state: RootState) => state.category.categoryList);

  const updateCategories = () => {
    dispatch(setCategories(["Food", "Electronics", "Clothing"]));
  };

  return (
    <div>
      <h1>Categories</h1>
      <ul>
        {categoryList.map((category, index) => (
          <li key={index}>{category}</li>
        ))}
      </ul>
      <button onClick={updateCategories}>Update Categories</button>
    </div>
  );
};

export default CategoryComponent;

 

βœ… useSelectorλ₯Ό μ‚¬μš©ν•΄ Redux μƒνƒœ(categoryList)λ₯Ό κ°€μ Έμ˜¨λ‹€.
βœ… useDispatchλ₯Ό μ‚¬μš©ν•΄ setCategories μ•‘μ…˜μ„ ν˜ΈμΆœν•˜κ³  μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•œλ‹€.
βœ… λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ μΉ΄ν…Œκ³ λ¦¬ λ¦¬μŠ€νŠΈκ°€ λ³€κ²½λœλ‹€.

 

 

728x90
λ°˜μ‘ν˜•