ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] Redux ๊ฐœ๋… ์ •๋ฆฌ
    TECH 2022. 3. 13. 02:04

    โœ”๏ธ Redux๋ž€?

    Redux๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ƒํƒœ(state)๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

     

     

    โœ”๏ธ Redux ๊ธฐ๋ณธ ๊ฐœ๋…

    1. ์•ก์…˜(Action)

    ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ก์…˜์„ ํ†ตํ•ด ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ์•ก์…˜์€ ๊ฐ์ฒด ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋˜๊ณ , type์„ ํ•„์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์˜ต์…˜์œผ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ์•ก์…˜์— ํ•„์š”ํ•œ ๋ถ€๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

    {
        type: 'ADD_MESSAGE',
        data: {
            id: 1
            message: "๋ฆฌ๋•์Šค ๋ฐฐ์šฐ๊ธฐ"
        }
    }

    ๋ฉ”์‹œ์ง€๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์•ก์…˜์ด๊ณ , ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ๋ถ€๊ฐ€์ ์ธ data๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

     

     

    2. ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜(Action Creator)

    ์•ก์…˜์€ ๊ฐ์ฒด ํ˜•์‹์œผ๋กœ ๋ฐ”๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์•ก์…˜์„ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋งŒ๋“ ๋‹ค.

    function addMessage(data) {
      return {
        type: "ADD_MESSAGE",
        data,
      };
    }
    
    // arrow function
    const addMessage = (data) => ({ type: "ADD_MESSAGE", data });

     

    ์•ก์…˜ ์ƒ์„ฑ์€ ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง„๋‹ค.

    addMessage({ id: 1, message: "๋ฆฌ๋•์Šค ๋ฐฐ์šฐ๊ธฐ" });

     

     

    3. ๋ฆฌ๋“€์„œ(Reducer)

    ๋ฆฌ๋“€์„œ๋Š” ์•ก์…˜์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ƒํƒœ(state)๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ค. ๋ฆฌ๋“€์„œ๋Š” ํ˜„์žฌ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ณ , ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    function message(state, action) {
        switch(action.type) {
            case 'ADD_MESSAGE':
                return {
                    ...state,
                    action.data
                }
            default:
                return state
        }
    }

    ์—ฌ๊ธฐ์„œ ์•ก์…˜์— ์ „๋‹ฌํ•œ ๋ถ€๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ์ธ data๋Š” action.data์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    4. ์Šคํ† ์–ด(Store)

    ํ•˜๋‚˜์˜ ์•ฑ์—๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ์กด์žฌํ•˜๊ณ , ์œ ์ผํ•œ ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์˜ ์ „์ฒด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    ์Šคํ† ์–ด ์ƒ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค.

    import { createStore } from "redux";
    import message from "./messageReducer";
    
    const store = createStore(message);

    redux์—์„œ ์ œ๊ณตํ•˜๋Š” createStore ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ธ์ž๋กœ ๋ฆฌ๋“€์„œ๋ฅผ ์ „๋‹ฌํ•ด ์ค€๋‹ค.

     

     

    5. ๋””์ŠคํŒจ์น˜(Dispatch)

    ๋””์ŠคํŒจ์น˜๋Š” ์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋””์ŠคํŒจ์น˜๋Š” ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์•ก์…˜์„ ๋ฆฌ๋“€์„œ์—๊ฒŒ ์ „๋‹ฌํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.

     

     

    6. ๊ตฌ๋…(Subscribe)

    ๊ตฌ๋…์€ ์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜๋ฅผ subscribe์— ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋ฉด ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.

    const listener = () => {
      console.log("Update!");
    };
    
    const unsubscribe = store.subscribe(listener);
    unsubscribe(); // ๊ตฌ๋…์„ ๋น„ํ™œ์„ฑํ™”ํ•  ๋•Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค

     

     

    7. ์…€๋ ‰ํ„ฐ(Selector)

    react-redux์—์„œ ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

    const message = useSelector((state) => state.message);

     

    โœ”๏ธ Redux์˜ ์žฅ์ 

    • redux๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์— ๋น„ํ•˜๋ฉด ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šด ์ƒํƒœ ๊ด€๋ฆฌ(props drilling ๋“ฑ)๋ฅผ ์Šคํ† ์–ด ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ผ๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๋‹ค.
    • ์•ก์…˜์„ ๋””์ŠคํŒจ์น˜๋กœ ์ „๋‹ฌํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ๋ก์ด ๋‚จ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฅผ ์ฐพ๊ธฐ ์‰ฝ๋‹ค.
    • ๋ฆฌ๋“€์„œ๋Š” ๊ฐ™์€ input์„ ์ž…๋ ฅํ•˜๋ฉด ๊ฐ™์€ output์„ ์ถœ๋ ฅํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๋‹ค.

     

    โœ”๏ธ Redux์˜ ์„ธ ๊ฐ€์ง€ ์›์น™

    1. Single source of truth

    ์ „์ฒด ์ƒํƒœ๊ฐ’์ด ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋œ๋‹ค.
    ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ณณ์—์„œ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค → ๋‹จ ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ

    2. State is read-only

    state๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค.
    ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ก์…˜ ๊ฐ์ฒด๋ฟ์ด๋‹ค

    3. Changes are made with pure functions

    ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.
    ์ด ์ˆœ์ˆ˜ ํ•จ์ˆ˜*๋ฅผ reducer(๋ฆฌ๋“€์„œ)๋ผ๊ณ  ํ•œ๋‹ค. ๋ฆฌ๋“€์„œ๋Š” ์ด์ „ ์ƒํƒœ์™€ ์•ก์…˜์„ ๋ฐ›์•„ ๋‹ค์Œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ด๋‹ค.


    *์ˆœ์ˆ˜ ํ•จ์ˆ˜: ๊ฐ™์€ ์ธ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

    โœ”๏ธ Redux์™€ ์œ ์‚ฌํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ํˆด

    React์˜ Context API๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋‹ค.
    ๋‚ด๊ฐ€ ๋Š๋‚€ Context API์™€ Redux์˜ ์ฐจ์ด์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    Context API

    ๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž์ฒด ์ „์—ญ์ƒํƒœ ๊ด€๋ฆฌ API์ด๋‹ค.

    Context API๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Provider๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    ์—ฌ๊ธฐ์„œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ Context๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ Provider๋ฅผ ๋”ฐ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ฐ๋Š” ๊ฒฝ์šฐ๋‚˜, Provider๋ฅผ ์ค‘์ฒฉํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

    <ItemContext.Provider value={{ items, setItems }}>
      <ShowContext.Provider value={{ isShow, setIsShow }}>
        {children}
      </ShowContext.Provider>
    </ItemContext.Provider>

    ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๋Š” useContext๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

    const { item } = useContext(ItemContext);

    Redux

    Redux๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” App ์ „์ฒด๋ฅผ Provider๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์—ฌ๋Ÿฌ ์ƒํƒœ๊ฐ€ ์žˆ๋”๋ผ๋„ store๋ฅผ ์‚ฌ์šฉํ•ด ํ•œ ๋ฐ ๋ชจ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Provider๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ๋“  ๋ชจ๋“  ์ƒํƒœ๋ฅผ useSelector๋ฅผ ์‚ฌ์šฉํ•ด ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋‹ค. 

     

     

    โœ”๏ธ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์ƒํ™ฉ

    ํ•˜๋‚˜์˜ state๊ฐ€ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๋•Œ redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

    redux๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—, ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ตœ์ƒ๋‹จ์˜ ์ปดํฌ๋„ŒํŠธ, ์˜ˆ๋ฅผ ๋“ค์–ด App ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ทธ ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•ด ์ฃผ์–ด์•ผ๊ฒ ์ง€๋งŒ, redux๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ผ๋‹จ ๊ทธ ์ฝ”๋“œ์—์„œ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ๊ฒŒ ์ค„์–ด๋“ค๊ณ  useSelector๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ์—์„œ๋Š” Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์—ฌ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

    ๋Œ“๊ธ€

Designed by Tistory.