article thumbnail image
Published 2022. 6. 29. 18:58

 

https://www.notion.so/Redux-90761b4b69d94b09b96c1cb2b14dcd9d#da259a9617044ce09f7943475721ebb6

 

Redux를 쓰는 이유

 

Context API → 사용하기 쉽지만 복잡해진다면 관리, 추가하기 어렵다

Redux → 상태 관리 라이브러리로써 가장 많은 기능을 지원하기 때문에 현업에서 자주 많이 사용됨

 

이전 상태관리 라이브러리에 대해 잠시 정리헀지만 다시 간단히 정리해보면

Redux : 변수들을 어느 곳에서나 접근하고 관리하기 쉽게 만들어 주기 위해 사용하는 변수를 모아두는 창고라고 연상할 수 있다.

 

관련 정보 홈페이지

https://redux-toolkit.js.org/

 

Redux Toolkit | Redux Toolkit

The official, opinionated, batteries-included toolset for efficient Redux development

redux-toolkit.js.org

 

Redux 용어

기본 세팅을 할때부터 자주 사용되는 용어와 문법을 정리하였습니다

 

 

store : 변수를 모아서 관리하는 곳, 변수 창고라고 생각할 수 있다.

 

store안에는 현재의 앱 상태(state)와 리듀서라고 하는 것이 들어있다

//store

import { configureStore } from '@reduxjs/toolkit'
import userReducer from '../features/userSlice'

export default configureStore({
  reducer: {
      user : userReducer
  },
})

 

createSlice : store안에 넣어서 관리할 변수 박스를 만든다.

import { createSlice } from '@reduxjs/toolkit'

export const userSlice = createSlice({
  name: 'user', //변수 박스 이름
  initialState: { //object로 저장된다
    user: null, //박스에 저장되는 변수명들 
  },
  reducers: {
    login : (state, action) => {
        state.user = action.payload; 
    },
    logout :  (state) => {
        state.user = null;
    }
  },
})

export const { login, logout } = userSlice.actions;
export const selectUser = (state) => state.user.user;
export default userSlice.reducer;

 

Reducer : 변화를 일으키는 함수

reducers: {
    login : (state, action) => {
        state.user = action.payload;
    },
    logout :  (state) => {
        state.user = null;
    }

 

 

리듀서는 두가지의 파라미터 state와 action을 받아옴

object로 넘어오는 action들을 payload로 받는다.

 

사실 Reducer를 단순히 변화를 일으키는 함수라고 생각하면 어렵다..

객체에 특징을 Reduce(줄이다) 표현한다 ⇒ 객체의 특징을 줄여서 표현한 것 = Reducer라고 설명하고 싶다

 

 

Action : 상태에 어떠한 변화가 필요할 때 액션이란 것을 발생 시키게 되는데 이것은 하나의 객체로 표현됨

액션 객체는 type 필드를 필수적으로 가지고 있어야하고 그 외의 값들은 개발자 마음대로 넣어줄 수 있다.

 

근데 사실 좀 어려워서 action을 console.log로 찍어봤다

대충 이런 구조가 나온다 type은 store에 저장된 이름 / 호출한 reducer가 있다.

그리고 payload로 넘어오는 값을 받을 수 있고 그 값을 slice에서 사용할 수 있다

 

Reducer를 발생시키기 위해 사용한다?

reducer로 호출하여 넘어온 데이터와 타입을 받는다고 생각했다

 

 

디스패치 (dispatch) : 스토어의 내장함수 중 하나로 액션을 발생 시키는 것

dispatch에는 액션을 파라미터로 전달함

 

slice안에 있는 함수를 사용할 수 있게 해준다

 

상태 변화를 일으킬 수 있는 useState의 set이라고 이해했다

 

dispatch(action)이라곤 하지만 호출을 하면, 스토어는 리듀서 함수를 실행시켜서 해당 액션을 처리하는 로직이 있다면 액션을 처리하여 새로운 상태(state)로 업데이트 해준다.

 

 

구독 (subscribe) : 함수 형태의 값을 파라미터로 받는데 subscribe 함수에 특정 함수를 전달해주면, 액션이 디스패치 되었을 때 마다 전달해준 함수가 호출된다

 

여기서 useSelector()란 리덕스 스토어의 상태를 조회하는 기능을 가지고 있는 React-Hook 중 하나이다. ( 위 설명한 구독의 기능을 수행하게 된다 )

 

//userSlice 위 코드 일부분
export const selectUser = (state) => state.user.user; //state(현재의 상태(state)에서 user라는 박스 이름을 가진 곳에서 user라는 변수를 찾아온다.)


import { useDispatch, useSelector } from "react-redux"; //실행시키고 싶은 함수명을 부르면 실행시켜줌

const user = useSelector(selectUser);
//userSilce에서 export된 값을 매개변수로 useSelector를 통해 조회함

 

 

간단한 세팅

마지막으로 provider로 감싸야만 Redux를 사용할 수 있게 된다

//index.js

import store from './app/store'
import {Provider} from 'react-redux'

ReactDOM.render(
    <React.StrictMode>
        <Provider store={store}> // provider 
            <App/>
        </Provider>
    </React.StrictMode>,
    document.getElementById('root')
);

index.js에 store를 import시키면 된다. useSelector로 데이터를 받아 올 경우 데이터의 변경이 일어난다면 바로 리렌더링 해준다

 

간단한 후기

 

이렇게 하면 기본적인 Redux를 사용할 수 있다고 생각이 되지만 redux-saga 혹은 redux-thunk 아직 많이 부족하다고 생각이 든다. 이후에 추가적으로 따로 정리해보는 것이 좋을 것이고 계속 공부해야될 것 같다사실 Redux는 구글링하면 많이 나오기도 하고 써보면서 이해하는게 좋지 않을까 생각됩니다. 하지만 recoil등 상태관리 하는 것들이 많이 있기 때문에 잘 알아둬야 나중에 다른거 공부할 때 편하지 않을까 생각하고 있습니다

'TIL > 개념정리' 카테고리의 다른 글

React-query란?  (0) 2022.07.01
Recoil  (0) 2022.06.30
상태관리 라이브러리  (0) 2022.06.28
로그인 구현 방식  (0) 2022.06.25
Typescript  (0) 2022.06.23
복사했습니다!