올해 상반기 진행했던 세 번의 팀 프로젝트 모두 Redux
와 React Redux
를 사용했다. 여러 페이지에서 사용하는 상태들이 있었기 때문이다. 한 군데서 그 상태들을 관리하고 싶었다.
첫 프로젝트에 Redux
를 도입한 이유는 명확했다.
어떠한 문제점이 발생했을 때 해결이 용이하도록 생태계가 큰 라이브러리를 사용하는 것이 맞다고 생각했고, 프로젝트 규모가 짐작이 가지 않았을 때라 큰 프로젝트에는 단순히 Context Api
보다 Redux
를 사용하는 편이 관리에 더 낫다는 의견도 접했기 때문이다. 다른 라이브러리를 접해보지 않았으니 작성해야할 보일러 플레이트가 굉장히 많다고 느껴지지도 않았다.
두, 세번째 프로젝트에서는 경험해봤던 라이브러리를 사용하는 것이 더 효율적이라고 판단해 팀원들과 큰 고민 없이 Redux
를 그대로 사용했다. (물론 지금의 나라면 Recoil
과 Context Api
를 적절히... 사용해보자고 주장할 것이다😉)
프로젝트가 끝나고 상태관리에 대해 공부하면서 Redux
와 React Context
는 다른 목적을 가지고 있다는 글을 보게 되었다.
원문 부분번역
다음에 개발을 할 때는 정확히 알고 적절한 방법을 선택할 수 있도록 공부해보자!
Redux는 "actions"라고 불리는 이벤트를 이용해 application의 상태를 관리하고 업데이트하는 패턴이자 라이브러리이다.
Redux는 상태
를 관리
해준다
context를 이용하면 단계마다 일일이 props를 넘겨주지 않고도 컴포넌트 트리 전체에 데이터를 제공할 수 있습니다
context의 주된 용도는 다양한 레벨에 네스팅된 많은 컴포넌트에게 데이터를 전달하는 것입니다
라고 공식문서에서 이야기하고 있다.
즉 Context는 상태관리가 아닌 Props drilling을 피하는데 그 목적을 두고 있다.
상태관리란 시간이 흐름에 따라 상태가 변화하는 방식
useState
와 useReducer
는 상태관리의 좋은 예이다.
그와 비슷하게 Redux
와 MobX
또한 명확히 상태관리 라고 할 수 있다.
React-Query
, SWR
, Apollo
및 Urql
과 같은 서버 캐싱 도구들도 가져온 데이터를 기반으로 초기 값을 설정하고, hook을 통해 현재 값을 반환하며, ‘서버 변화'를 통한 업데이트가 가능하고, 컴포넌를 re-rendering 하는 것을 통해 변화를 알 수 있기 때문에 상태관리 라고 정의할 수 있다.
application의 특정 부분에서 그렇게 복잡하지 않은 리액트 컴포넌트의 상태 관리가 필요할 때
Redux는 아래와 같은 경우 유용하다
React-Redux 라이브러리는 Redux 에서 상태 값을 읽고 action 을 React 컴포넌트에게 전달하여 Redux 저장소와 상호 작용 할 수 있도록 도와주는 UI 바인딩 레이어
Context
Context
+ useReducer
Redux + React Redux
프로젝트 이후에 recoil을 짧게 사용해봤는데 'Redux에서 작성한 보일러 플레이트가 꽤 많았구나' 라고 느꼈다.
Continew
에서 계약서 폼을 작성할 때 Redux를 이용해 내부 상태를 관리했었는데 돌이켜보니 이 부분은 상태의 양이 많긴 했지만 가장 큰 목적은 props-drilling을 피하기 위해 Redux를 사용했었다. 그래서 Context + useReducer를 사용했어도 괜찮았을까...? 라고 생각해봤지만 컴포넌트가 복잡한 구조이고 많이 나누어져 있어서 re-rendering을 생각하면 Redux를 선택했던 것도 나쁘지 않았던 것 같다.
Perfumism
에서는 향수 filtering 할 때의 향조 상태 관리는 하위 컴포넌트가 무조건 re-rendering 되어야하고 복잡하지 않은 구조라 Context + useReducer를 써도 괜찮았겠다고 생각한다. 다만 Redux를 사용해서 코드가 좀 깔끔해보이는 면은 있다고 느꼈다.
참고자료
https://ko.redux.js.org/
https://ko.reactjs.org/docs/context.html
https://blog.isquaredsoftware.com/2021/01/context-redux-differences/
https://olaf-go.medium.com/context-api-vs-redux-e8a53df99b8