Redux는 가장 많이 사용되는 상태 관리 라이브러리이다.
리덕스를 사용하면 생성하게 될 컴포넌트들의 상태 관련 로직들을 다른 파일들로 분리시켜서 더욱 효율적으로 관리할 수 있으며 글로벌 상태 관리도 손쉽게 할 수 있는 장점이 있다.
Redux는 기존에 있던 데이터 흐름을 관리하는 방식인 MVC 패턴이 아닌, Flux 디자인 패턴 구조를 가지고 있다. MVC와 Flux는 어떤 차이점을 가지고 있을까?
우선 MVC에 대해서 먼저 알아보자.
Model-View-Controller의 약자이며, 웹사이트를 개발할 때 3가지 형태로 역할을 나누어 개발하는 소프트웨어 디자인 패턴이다.
작동되는 흐름은 아래와 같다.
이 MVC 패턴의 큰 특징 중 하나는 '양방향 데이터 흐름' 이다. 모델이 변경되면 뷰 또한 변하고, 뷰에서 변경이 일어나면, 모델 또한 변한다.
이런 양방향 데이터 흐름은 설계가 쉽고 간단하게 코드를 작성할 수 있는 장점이 있다. 다만, 어플리케이션의 규모가 커지면 데이터 흐름 파악이 힘들어지게 되고, 디버깅이 어려워져서 많은 시간이 소비된다.
이러한 MVC 디자인 패턴의 단점을 보안하기 위해 Facebook에서 개발한 새로운 디자인 패턴이 Flux이다.
Facebook에서 MVC 디자인 패턴의 단점을 보안하기 위해 개발한 웹 어플리케이션을 위한 디자인 패턴이다. 단방향 데이터 흐름이라는 특징을 가지고 있다.
작동되는 흐름은 다음과 같다.
위와 같은 과정으로 데이터들이 단방향으로 흐르게 된다. 따라서 데이터 변화를 MVC 패턴보다 훨씬 예측하기 쉽게 개발을 진행할 수 있다.
컴포넌트가 적은 프로젝트라면, 부모 컴포넌트에 있는 state를 한두 번에 걸쳐 사용할 수 있다. 그러나, 컴포넌트가 많은 프로젝트라면 부모 컴포넌트로부터 state를 받아오기까지 많은 컴포넌트를 거쳐 state를 받아와야해서 상태 관리의 복잡성이 커지게 된다. Redux를 사용하면 이 문제를 해결할 수 있다.
Redux를 사용하여 특정한 공간에 state를 저장하면, 다이렉트로 데이터들을 받아올 수 있다.
{ //예시 코드
type: "ORDER",
drink: {menu: "Americano", size:"Grande", iced: false
}
}
액션 객체는 type을 필수적으로 가지고 있어야 하며, 그 외의 값들은 개발자 마음대로 가능하다.
Single source of truth
동일한 데이터는 항상 같은 곳에서 데이터를 가지고 온다.
데이터를 저장하는 하나뿐인 스토어가 있다.
State is read-only
기존에는 setState를 사용하여 state 값을 변경해줬었다.
Redux에서는 Action이라는 함수를 이용하여 state 값을 변경해준다.
Changes are made with pure functions
변경은 순수 함수로만 가능하다.
리덕스는 전역 상태를 관리할 때 굉장히 효과적이다. 물론 리덕스를 사용하는 것만이 유일한 해결책은 아니다. 리액트에서 제공하는 Context API를 사용하여도 전역 상태 관리를 할 수 있다. 다만 리덕스는 아래와 같은 장점들을 가지고 있다.
리덕스에는 미들웨어라는 개념이 존재한다. 미들웨어를 사용하면 액션 객체가 리듀서에서 처리되기 전에 우리가 원하는 작업들을 수행할 수 있다.
미들웨어는 주로 비동기 작업을 처리할 때 많이 사용된다.
useSelector, useDispatch, useStore와 같은 hooks들을 사용하여 손쉽게 상태를 조회하거나 액션을 디스패치 할 수 있는 장점이 있다.
Context API를 사용해서 글로벌 상태를 관리할 때는 기능별로 context를 만들어서 사용하는 것이 일반적이다. 반면 리덕스에서는 모든 글로벌 상태를 하나의 상태 객체에 넣어서 사용하기 때문에 여러 context를 생성하는 수고로움을 덜 수 있다.
벨로퍼트와 함께하는 모던 리액트
A cartoon guide to Flux
MVC design pattern