Skip to content
Yancy edited this page Nov 25, 2020 · 9 revisions

λ¦¬λ•μŠ€

μž₯점

  • μ»΄ν¬λ„ŒνŠΈ μ½”λ“œλ‘œ λΆ€ν„° μƒνƒœ 관리 μ½”λ“œλ₯Ό 뢄리할 수 μžˆλ‹€.
  • μ„œλ²„ λ Œλ”λ§ μ‹œ 데이터 전달이 κ°„νŽΈν•˜λ‹€.
  • 둜컬 μŠ€ν† λ¦¬μ§€μ— 데이터λ₯Ό μ €μž₯ν•˜κ³  λΆˆλŸ¬μ˜€λŠ” μ½”λ“œλ₯Ό μ‰½κ²Œ μž‘μ„±ν•  수 μžˆλ‹€.
  • 같은 상탯값을 λ‹€μˆ˜μ˜ μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μš”λ‘œ ν•  λ•Œ μ’‹λ‹€.
  • λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ κΉŠμ€ κ³³μ—μ„œ μžˆλŠ” μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— 상탯값을 전달 ν•  λ•Œ μ’‹λ‹€
  • μ•Œλ¦Όμ°½κ³Ό 같은 μ „μ—­ μ»΄ν¬λ„ŒνŠΈμ˜ 상탯값을 관리할 λ•Œ μ’‹λ‹€.
  • νŽ˜μ΄μ§€κ°€ μ „ν™˜λ˜μ–΄λ„ λ°μ΄ν„°λŠ” μ‚΄μ•„ μžˆμ–΄μ•Ό ν•  λ•Œ μ’‹λ‹€.

원칙

  • 전체 상탯값을 ν•˜λ‚˜μ˜ 객체에 μ €μž₯ν•œλ‹€
  • 상탯값은 λΆˆλ³€ 객체닀
  • 상탯값은 순수 ν•¨μˆ˜μ— μ˜ν•΄μ„œλ§Œ λ³€κ²½λ˜μ–΄μ•Ό ν•œλ‹€.

ꡬ성

  • μ•‘μ…˜
  • 미듀웨어
  • λ¦¬λ“€μ„œ
  • μŠ€ν† μ–΄

μ•‘μ…˜

  • type 속성값을 κ°€μ§„ js 객체.
  • action 객체λ₯Ό dispatch λ©”μ„œλ“œμ— λ„£μ–΄μ„œ ν˜ΈμΆœν•˜λ©΄ λ¦¬λ•μŠ€λŠ” 상탯값을 λ³€κ²½ν•˜κΈ° μœ„ν•΄ μœ„ κ·Έλ¦Ό 처럼 μˆ˜ν–‰ν•œλ‹€.
store.dispatch({ type: 'ADD', title: '타이틀 μΆ”κ°€ν•  λ‚΄μš©', priority:'high'})

미듀웨어

  • λ¦¬λ“€μ„œκ°€ μ•‘μ…˜μ„ μ²˜λ¦¬ν•˜κΈ° 전에 μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜λ‹€.
  • 디버깅 λͺ©μ μœΌλ‘œ 상탯값 λ³€κ²½ μ‹œ 둜그λ₯Ό 좜λ ₯ν•˜κ±°λ‚˜, λ¦¬λ“€μ„œμ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έλ₯Ό μ„œλ²„λ‘œ μ „μ†‘ν•˜λŠ” λ“±μ˜ λͺ©μ μœΌλ‘œ ν™œμš© ν•œλ‹€.
const middleware = store => next => action => next(action)

μŠ€ν† μ–΄

  • λ¦¬λ•μŠ€μ˜ 상탯값을 κ°€μ§€λŠ” 객체닀.
  • μ•‘μ…˜μ˜ λ°œμƒμ€ μŠ€ν† μ–΄μ˜ dispatch λ©”μ„œλ“œλ‘œ μ‹œμž‘λœλ‹€
  • μŠ€ν† μ–΄λŠ” μ•‘μ…˜μ΄ λ°œμƒν•˜λ©΄ 미듀웨어 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ³ , λ¦¬λ“€μ„œλ₯Ό μ‹€ν–‰ν•΄μ„œ 상탯값을 μƒˆλ‘œμš΄ κ°’μœΌλ‘œ λ³€κ²½ν•œλ‹€.
const INITIAL_STATE = { value: 0};
const reducer = createReducer(INITIAL_STATE, {
  INCREMENT: state => (state.value +=1),
});
const store = createStore(reducer);

비동기 처리 방법

  • λ¦¬λ“€μ„œ μ•ˆμ—μ„œ 비동기λ₯Ό ν•˜κ²Œ 되면 3번 원칙인 '상탯값은 순수 ν•¨μˆ˜μ— μ˜ν•΄μ„œλ§Œ λ³€κ²½λ˜μ–΄μ•Ό ν•œλ‹€.' μœ„λ°°λœλ‹€. κ·Έλž˜μ„œ middlewareμ—μ„œ 처리 ν•˜λŠ”λ° μ΄λ•Œ νŒ¨ν‚€μ§€λ₯Ό μ“΄λ‹€.
  • redux-thunk, redux-observable, redux-saga

좜처: μ‹€μ „ λ¦¬μ•‘νŠΈ ν”„λ‘œκ·Έλž˜λ°, 이재승, μΈμ‚¬μ΄νŠΈ(2020), pg 249~308


Redux (λ¦¬μ•‘νŠΈλ₯Ό λ‹€λ£¨λŠ” 기술 - velopert)

  • λ¦¬μ•‘νŠΈ μƒνƒœ 관리 라이브러리
  • μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœ μ—…λ°μ΄νŠΈ κ΄€λ ¨ λ‘œμ§μ„ λ‹€λ₯Έ 파일둜 λΆ„λ¦¬μ‹œμΌœ 효율적인 관리 κ°€λŠ₯
  • μ „μ—­ μƒνƒœλ₯Ό 관리할 λ•Œ 효과적(Context APIλ₯Ό ν†΅ν•΄μ„œλ„ κ°€λŠ₯)
  • ν”„λ‘œμ νŠΈμ˜ 규λͺ¨κ°€ 클 경우 λ¦¬λ•μŠ€ > Context API
    • μ½”λ“œμ˜ μœ μ§€ λ³΄μˆ˜μ„± λ†’μ—¬μ£Όκ³  μž‘μ—…νš¨μœ¨μ„ κ·ΉλŒ€ν™”ν•΄μ£ΌκΈ° λ•Œλ¬Έ

      ex) TODO

μ•‘μ…˜

  • μƒνƒœμ— μ–΄λ– ν•œ λ³€ν™”κ°€ ν•„μš”ν•˜λ©΄ μ•‘μ…˜(action)이 λ°œμƒ

  • ν•˜λ‚˜μ˜ 객체둜 ν‘œν˜„λœλ‹€

  • ν˜•μ‹

    {
    	type: 'ADD_TODO'
    }
  • μ•‘μ…˜ κ°μ²΄λŠ” type ν•„λ“œλ₯Ό λ°˜λ“œμ‹œ κ°€μ§„λ‹€

    • type β‡’ μ•‘μ…˜μ˜ 이름이라고 μƒκ°ν•˜λ©΄ λœλ‹€
    • ex)
    {
    	type: 'ADD_TODO',
    	data: {
    		id: 1,
    		text: 'κ³΅λΆ€ν•˜κΈ°'
    	}
    }
    
    {
    	type: 'CHANGE_INPUT',
    	text: 'μ•ˆλ…•ν•˜μ„Έμš”'
    }

μ•‘μ…˜ 생성 ν•¨μˆ˜

  • μ•‘μ…˜ 객체λ₯Ό λ§Œλ“€μ–΄ μ£ΌλŠ” ν•¨μˆ˜
const addTodo = (data) => ({
	type: 'ADD_TODO',
	data
}) 
  • λ³€ν™”λ₯Ό μΌμœΌμΌœμ•Ό ν•  λ•Œ, 직접 μ•‘μ…˜ 객체λ₯Ό λ§Œλ“€κΈ°λ³΄λ‹€ ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ„œ 관리

λ¦¬λ“€μ„œ(reducer)

  • λ³€ν™”λ₯Ό μΌμœΌν‚€λŠ” ν•¨μˆ˜
  • μ•‘μ…˜μ„ λ§Œλ“€μ–΄μ„œ λ°œμƒμ‹œν‚€λ©΄ λ¦¬λ“€μ„œκ°€ ν˜„μž¬ μƒνƒœμ™€ 전달받은 μ•‘μ…˜ 객체λ₯Ό 인자둜 λ°›μ•„ 옴
  • 인자둜 λ„˜μ–΄μ˜¨ 두 값을 μ°Έκ³ ν•˜μ—¬ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ§Œλ“€μ–΄μ„œ λ°˜ν™˜
const initialState = {
	counter: 1
};

const reducer(state = initialState, action) {
	switch(action.type) {
		case INCREMENT:
			return {
				counter: state.counter + 1
			};
		default:
			return state;
	}
}

μŠ€ν† μ–΄

  • ν•œ 개의 ν”„λ‘œμ νŠΈλŠ” 단 ν•˜λ‚˜μ˜ μŠ€ν† μ–΄λ₯Ό κ°€μ§„λ‹€
  • μŠ€ν† μ–΄ μ•ˆμ—λŠ” ν˜„μž¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœ & λ¦¬λ“€μ„œ + λͺ‡ κ°€μ§€ μ€‘μš”ν•œ λ‚΄μž₯ ν•¨μˆ˜
    • μŠ€ν† μ–΄μ˜ λ‚΄μž₯ν•¨μˆ˜
      • λ””μŠ€νŒ¨μΉ˜(dispatch)
        • μ•‘μ…˜μ„ λ°œμƒμ‹œν‚€λŠ” 것
        • dispatch(action)
        • λ””μŠ€νŒ¨μΉ˜ 호좜 β‡’ μŠ€ν† μ–΄λŠ” λ¦¬λ“€μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œμΌœμ„œ μƒˆλ‘œμš΄ μƒνƒœ λ§Œλ“ λ‹€
      • ꡬ독(subscribe)
        • λ¦¬μŠ€λ„ˆ ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„£μ–΄μ„œ ν˜ΈμΆœν•΄μ£Όλ©΄, λ¦¬μŠ€λ„ˆ ν•¨μˆ˜κ°€ μ•‘μ…˜μ΄ λ””μŠ€νŒ¨μΉ˜ 될 λ•Œ (μƒνƒœκ°€ μ—…λ°μ΄νŠΈ 될 λ•Œ) ν˜ΈμΆœλœλ‹€.

λ¦¬μ–΄μŠ€μ˜ μ„Έ κ°€μ§€ κ·œμΉ™

  1. 단일 μŠ€ν† μ–΄
    • 1 app = 1 store
    • 닀쀑 μŠ€ν† μ–΄κ°€ λΆˆκ°€λŠ₯ν•˜μ§€λŠ” μ•Šλ‹€
      • μƒνƒœ 관리가 λ³΅μž‘ν•΄μ§ˆ 수 μžˆμœΌλ―€λ‘œ ꢌμž₯ X
  2. 읽기 μ „μš© μƒνƒœ
    • μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈ ν•  λ•Œ 기쑴의 객체 κ±΄λ“œλ¦¬μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 객체 생성
    • λΆˆλ³€μ„± μ§€μΌœμ£ΌκΈ° μœ„ν•΄ spread μ—°μ‚°μž or immer와 같은 λΆˆλ³€μ„± 라이브러리 μ‚¬μš©
    • λ¦¬λ•μŠ€μ—μ„œλŠ” λ‚΄λΆ€μ μœΌλ‘œ 데이터가 λ³€κ²½λ˜λŠ” 것을 κ°μ§€ν•˜κΈ° μœ„ν•΄ 얕은 비ꡐ검사λ₯Ό ν•œλ‹€
  3. λ¦¬λ“€μ„œλŠ” μˆœμˆ˜ν•œ ν•¨μˆ˜
    • λ³€ν™”λ₯Ό μΌμœΌν‚€λŠ” λ¦¬λ“€μ„œ ν•¨μˆ˜λŠ” 순수 ν•¨μˆ˜μ—¬μ•Ό ν•œλ‹€.
      • λ¦¬λ“€μ„œ ν•¨μˆ˜λŠ” 이전 μƒνƒœμ™€ μ•‘μ…˜ 객체λ₯Ό 인자둜 λ°›λŠ”λ‹€
      • νŒŒλΌλ―Έν„° μ™Έμ˜ 값에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€
      • 이전 μƒνƒœλŠ” κ±΄λ“œλ¦¬μ§€ μ•Šκ³ , λ³€ν™”λ₯Ό μ€€ μƒˆλ‘œμš΄ μƒνƒœ 객체λ₯Ό λ§Œλ“€μ–΄ λ°˜ν™˜ν•œλ‹€
      • λ˜‘κ°™μ€ νŒŒλΌλ―Έν„°λ‘œ 호좜된 λ¦¬λ“€μ„œ ν•¨μˆ˜λŠ” 같은 κ²°κ³Ό 값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€
    • λ¦¬λ“€μ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λžœλ€κ°’ λ§Œλ“€κΈ°, Date ν•¨μˆ˜ μ‚¬μš©ν•˜κΈ°, λ„€νŠΈμ›Œν¬ μš”μ²­ν•˜κΈ° X

Redux - React App μž‘μ—… ν™˜κ²½ μ„€μ •

UI

λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈμ—μ„œ λ¦¬λ•μŠ€λ₯Ό μ‚¬μš©ν•  λ•Œ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄μ€ ν”„λ ˆμ  ν…Œμ΄μ…”λ„ μ»΄ν¬λ„ŒνŠΈμ™€ μ»¨ν…Œμ΄λ„ˆ μ»΄ν¬λ„ŒνŠΈλ₯Ό λΆ„λ¦¬ν•˜λŠ” 것.

  • ν”„λ ˆμ  ν…Œμ΄μ…”λ„ μ»΄ν¬λ„ŒνŠΈ
    • μƒνƒœ 관리 X
    • propsλ₯Ό λ°›μ•„μ™€μ„œ 화면에 UIλ₯Ό λ³΄μ—¬μ£ΌκΈ°λ§Œ ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ
  • μ»¨ν…Œμ΄λ„ˆ μ»΄ν¬λ„ŒνŠΈ
    • λ¦¬λ•μŠ€μ™€ μ—°λ™λ˜μ–΄ μžˆλŠ” μ»΄ν¬λ„ŒνŠΈλ‘œ
    • λ¦¬λ•μŠ€λ‘œλΆ€ν„° μƒνƒœλ₯Ό λ°›μ•„μ˜€κΈ°λ„, λ¦¬λ•μŠ€ μŠ€ν† μ–΄μ— μ•‘μ…˜μ„ λ””μŠ€νŒ¨μΉ˜ ν•˜κΈ°λ„ ν•œλ‹€.

μž₯점

  • μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±
  • κ΄€μ‹¬μ‚¬μ˜ 뢄리가 이루어져 UIλ₯Ό μž‘μ„±ν•  λ•Œ μ’€ 더 집쀑할 수 μžˆλ‹€.

image

  • UI에 κ΄€λ ¨λœ ν”„λ ˆμ  ν…Œμ΄μ…”λ„ μ»΄ν¬λ„ŒνŠΈ β‡’ src/components
  • λ¦¬λ•μŠ€μ™€ μ—°λ™λœ μ»¨ν…Œμ΄λ„ˆ μ»΄ν¬λ„ŒνŠΈ β‡’ src/containers

Redux DevTools 의 μ„€μΉ˜ 및 적용

  • Redux 개발자 도ꡬ
  • 크둬 ν™•μž₯ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ„€μΉ˜ν•˜μš” μ‚¬μš©κ°€λŠ₯
  • νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜μ—¬ μ μš©ν•˜λŠ” 것 μΆ”μ²œ
    • yarn add redux-devtools-extension
import React from "react";
import ReactDOM from "react-dom";
import { createStore } from "redux";
import { Provider } from "react-redux";
import { composeWithDevTools } from "redux-devtools-extension";
import App from "./App";
import rootReducer from "./modules";

const store = createStore(rootReducer, composeWithDevTools());

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);

image 좜처: λ¦¬μ•‘νŠΈλ₯Ό λ‹€λ£¨λŠ” 기술(velopertλ‹˜)


πŸ“Œ Redux

  • μ „μ—­(κΈ€λ‘œλ²Œ) μƒνƒœκ΄€λ¦¬ 라이브러리
  • μŠ€ν† μ–΄λΌλŠ” 가상곡간에 데이터λ₯Ό λͺ¨μ•„두어,
    ν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 데이터λ₯Ό κ°€μ Έλ‹€ μ‚¬μš©, λ³€κ²½ ν•  수 있음
  • Context API 와 useReducer Hook 을 μ‚¬μš©ν•΄μ„œ κ°œλ°œν•˜λŠ” 흐름과
    Redux(λ¦¬λ•μŠ€)λ₯Ό μ‚¬μš©ν•˜λŠ” 개발 방식이 μœ μ‚¬
    • ReduxλŠ” λ¦¬λ“€μ„œμ™€ μ•‘μ…˜μ΄λΌλŠ” κ°œλ…μ„ μ‚¬μš©

πŸ“Œ Redux와 Context API의 μ°¨μ΄λŠ”?

1. 미듀웨어

  • [μœ μ‚¬μ ] Redux둜 μƒνƒœ 관리 μ‹œ ➑ useReducer μ—μ„œ μ“°μ˜€λ˜ λ¦¬λ“€μ„œ ν•¨μˆ˜λ₯Ό μ‚¬μš©

  • [차이점] ReduxλŠ” 미듀웨어(Middleware)λΌλŠ” κ°œλ…μ΄ 쑴재

  • [차이점] 미듀웨어λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•‘μ…˜ 객체가 λ¦¬λ“€μ„œμ—μ„œ 처리되기 전에
    μš°λ¦¬κ°€ μ›ν•˜λŠ” μž‘μ—…λ“€μ„ μˆ˜ν–‰ ν•  수 있음

    - νŠΉμ • 쑰건에 따라 ➑ μ•‘μ…˜μ΄ λ¬΄μ‹œλ˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
    - μ•‘μ…˜μ„ μ½˜μ†”μ— 좜λ ₯ν•˜κ±°λ‚˜, μ„œλ²„μͺ½μ— λ‘œκΉ…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    - μ•‘μ…˜μ΄ λ””μŠ€νŒ¨μΉ˜ 됐을 λ•Œ ➑ 이λ₯Ό μˆ˜μ •ν•΄μ„œ λ¦¬λ“€μ„œμ—κ²Œ μ „λ‹¬λ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    - νŠΉμ • μ•‘μ…˜μ΄ λ°œμƒν–ˆμ„ λ•Œ ➑ 이에 κΈ°λ°˜ν•˜μ—¬ λ‹€λ₯Έ μ•‘μ…˜μ΄ λ°œμƒλ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    - νŠΉμ • μ•‘μ…˜μ΄ λ°œμƒν–ˆμ„ λ•Œ ➑ νŠΉμ • μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • [차이점 & 미듀웨어 νŠΉμ§•] λ―Έλ“€μ›¨μ–΄λŠ” 주둜 비동기 μž‘μ—…μ„ 처리 ν•  λ•Œ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.

2. μœ μš©ν•œ ν•¨μˆ˜μ™€, Hooks

  • connect ν•¨μˆ˜

    • λ¦¬λ•μŠ€μ˜ μƒνƒœ λ˜λŠ” μ•‘μ…˜ 생성 ν•¨μˆ˜λ₯Ό μ»΄ν¬λ„ŒνŠΈμ˜ props 둜 λ°›μ•„μ˜¬ 수 있음
    • μ»¨ν…Œμ΄λ„ˆ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“œλŠ” 또 λ‹€λ₯Έ 방법
    • 이 ν•¨μˆ˜λŠ” 사싀 μ•žμœΌλ‘œ μ‚¬μš© ν•  일이 λ³„λ‘œ μ—†λ‹€. ❌❌
      • useSelector, useDispatchκ°€ 더 자주 μ“°μž„
  • useSelector, useDispatch, useStore 와 같은 Hooks

    • μ†μ‰½κ²Œ μƒνƒœλ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ μ•‘μ…˜μ„ λ””μŠ€νŒ¨μΉ˜ ν•  수 있음

  • [차이점] connect ν•¨μˆ˜μ™€ useSelector ν•¨μˆ˜μ—λŠ”
    λ‚΄λΆ€μ μœΌλ‘œ μ΅œμ ν™”κ°€ 잘 μ΄λ£¨μ–΄μ Έμžˆμ–΄μ„œ
    μ‹€μ œ μƒνƒœκ°€ λ°”λ€”λ•Œλ§Œ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§ 됨

  • [차이점] Context APIλ₯Ό μ‚¬μš©ν•  λ•Œμ—λŠ”
    κ·ΈλŸ¬ν•œ μ΅œμ ν™”κ°€ μžλ™μœΌλ‘œ μ΄λ£¨μ–΄μ Έμžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—
    Context κ°€ μ§€λ‹ˆκ³  μžˆλŠ” μƒνƒœκ°€ λ°”λ€Œλ©΄
    ν•΄λ‹Ή Context 의 Provider λ‚΄λΆ€ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ λͺ¨λ‘ λ¦¬λ Œλ”λ§ 됨


πŸ“Œ λ¦¬λ•μŠ€ μ–Έμ œ 써야 ν• κΉŒ?

1. ν”„λ‘œμ νŠΈμ˜ 규λͺ¨κ°€ 큰가? βœ”

  • Yes: λ¦¬λ•μŠ€
  • No: Context API

2. 비동기 μž‘μ—…μ„ 자주 ν•˜κ²Œ λ˜λŠ”κ°€? βœ”

  • Yes: λ¦¬λ•μŠ€
  • No: Context API

πŸ“Œ λ¦¬λ•μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” ν‚€μ›Œλ“œ

πŸ’« μ•‘μ…˜ (Action)

  • 무슨일이 μΌμ–΄λ‚¬λŠ”μ§€ μ„€λͺ…ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 객체
  • μ•‘μ…˜ κ°μ²΄λŠ” type ν•„λ“œλ₯Ό ν•„μˆ˜μ μœΌλ‘œ κ°€μ§€κ³  μžˆμ–΄μ•Ό 함
  • κ·Έ μ™ΈλŠ” 개발자 마음 >.<
{
  type: "TOGGLE_VALUE"
}

πŸ’« μ•‘μ…˜ νƒ€μž… (Action Type)

  • actionTypes.js 둜 넀이밍을 μžμ£Όν•œλ‹€.
  • μ•‘μ…˜ λͺ…은 λŒ€λ¬Έμžλ‘œ μž‘μ„±ν•œλ‹€.
// μ•‘μ…˜ μ •μ˜ : .../actionTypes.js 

// μ•‘μ…˜λͺ…은 λŒ€λ¬Έμžλ‘œ μž…λ ₯
export const ADD_TODO = 'ADD_TODO'
export const TOGGLE_TODO = 'TOGGLE_TODO'
export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER'

{
  type : ADD_TODO,
  text : 'build my first Redux app',
  index : 33, // 고유인덱슀λ₯Ό μ‚¬μš©ν•˜κΈ°λ„ν•¨.
}


// μ•‘μ…˜μ„ μ‚¬μš©ν•  κ³³
import  { ADD_TODO, TOGGLE_TODO, SET_VISIBILITY_FILTER } from '경둜/actionTypes'

πŸ’« μ•‘μ…˜ μƒμ„±ν•¨μˆ˜ (Action Creator)

  • μ•‘μ…˜μ„ λ§Œλ“œλŠ” ν•¨μˆ˜ (ν…œν”Œλ¦Ώ λŠλ‚Œμ΄λΌκ³  생각이 λ“€μ—ˆλ‹€!!!)
  • λ‹¨μˆœνžˆ νŒŒλΌλ―Έν„°λ₯Ό λ°›μ•„μ™€μ„œ μ•‘μ…˜ 객체 ν˜•νƒœλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.
  • μ•‘μ…˜ μƒμ„±ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜λŠ” 이유:
    • λ‚˜μ€‘μ— μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ”μš± μ‰½κ²Œ μ•‘μ…˜μ„ λ°œμƒμ‹œν‚€κΈ° μœ„ν•¨
    • κ·Έλž˜μ„œ 보톡 ν•¨μˆ˜ μ•žμ— export ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ λ‹€λ₯Έ νŒŒμΌμ—μ„œ λΆˆλŸ¬μ™€μ„œ μ‚¬μš©
  • λ¦¬λ•μŠ€λ₯Ό μ‚¬μš© ν•  λ•Œ μ•‘μ…˜ μƒμ„±ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ ν•„μˆ˜μ μ΄μ§„ μ•ŠμŒ
    • μ•‘μ…˜μ„ λ°œμƒ μ‹œν‚¬ λ•Œλ§ˆλ‹€ 직접 μ•‘μ…˜ 객체λ₯Ό μž‘μ„±ν• μˆ˜λ„ 있음
export function addTodo(data) { <-- `export` ν‚€μ›Œλ“œ
  return {
    type: "ADD_TODO",
    data
  };
}

// ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œλ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
export const changeInput = text => ({ 
  type: "CHANGE_INPUT",
  text
});

πŸ’« λ¦¬λ“€μ„œ (Reducer)

  • λ³€ν™”λ₯Ό μΌμœΌν‚€λŠ” ν•¨μˆ˜

  • μ•‘μ…˜(μ΄λ¦„ν‘œ)에 λŒ€ν•œ λ¦¬λ“€μ„œ(ν•¨μˆ˜)λ₯Ό μ‹€ν–‰ν•˜μ—¬ μƒνƒœλ₯Ό λ³€κ²½ν•œλ‹€.

  • λ‘κ°€μ§€μ˜ νŒŒλΌλ―Έν„°λ₯Ό λ°›μ•„μ˜¨λ‹€.

    • ν˜„μž¬μ˜ μƒνƒœμ™€, μ•‘μ…˜

    function reducer(state, action) { <-- ν˜„μž¬ μƒνƒœ & μ•‘μ…˜μ„ λ°›μ•„ 옴!!
      // μƒνƒœ μ—…λ°μ΄νŠΈ 둜직
      return alteredState;
    }

  • λ¦¬λ“€μ„œλŠ”, ν˜„μž¬μ˜ μƒνƒœμ™€, 전달 받은 μ•‘μ…˜μ„ μ°Έκ³ ν•˜μ—¬ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ§Œλ“€μ–΄μ„œ λ°˜ν™˜ν•œλ‹€.

  • 이 λ¦¬λ“€μ„œλŠ” useReducer λ₯Ό μ‚¬μš©ν• λ•Œ μž‘μ„±ν•˜λŠ” λ¦¬λ“€μ„œμ™€ λ˜‘κ°™μ€ ν˜•νƒœλ₯Ό κ°€μ§€κ³  μžˆλ‹€!

import * from './headerTypes' // ν•΄λ”μ»΄ν¬λ„ŒνŠΈ μ•‘μ…˜νƒ€μž… λͺ¨λ‘ 뢈러였기
const initState = { // state의 μ΄ˆκΈ°ν™” μ„€μ •
  state01 : {},
  state02 : "",
  state03 : true,
  stateData : [],
  ...
}

// 해더 μ»΄ν¬λ„ŒνŠΈμš© λ¦¬λ“€μ„œ μ •μ˜, 각각의 μ»΄ν¬λ„ŒνŠΈλ³„ λ¦¬λ“€μ„œ, μ•‘μ…˜, μ•‘μ…˜ν¬λ¦¬μ—μ΄ν„°λ₯Ό 각각 μž‘μ„±ν•˜μ—¬ RootReducer.jsμ—μ„œ ν†΅ν•©ν•˜μ—¬ store에 μ μš©ν•œλ‹€.
const headerReducer = (state = initState, action) => {
  switch (action.type) {
    case ADD_TODO :
      return {
        // κΈ°μ‘΄ stateλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠκΈ°μœ„ν•΄ μ „κ°œμ—°μ‚°μž
        //or object.assign()μ‚¬μš©ν•˜μ—¬ 볡사본생성
        ...state,
        addTodo : action.payload.addTodo
      }
    case <μ•‘μ…˜νƒ€μž…λͺ…> :
      return {
      ...state, // λˆ„μ  state 
      // μ•‘μ…˜ν¬λ¦¬μ—μ΄ν„°ν•¨μˆ˜ = action μžλ¦¬μ— 였며, μΈμžλ‘œλ°›μ€ state값이 적용
      <stated이름> : action.payload.<state이름>
      }
      
    // κΈ°λ³Έκ°’ κΌ­ μ§€μ •ν•΄μ£ΌκΈ°
    default : 
      return state
  }
}

πŸ’« μŠ€ν† μ–΄ (Store)

  • 데이터가 μ €μž₯λ˜λŠ” 가상곡간
    • store.js νŒŒμΌμ„ λ§Œλ“€μ–΄ μŠ€ν† μ–΄λ₯Ό λ”°λ‘œ κ΄€λ¦¬ν•˜λŠ” 것이 μ’‹λ‹€.
  • createStore(<λ£¨νŠΈλ¦¬λ“€μ„œ>,<μƒνƒœ μ΄ˆκΈ°κ°’ μ§€μ •>,<미듀웨어듀>)λ₯Ό 톡해 μŠ€ν† μ–΄ 생성
  • [차이점] λ¦¬λ•μŠ€μ—μ„œλŠ” ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ‹Ή ν•˜λ‚˜μ˜ μŠ€ν† μ–΄λ₯Ό λ§Œλ“€κ²Œ λœλ‹€.
    • Context API feature λ³„λ‘œ λ§Œλ“€μ—ˆμ—ˆμŒ!
  • μŠ€ν† μ–΄ μ•ˆμ—λŠ”,
    ν˜„μž¬μ˜ μ•± μƒνƒœμ™€, λ¦¬λ“€μ„œκ°€ λ“€μ–΄κ°€μžˆκ³ , μΆ”κ°€μ μœΌλ‘œ λͺ‡κ°€μ§€ λ‚΄μž₯ ν•¨μˆ˜λ“€μ΄ μžˆλ‹€.
// μŠ€ν† μ–΄μƒμ„±κΈ°, λ―Έλ“€μ›¨μ–΄μ μš© λͺ¨λ“ˆ μž„ν¬νŠΈ
import { createStore, applyMiddleware } from 'redux';

// μ—¬κΈ°μ„œ λΆ€ν„° 미듀웨어/데브툴 κ΄€λ ¨ μž„ν¬νŠΈ
import { composeWithDevTools } from 'redux-devtools-extension';
import logger from 'redux-logger';
import thunk from 'redux-thunk';

// 루트 λ¦¬λ“€μ„œ μž„ν¬νŠΈ
import rootReducer from './rootReducer';

// μŠ€ν† μ–΄ 생성
const store = createStore(
  rootReducer, // λ¦¬λ“€μ„œ μ—°κ²°
  initState, // μƒνƒœ μ΄ˆκΈ°κ°’
  composeWithDevTools(applyMiddleware(thunk, logger))
  // μ‚¬μš©ν•  데브툴/미듀웨어 μ—°κ²°
)

πŸ’« λ””μŠ€νŒ¨μΉ˜ (dispatch)

  • μŠ€ν† μ–΄μ˜ λ‚΄μž₯ν•¨μˆ˜ 쀑 ν•˜λ‚˜
  • μ•‘μ…˜μ„ λ°œμƒ μ‹œν‚€λŠ” 것
  • dispatch λΌλŠ” ν•¨μˆ˜μ—λŠ” μ•‘μ…˜μ„ νŒŒλΌλ―Έν„°λ‘œ 전달
    • dispatch(action)
  • μŠ€ν† μ–΄λŠ” λ¦¬λ“€μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œμΌœμ„œ
    ν•΄λ‹Ή μ•‘μ…˜μ„ μ²˜λ¦¬ν•˜λŠ” 둜직이 μžˆλ‹€λ©΄ μ•‘μ…˜μ„ μ°Έκ³ ν•˜μ—¬ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€.

πŸ’« ꡬ독 (subscribe)

  • μŠ€ν† μ–΄μ˜ λ‚΄μž₯ν•¨μˆ˜ 쀑 ν•˜λ‚˜
  • ν•¨μˆ˜ ν˜•νƒœμ˜ 값을 νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„μ˜¨λ‹€.
  • dispatch λΌλŠ” ν•¨μˆ˜μ—λŠ” μ•‘μ…˜μ„ νŒŒλΌλ―Έν„°λ‘œ 전달
  • subscribe ν•¨μˆ˜μ— νŠΉμ • ν•¨μˆ˜λ₯Ό 전달해주면,
    μ•‘μ…˜μ΄ λ””μŠ€νŒ¨μΉ˜ λ˜μ—ˆμ„ λ•Œ λ§ˆλ‹€ ➑ 전달해쀀 ν•¨μˆ˜κ°€ 호좜
  • λ¦¬λ•μŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œ 될 λ•Œ 보톡 이 ν•¨μˆ˜λ₯Ό 직접 μ‚¬μš©ν•˜λŠ” 일은 λ³„λ‘œ μ—†λ‹€! ❌❌
  • λŒ€μ‹ μ— react-redux λΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” connect ν•¨μˆ˜ λ˜λŠ”
    useSelector Hook 을 μ‚¬μš©ν•˜μ—¬ λ¦¬λ•μŠ€ μŠ€ν† μ–΄μ˜ μƒνƒœμ— κ΅¬λ…ν•œλ‹€.

Redux μ„€μΉ˜

  • react-reduxλŠ” redux와 react μ»΄ν¬λ„ŒνŠΈλ₯Ό μ—°λ™ν•˜μ—¬ store에 μ €μž₯된 μƒνƒœλ₯Ό props둜 μ „λ‹¬ν•˜λ„λ‘ 도와쀀닀.
  • μ–΄λŠ 곳은 redux만 μ„€μΉ˜ν•΄λ„ λœλ‹€κ³  ν•˜λŠ”λ°.. ν™•μ‹€νžˆ 잘 λͺ¨λ₯΄κ² λ‹€..!
npm install --save redux
npm install --save react-redux

  • 폴더 ꡬ쑰
    • components : μ»΄ν¬λ„ŒνŠΈλ“€, 화면에 λ³΄μ—¬μ§€λŠ” μ• λ“€
    • modules : μ•‘μ…˜, λ¦¬λ“€μ„œ μ €μž₯
    • image

μ°Έκ³ 

Clone this wiki locally