강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

박해진님의 프로필 이미지
박해진

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

리덕스 실제 구현하기

reduxjs/toolkit 적용하여 코드를 작성해보았는데 맞는지 확인 부탁드립니다. 감사합니다.

작성

·

275

·

수정됨

0

안녕하세요 선생님

 

상황) 리덕스 실제 구현하기 부분을 따라하던 도중 configureStore.js에서 createStore 단어 가운데에 취소선이 생기면서 @reduxjs/toolkit의 configureStore로 대체를 권장한다고 뜨는 상황입니다.

import {createStore} from 'redux';

import reducer from '../reducers'; 


const configureStore = () => {
    const store = createStore(reducer);
    store.dispatch({
        type:'CHANGE_NICKNAME',
        data:'luckyhaejin'
    });
    return store;
};

 

사용 중인 OS, 버전)
저는 맥 OS사용자이며, 사용하고 있는 버전은 아래와 같습니다.

{
  "name": "react-nodebird-front",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "next",
    "build": "next build"
  },
  "author": "luckyhaejin",
  "license": "ISC",
  "dependencies": {
    "@ant-design/icons": "^4.2.1",
    "antd": "^4.2.1",
    "next": "^9.5.5",
    "next-redux-wrapper": "^6.0.2",
    "prop-types": "^15.8.1",
    "react": "^16.14.0",
    "react-dom": "^16.14.0",
    "react-redux": "^7.2.9",
    "redux": "^4.2.1",
    "styled-components": "^6.1.1"
  },
  "devDependencies": {
    "eslint": "^8.56.0",
    "eslint-plugin-import": "^2.29.1",
    "eslint-plugin-react": "^7.33.2",
    "eslint-plugin-react-hooks": "^4.6.0"
  }
}

 

상황)
그래서 @reduxjs/toolkit과 관련한 문제 같아 react, react-dom 버전을 최신버전인 18로 바꾸고 next도 최신 버전인 14버전으로 바꾼 뒤 @reduxjs/toolkit을 설치하고 @reduxjs/toolkit 방식으로 대체하라는 메세지 안의 redux 링크를 참고하여 코드를 수정해보았습니다. https://redux.js.org/introduction/why-rtk-is-redux-today 하지만 제가 맞게 작성한건지 잘 모르겠고, 이렇게 제가 짠 코드로 변경을 하게되면 강의를 보며 따라하기가 어려워질 것 같아서 다시 원래 에러가 난 상태로 되돌린 상태입니다.

 

질문)

reduxjs/toolkit을 적용하여 작성한 아래 코드가 맞게 작성된건지 궁금합니다.

 

질문)

깃에서 reduxjs/toolkit을 사용한 코드를 강의 순서대로 적용하고 싶어서 찾아보았으나, 섹션2 코드가 순서대로 적용된게 아니라 한번에 올라온것 같아서, 혹시 강의 순서대로 @reduxjs/toolkit을 적용한 코드가 있다면 어떻게 해야 그 코드를 순서대로 볼 수 있는지 궁금합니다. 만약 강의 순서대로 적용한 코드가 없고 섹션별로 나눠져 있다면 섹션 순서대로 코드를 보는 방법이 궁금합니다.

 


수정 전)

reducers/index.js

const initialState = {
    user: {
        isLoggedIn:false,
        user:null, 
        signUpData:{},
        loginData:{}
    },
    post: {
        mainPosts:[]
    }
};

export const loginAction = (data) => {
    return {
        type: 'LOG_IN',
         data
    }
}

export const logoutAction = () => {
    return {
        type: 'LOG_OUT'
    }
}



// 이전 상태, 액션 => 다음상태
const rootReducer = (state = initialState, action) => {
    switch(action.type) {
        case 'LOG_IN':
            return {
                ...state,
                user: {
                    ...state.user,
                    isLoggedIn: true,
                    user:action.data
                }
            };
        case 'LOG_OUT':
            return {
                ...state,
                user: {
                    ...state.user,
                    isLoggedIn: false,
                    user:null
                }
            };
       default: 
          return state;
    }
};

export default rootReducer;

 

수정 후)
reducers/userSlice

import {createSlice} from '@reduxjs/toolkit'

const userSlice = createSlice({
    name: 'user',
    initialState: {
        isLoggedIn: false,
        user:null
    }, 
    reducers: {
        login(state, action) {
            isLoggedIn: true,
            user:action.payload;
        },
        logout(state) {
            isLoggedIn: false,
            user:null
        }
    }
})

export const {login, logout} = userSlice.actions;
export default userSlice.reducer;

reducers/postSlice

import {createSlice} from '@reduxjs/toolkit'

const postSlice = createSlice({
    name: 'post',
    initialState: {
        mainPosts:[]
    },
    reducers: {
        
   }
});

export default postSlice.reducer;

 

 

수정 전)
store/configureStore.js

import {createWrapper} from 'next-redux-wrapper';
import {createStore} from 'redux';

import reducer from '../reducers'; 


const configureStore = () => {
    const store = createStore(reducer);
    store.dispatch({
        type:'CHANGE_NICKNAME',
        data:'luckyhaejin'
    });
    return store;
};

const wrapper = createWrapper(configureStore, {
    debug: process.env.NODE_ENV === 'development',
});


export default wrapper;

수정 후)

store/configureStore.js

import { createWrapper } from 'next-redux-wrapper';
import { configureStore } from '@reduxjs/toolkit';
import userReducer from '../reducers/userSlice';
import postReducer from '../reducers/postSlice'

const makeStore = () => {
    const store = configureStore({
        reducer: {
            user: userReducer,
            post: postReducer
        }
    });
    return store;
};

const wrapper = createWrapper(makeStore, {
    debug: process.env.NODE_ENV === 'development',
});

export default wrapper;

 

 

답변 2

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 코드는 제대로 작성하셨습니다.

중간 소스 코드는 따로 제공드리지는 않습니다. 리덕스나 리덕스 툴킷은 사용법이 꽤나 직관적이라서 잘 돌아가면 아무 문제가 없는 코드입니다(아예 잘 돌아가거나 아니면 아예 돌아가지 않습니다). 다만 나중에 비동기 코딩을 할 때 좀 많이 차이납니다. 강의에서는 saga를 쓰는데 saga는 툴킷과 같이 쓰지도 않고 코드도 완전 다릅니다. 툴킷은 redux-thunk 기반이라고 보시면 됩니다.

박해진님의 프로필 이미지
박해진
질문자

바쁘실텐데 답변해주셔서 감사합니다!!

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

툴킷으로 만들다가 막히는 거 있으시면 알려주세요

0

박해진님의 프로필 이미지
박해진
질문자

앗 네 감사합니당 선생님!! 강의 다보고 툴킷으로도 해볼게욧 ! 좋은 하루 되세요!!

박해진님의 프로필 이미지
박해진

작성한 질문수

질문하기