Skip to main content

Command Palette

Search for a command to run...

요즘 리덕스 - 리덕스 툴킷에 대해 알아보자

요즘 리덕스 누가 그냥 쓰나요? 툴킷으로 쓰죠

Updated
3 min readView as Markdown
요즘 리덕스 - 리덕스 툴킷에 대해 알아보자
T

Software engineer for web tech. Interested in sustainable growth as software engineer.

리덕스 툴킷은 2019년 리덕스 공식 팀에 의해 개발 및 출시 되었습니다.
공식 문서에 의하면 리덕스 툴킷은 효율적인 Redux 개발을 위한 리덕스 공식 팀의 견해를 반영한 standalone으로 작동하는 도구 모음입니다. 약어로 RTK로 부르기도 합니다.

Redux는 매우 유연하고 강력한 상태 관리 라이브러리이지만 설정과 사용법이 복잡하고 특유의 보일러플레이트 코드가 많다는 단점이 있었습니다. 이러한 문제점을 해결하고, Redux 개발 경험을 좀 더 쉽고 효율적으로 만들기 위해 탄생했습니다. 리덕스 팀은 이 기술을 Redux 사용을 위한 새로운 표준이 되길 바라며 만들었습니다.

RTK의 장점

  • 보일러플레이트 코드 감소: 액션 생성자, 리듀서, 상태 초기화 같은 작업을 간소화합니다.

  • 설정 간소화: configureStore 함수를 통해 스토어 설정을 간단하게 해줍니다. 미들웨어 설정, devTool 확장 통합등을 자동으로 처리합니다.

  • 간편해진 불변성 관리: 내부에서 immer 라이브러리를 사용하여 상태 업데이트 시 불변성을 유지하는 과정이 간소화됩니다. 불변성 관리 로직으로 인한 코드 결합이 완화됩니다.

  • 비동기 로직의 통합: createAsyncThunk 그리고 RTK Query가 비동기 로직을 쉽게 관리할 수 있는 기능을 제공합니다. 기존의 Saga의 역할을 대신해줍니다.

기존 Redux + Saga 예시

  • 사용자 정보를 비동기로 불러와 업데이트하는 동작입니다.
// actions.js
export const loadUserProfileRequest = () => ({ type: 'LOAD_USER_PROFILE_REQUEST'});
export const loadUserProfileSuccess = () => ({ type: 'LOAD_USER_PROFILE_SUCCESS'});
export const loadUserProfileFailure = () => ({ type: 'LOAD_USER_PROFILE_FAILURE'});

// reducer.js
import produce from 'immer';

const initialState = { profile: null, loadting: false, error: null };

const userProfileReducer = (state = initialState, action) =>
    produce(state, draft => {
        switch (action.type) {
            case 'LOAD_USER_PROFILE_REQUEST':
                draft.loading = true;
                draft.error = null;
                break;
            case 'LOAD_USER_PROFILE_SUCCESS':
                draft.loading = false;
                draft.profile = action.payload;
                break;
            case 'LOAD_USER_PROFILE_FAILURE':
                draft.loading = false;
                draft.error = action.payload;
                break;
            default:
                break;
        }
    });

// sagas.js
import { call, put, takeLatest } frm 'redux-sage/effects';
import { locadUserProfileSuccess, loadUserProfileFailure } from './actions';
import { fetchUserProfile } from '../api' // api sudo 코드

function* loadUserProfileSaga() {
    try {
        const profile = yield call(fetchUserProfile);
        yield put(loadUserProfileSuccess(profile));
    } catch (error) {
        yield put(loadUserProfileFailure(error));
    }
}

export function* watchUserProfileSaga() {
    yield takeLatest('LOAD_USER_PROFILE_REQUEST', loadUserProfileSaga);
}

RTK 적용 예시

  • Redux + Saga 예시와 로직은 같습니다.
// features/userProfileSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { fetchUserProfile } from '../api' // sudo 코드 api 호출

export const loadUserProfile = createAsyncThunk(
    'userProfile/loadUserProfile',
    async (_, { rejectWithValue }) => {
        try {
            const profile = await fetchUserProfile();
            return profile;
        } catch (error) {
            return rejectWithValue(error.toString());
        }
    }
);

const userProfileSlice = createSlice({
    name: 'userProfile',
    initialState: {
        profile: null,
        loading: false,
        error: null,
    },
    reducers: [],
    extraReducers: (builder) => {
        builder
            .addCase(loadUserProfile.pending, (state) => {
                state.loading = true;
            })
            .addCase(loadUserProfile.fullfiled, (state, action) => {
                state.loading = false;
                state.profile = action.payload;
            })
            .addCase(loadUserProfile.pending, (state, action) => {
                state.loading = false;
                state.error = action.payload;
            })
    }
});

export default userProfileSlice.reducer;

코드 비교

  • 리덕스 사가 + Immer 활용한 코드의 경우 코드가 조금 더 길고, 설정이 복잡한 경향이 있습니다.

  • 반면, RTK의 경우 Immer 코드가 내장됨으로 인해 사라졌고, 각 설정들도 파일을 넘나들지 않고 한곳에 위치시킬 수 있습니다.

RTK의 단점 및 고려사항

  • Redux에 익숙한 경우 학습을 별도로 해야 합니다.

  • 과도한 추상화: 기능들이 Redux에 비해 숨겨져 있다보니 추상화된 부분으로 인해 문제를 진단하고 디버깅 하는데 어려움이 있을 수 있습니다.

  • 리덕스 사가를 사용하는 것보다는 직접적인 제어 흐름 관리가 미흡할 수 있습니다.

마치며

리덕스 툴킷에 대한 소개, 장점과 단점, 리덕스 saga와 RTK의 예시 코드 비교에 대해 간단하게 알아봤습니다. 조사하면 할수록 리덕스를 사용하는 것보다 새로운 표준으로 팀에서도 밀고 있고 이미 5년차가 된 리덕스 툴킷을 사용하는게 좋겠다는 생각이 많이 드는 시간이었습니다.

More from this blog

프론트엔드는 경계를 다루는 직무가 되어간다

프론트엔드는 원래도 복잡했습니다. 브라우저마다 다른 렌더링, 상태 동기화, 성능, 접근성 — 화면 하나 제대로 만드는 데 신경 쓸 게 늘 많았습니다. 다만 그 복잡함은 대체로 한 방향을 향했습니다. 이 UI를 어떻게 만들까, 상태를 어떻게 관리할까, 클릭하면 무엇이 바뀌어야 할까. 그런데 요즘 질문의 축이 하나 더 늘고 있습니다. 이 UI는 서버에서 먼저

Jul 20, 20266 min read

AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

솔직히 말하면, 요즘 PR을 제때 리뷰하지 못하고 있습니다. 개발 속도는 빨라졌는데 리뷰 속도는 그대로입니다. 예전엔 하루 이틀이면 처리하던 게 이제는 며칠씩 밀립니다. 처음엔 제가 게을러진 탓인가 싶었습니다. 돌아보니 그게 아니었습니다. AI 도구를 쓰면서 코드가 쏟아지는 속도가 달라졌습니다. 한 사람이 만들어내는 코드 양이 예전과 비교가 안 됩니다. P

Mar 18, 20263 min read
AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

테드풀의 한 입 지식

78 posts

가볍게 정리하는 기록들입니다.