Redux κ°œλ…

DUΒ·2025λ…„ 5μ›” 6일
0

🧠 Redux의 핡심 κ°œλ…

πŸ” 1. Single Source of Truth (단일 μƒνƒœ μ €μž₯μ†Œ)

ReduxλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λͺ¨λ“  μƒνƒœλ₯Ό ν•˜λ‚˜μ˜ 객체 트리둜 λ§Œλ“€κ³ , 이λ₯Ό ν•˜λ‚˜μ˜ store에 μ €μž₯ν•©λ‹ˆλ‹€. 즉, μƒνƒœλŠ” 쀑앙 μ§‘μ€‘μ‹μœΌλ‘œ κ΄€λ¦¬λ©λ‹ˆλ‹€.

const store = createStore(reducer);

πŸ”„ 2. StateλŠ” 읽기 μ „μš© (Read-Only)

Reduxμ—μ„œλŠ” μƒνƒœ(state)λ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 였직 action을 ν†΅ν•΄μ„œλ§Œ μƒνƒœλ₯Ό λ³€κ²½ν•  수 있으며, μ‹€μ œ 변경은 reducerμ—μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.


🧬 3. μƒνƒœλŠ” 순수 ν•¨μˆ˜μΈ reducerλ₯Ό 톡해 λ³€κ²½λœλ‹€

reducerλŠ” 이전 μƒνƒœμ™€ action을 μž…λ ₯λ°›μ•„ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜μž…λ‹ˆλ‹€.

function reducer(state, action) {
  switch(action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    default:
      return state;
  }
}

🧩 Redux μš©μ–΄ 정리


1. πŸ“¦ Store

  • Redux의 쀑앙 μƒνƒœ μ €μž₯μ†Œμž…λ‹ˆλ‹€.
  • createStore()둜 μƒμ„±ν•˜λ©°, ν˜„μž¬ μƒνƒœ(state), reducer, dispatch κΈ°λŠ₯을 ν¬ν•¨ν•©λ‹ˆλ‹€.

2. ⚑ Action

  • μƒνƒœ 변경을 μš”μ²­ν•˜λŠ” 일반 μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄μž…λ‹ˆλ‹€.
  • ν•„μˆ˜ 속성: type (λ³€κ²½μ˜ μ’…λ₯˜λ₯Ό λ‚˜νƒ€λƒ„)
  • 선택 속성: payload (데이터 μ „λ‹¬μš©)
const incrementAction = {
  type: 'INCREMENT',
  payload: 1 // 선택적
};

3. πŸ–±οΈ Event

  • 일반적으둜 μ‚¬μš©μžμ˜ μž…λ ₯(클릭, ν‚€λ³΄λ“œ μž…λ ₯ λ“±) λ˜λŠ” λ„€νŠΈμ›Œν¬ 응닡 등을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • Redux 자체 μš©μ–΄λŠ” μ•„λ‹ˆλ©°, 보톡 μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ 그에 따라 action을 μƒμ„±ν•©λ‹ˆλ‹€.
// λ²„νŠΌ 클릭 이벀트 β†’ μ•‘μ…˜ 생성 β†’ λ””μŠ€νŒ¨μΉ˜
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>

4. πŸ“€ Dispatch

  • store.dispatch(action) ν˜•νƒœλ‘œ μ‚¬μš©.
  • νŠΉμ • μ•‘μ…˜μ„ μŠ€ν† μ–΄μ— μ „λ‹¬ν•΄μ„œ μƒνƒœ μ—…λ°μ΄νŠΈλ₯Ό νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.
dispatch({ type: 'INCREMENT' });
  • λ””μŠ€νŒ¨μΉ˜λœ μ•‘μ…˜μ€ reducer둜 μ „λ‹¬λ˜μ–΄ μƒνƒœλ₯Ό λ³€κ²½ν•˜κ²Œ λ©λ‹ˆλ‹€.

5. πŸ”„ Reducer

  • μ•‘μ…˜μ„ λ°›μ•„μ„œ, 이전 μƒνƒœλ₯Ό 기반으둜 μƒˆλ‘œμš΄ μƒνƒœ 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜.
const initialState = { count: 0 };

function counterReducer(state = initialState, action) {
  switch(action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
}

6. πŸ› οΈ Middleware (선택 사항)

  • μ•‘μ…˜μ΄ λ¦¬λ“€μ„œμ— λ„λ‹¬ν•˜κΈ° 전에 κ°€λ‘œμ±„μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” 쀑간 λ‹¨κ³„μž…λ‹ˆλ‹€.
  • 예: redux-thunk, redux-saga (비동기 μ²˜λ¦¬μ— 자주 μ‚¬μš©)

πŸ” Redux 데이터 흐름 정리 (One-way data flow)

  1. Event λ°œμƒ (예: λ²„νŠΌ 클릭)
  2. β†’ Action 생성
  3. β†’ Dispatch둜 μ•‘μ…˜ 전달
  4. β†’ Reducerκ°€ μƒνƒœλ₯Ό λ³€κ²½
  5. β†’ Store의 μƒˆλ‘œμš΄ μƒνƒœκ°€ μ»΄ν¬λ„ŒνŠΈμ— 반영됨

πŸ” 예제 (μΉ΄μš΄ν„°)

// 1. μ•‘μ…˜ μƒμ„±μž
const increment = () => ({ type: 'INCREMENT' });

// 2. λ¦¬λ“€μ„œ
function counter(state = { count: 0 }, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    default:
      return state;
  }
}

// 3. μŠ€ν† μ–΄ 생성
const store = createStore(counter);

// 4. λ””μŠ€νŒ¨μΉ˜ (예: λ²„νŠΌ 클릭 μ‹œ)
store.dispatch(increment());

πŸ“ 정리

μš©μ–΄μ„€λͺ…
Storeμ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 전체 μƒνƒœλ₯Ό λ³΄κ΄€ν•˜λŠ” μ €μž₯μ†Œ
Actionμƒνƒœ λ³€κ²½ μš”μ²­μ„ λ‚˜νƒ€λ‚΄λŠ” 객체
Eventμ‚¬μš©μžμ˜ μž…λ ₯μ΄λ‚˜ μ™ΈλΆ€ 자극, μ•‘μ…˜μ„ λ°œμƒμ‹œν‚€λŠ” 트리거
Dispatchμ•‘μ…˜μ„ μŠ€ν† μ–΄μ— λ³΄λ‚΄λŠ” ν•¨μˆ˜
Reducerμ•‘μ…˜μ„ μ²˜λ¦¬ν•΄ μƒˆ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜

0개의 λŒ“κΈ€