쉽게 배우는 리액트 프로그래밍

리액트 프로그래밍: 리덕스 미들웨어 사가 vs 썽크 정복하기!

todaypick124 2024. 10. 22. 07:14
반응형

리액트 애플리케이션에서 데이터를 불러오거나, 외부 API와 통신하는 등의 비동기 작업을 처리하는 건 정말 중요해요. 이런 작업들을 효율적으로 관리하고 싶다면, 리덕스 미들웨어를 빼놓을 수 없죠. 리덕스 미들웨어 중에서도 redux-saga와 redux-thunk는 핵심적인 역할을 하는 친구들이에요. 둘 다 비동기 작업을 처리하는 데 사용하지만, 각자의 방식과 장단점이 있답니다.  오늘은 이 두 미들웨어가 어떻게 다른지, 그리고 어떤 상황에 어떤 미들웨어를 사용하는 게 좋을지 자세히 알아볼 거예요.

 


Redux Thunk: 액션 생성 함수를 이용한 간편한 비동기 처리


액션 생성 함수가 함수를 반환한다고?

redux-thunk는 리덕스 미들웨어 중에서 가장 기본적인 형태라고 할 수 있어요.  이 친구의 핵심은 액션 생성자가 함수를 반환한다는 거예요. 액션 생성자는 보통 객체를 반환해서 리듀서에게 전달하는 역할을 하는데, thunk는 좀 다르죠. 덕분에 액션 생성 함수 내부에서 비동기 작업을 쉽게 처리할 수 있게 되었어요.

 

예를 들어, API에서 데이터를 가져와서 스토어에 저장하는 작업을 생각해 봐요. thunk를 사용하면 이렇게 간단하게 구현할 수 있답니다.

 

const fetchData = () => {
    return (dispatch) => {
        dispatch(fetchDataRequest()); // 데이터 요청 시작 액션 디스패치
        return fetch('https://api.example.com/data') 
            .then(response => response.json()) // 응답 데이터를 JSON으로 파싱
            .then(data => dispatch(fetchDataSuccess(data))) // 데이터 받으면 성공 액션 디스패치
            .catch(error => dispatch(fetchDataFailure(error))); // 에러 발생 시 실패 액션 디스패치
    };
};

간편함과 복잡함 사이에서

위 코드를 보면, thunk를 사용하면 비동기 작업을 처리하는 게 꽤 간단하다는 걸 알 수 있죠.  dispatch 함수를 이용해서 액션을 디스패치하고, fetch API를 통해 데이터를 가져온 다음, 다시 액션을 디스패치해서 리듀서에 전달하는 구조에요. 익숙한 Promise 체인을 사용하기 때문에, 비동기 작업을 다루는 데 어려움을 느끼는 분들도 쉽게 적용할 수 있답니다.

 

하지만 이 간편함에는 약간의 단점이 숨어있어요. 액션 생성자 안에 비동기 작업 로직을 직접 작성하다 보니, 액션 생성자가 점점 복잡해질 수 있다는 거예요.  특히, 여러 개의 API를 호출하거나, 복잡한 조건에 따라 처리 로직을 변경해야 할 때는 액션 생성자가 너무 길어지고 가독성이 떨어질 수 있죠.

 


썽크의 장점과 단점을 정리해보자면…

쉽고 직관적인 구현 액션 생성자가 복잡해질 수 있음
기존 리덕스 구조와의 통합이 용이 복잡한 비동기 흐름 처리에 적합하지 않음
학습 비용이 적음 테스트가 다소 어려울 수 있음

장점 단점

 


Redux Saga: 제너레이터를 이용한 비동기 흐름 제어


제너레이터? 뭔가 복잡해 보이는데…

redux-saga는 좀 더 강력하고, 복잡한 비동기 작업을 효과적으로 처리하기 위해 만들어진 미들웨어에요.  이 친구는 자바스크립트의 generator 함수를 사용해서 비동기 작업을 관리하는데, 처음 접하면 낯설게 느껴질 수도 있답니다.

 

하지만 사가를 써보면, 복잡한 비동기 작업도 훨씬 깔끔하고, 체계적으로 관리할 수 있다는 걸 알게 될 거예요.  예를 들어, 여러 개의 API를 순차적으로 호출하거나, 특정 조건에 따라 작업을 취소해야 할 때, 사가를 이용하면 훨씬 효율적으로 코드를 작성할 수 있답니다.

 

사가를 이용해서 API 데이터를 가져오는 작업을 구현해 보면 다음과 같아요.

 

import { call, put, takeEvery } from 'redux-saga/effects';

function* fetchDataSaga() {
    try {
        const data = yield call(fetch, 'https://api.example.com/data'); // API 호출
        yield put({ type: 'FETCH_SUCCESS', payload: data }); // 성공 액션 디스패치
    } catch (error) {
        yield put({ type: 'FETCH_FAILURE', payload: error }); // 실패 액션 디스패치
    }
}

function* watchFetchData() {
    yield takeEvery('FETCH_REQUEST', fetchDataSaga); // FETCH_REQUEST 액션이 발생하면 fetchDataSaga 실행
}

동기 코드처럼 비동기 작업을 처리한다고?

위 코드에서 yield 키워드가 눈에 띄죠?  제너레이터 함수는 yield를 통해 함수의 실행을 일시 중단하고, 필요한 시점에 다시 실행할 수 있도록 해준답니다. 덕분에 비동기 작업을 마치 동기 코드처럼 작성할 수 있어요.

 

또한, 사가는 takeEvery, takeLatest, call, put 등의 다양한 효과 함수들을 제공해서 비동기 작업을 효과적으로 관리할 수 있도록 도와준답니다.  덕분에 복잡한 비동기 로직을 쉽게 구현하고, 테스트하기도 편리해요.

 


사가의 장점과 단점을 정리해보면…

복잡한 비동기 흐름 처리에 적합 학습 곡선이 다소 가파름
코드 가독성 및 유지보수성이 뛰어남 thunk에 비해 구현이 복잡할 수 있음
테스트하기 용이 제너레이터 함수에 대한 이해가 필요

장점 단점

 


Redux Thunk vs. Redux Saga: 어떤 미들웨어를 선택해야 할까요?



상황에 맞는 선택이 중요해

리덕스 미들웨어인 redux-thunk와 redux-saga는 각각의 장단점을 가지고 있기 때문에, 프로젝트의 특성에 맞게 적절한 미들웨어를 선택하는 게 중요해요.

 

간단한 비동기 작업을 처리하는 경우에는 redux-thunk를 사용하는 게 더 효율적일 수 있어요. 익숙한 Promise 기반으로 구현하기 때문에, 빠르게 개발을 진행할 수 있고, 학습 비용도 적기 때문이죠.

 

하지만 복잡한 비동기 흐름을 다루거나, 여러 개의 API를 호출해야 하는 경우에는 redux-saga가 더 나은 선택이 될 수 있습니다. 제너레이터 함수를 이용해서 비동기 작업을 관리하기 때문에, 코드가 깔끔해지고, 유지보수하기도 쉽기 때문이죠. 또한, 테스트하기도 편리하다는 장점도 있답니다.

 


둘을 비교해 보면 다음과 같아요.

구현 방식 액션 생성 함수가 함수를 반환 제너레이터 함수 사용
비동기 처리 간단한 비동기 작업에 적합 복잡한 비동기 흐름에 적합
코드 가독성 직관적이나 복잡해질 수 있음 명확하고 테스트하기 쉬움
에러 처리 액션 생성 함수 내에서 처리 사가 내에서 중앙 집중적으로 처리

특성 Redux Thunk Redux Saga

 


결론: 최적의 선택을 위해 고민해보세요

리액트 애플리케이션에서 비동기 작업을 효과적으로 관리하는 건 정말 중요해요.  redux-thunk와 redux-saga는 각자의 장단점을 가지고 있고, 어떤 미들웨어를 선택할지는 여러분의 프로젝트 특성에 따라 달라진답니다.

 

프로젝트의 규모, 비동기 작업의 복잡성, 개발팀의 구성원들의 기술 수준 등을 고려해서 신중하게 결정하는 게 좋겠죠?  어떤 미들웨어를 선택하든, 리덕스의 핵심 원칙을 잊지 말고, 깔끔하고, 유지보수하기 쉬운 코드를 작성하는 데 집중한다면, 여러분의 리액트 애플리케이션을 더욱 발전시킬 수 있을 거예요!

 

QnA

Q1. Redux Thunk와 Redux Saga 중 어떤 걸 먼저 학습해야 할까요?

 

A1. Redux Thunk를 먼저 학습하는 것을 추천해요. Redux Thunk는 개념이 비교적 간단하고, 기존 리덕스 구조와의 통합이 쉽기 때문에, 리덕스 미들웨어에 대한 기본적인 이해를 쌓기에 좋답니다. Redux Thunk를 통해 비동기 작업 처리에 대한 감을 익힌 후, Redux Saga를 학습하면 더욱 빠르게 이해하고 활용할 수 있을 거예요.

 

Q2. Redux Saga는 언제 사용하는 게 좋을까요?

 

A2. 복잡한 비동기 흐름을 다루거나, 여러 개의 API를 호출해야 하는 경우 Redux Saga를 사용하는 것이 효과적이에요. 예를 들어, 로그인, 회원가입, 데이터 조회 등 여러 API를 순차적으로 호출해야 하는 경우, 또는 특정 조건에 따라 작업을 취소하거나, 에러를 처리해야 하는 경우에 Redux Saga를 사용하면 코드를 더 깔끔하게 관리하고, 테스트하기도 쉬워진답니다.

 

Q3. Redux Thunk와 Redux Saga를 함께 사용할 수 있을까요?

 

A3. 네, 물론 가능해요.  두 미들웨어는 서로 배타적인 관계가 아니기 때문에, 필요에 따라 함께 사용할 수 있답니다.  예를 들어, 간단한 비동기 작업은 Redux Thunk로 처리하고, 복잡한 비동기 작업은 Redux Saga로 처리하는 식으로 활용할 수 있죠.  하지만, 코드의 복잡성이 증가할 수 있으므로, 신중하게 판단하고 사용하는 것이 좋답니다.

 

마무리

 

리액트 애플리케이션에서 비동기 작업은 필수적이며, Redux Thunk와 Redux Saga는 이를 효과적으로 처리하는 데 도움을 주는 강력한 도구입니다. 프로젝트의 특성에 맞는 미들웨어를 선택하고, 깔끔하고 유지보수하기 쉬운 코드를 작성하여 여러분의 리액트 애플리케이션을 더욱 발전시키세요!

 

키워드

리액트,리덕스,redux,미들웨어,middleware,reduxthunk,reduxsaga,비동기,async,await,제너레이터,generator,프로그래밍,react,javascript,개발,developer,reactnative,frontend,웹개발,reactjs,리액트개발,리액트프로그래밍,웹프로그래밍,프론트엔드,프론트엔드개발,웹앱,웹어플리케이션,액션,action,리듀서,reducer,스토어,store,fetch,api

 

 

반응형