본문 바로가기

Libraries/Redux

[Redux] Redux의 개념, 탄생 배경, 3가지 원칙, Context Api와의 비교

728x90

 

 

Redux에 대해서 알아보자!

 

 


 

 

 1. Redux란? 

 

Redux는 2015년, JavaScript 개발자인 Dan Abramov와 Andrew Clark에 의해 탄생한 상태 관리 라이브러리이다. 이 도구는 애플리케이션의 상태를 예측 가능하고 일관성 있게 관리하기 위해 만들어졌다.

 

 


 

 

 2. Redux의 탄생 배경 

 

 1) 복잡한 상태 관리하기 위해 

 

단일 페이지 애플리케이션(SPA)의 인기가 높아지면서, 컴포넌트 간 상태를 효율적으로 공유하고 관리하는 것이 점점 더 어려워졌다. 특히 React를 사용하는 프로젝트에서 상태를 props를 통해 자식 컴포넌트로 전달하거나, 서로 다른 컴포넌트 간 상태를 동기화하는 과정이 번거롭고 비효율적이라는 문제가 있었다.

 

 

 2) Flux 아키텍처의 한계를 극복하기 위해 

 

Redux는 이러한 Flux의 단방향 데이터 흐름 패턴을 기반으로 만들어진 라이브러리로, Flux 아키텍처를 더 쉽게 구현하고 활용할 수 있도록 설계되었다. Flux가 여러 Store를 관리해야 하는 복잡성과 Boilerplate 코드의 증가 같은 불편함을 가졌다면, Redux는 단일 Store와 간결한 API를 통해 이를 개선하며, Flux 아키텍처의 철학을 유지하면서도 실제 프로젝트에 더 적합한 방식으로 발전시킨 것이다.

 

 

 3) Time Travel Debugging을 위해 

 

Dan Abramov는 "시간을 되돌릴 수 있는 디버깅 도구"를 만들고 싶어 했다. 그는 React Europe 2015 컨퍼런스에서 Redux를 처음 발표하며 Time Travel Debugging이라는 혁신적인 기능을 시연했다. 이 기능은 상태 변화 과정을 기록하여 디버깅을 더욱 직관적으로 만들어 준다.

 

 


 

 

 2. Redux 의 3가지 원칙 

 

Redux는 다음 세 가지 원칙을 바탕으로 설계되었다.

 

 1) 단일 진실의 원천 (Single Source of Truth) 

- 진실이라고 여겨지는 값이 여러곳이 아닌 단 한곳에만 존재해야한다.
- 애플리케이션의 모든 상태는 Redux Store라는 단 하나의 장소에만 저장되어야 하는데, 이 Redux Store가 바로 Single Source of Truth이다.
- 상태가 단일 Store에 집중되면, 상태의 출처가 명확해지고 디버깅이나 상태 추적이 용이해지고, 일관성과 예측가능성이 생긴다.

 

 2) 상태는 읽기 전용 (State is Read-Only) 

- 사전에 정의해둔(정해진) 어떤 상황이 발생했을 경우에, 사전에 정해진 대로만 (정해진 규칙에 따라서) 상태를 변경할 수 있다.
- 즉, 상태는 직접 변경할 수 없으며, 상태를 변경하려면 반드시 Action을 통해야 한다.

- 이 원칙은 상태 변경 과정을 투명하게 만들어, 상태의 흐름을 더 잘 이해할 수 있도록 한다.

 

 

 3) 변화는 순수 함수로 정의 (Changes are Made with Pure Functions) 

- 상태 변경은 순수 함수인 Reducer에 의해 정의된다.
- 순수함수란, 입력값(input)을 변경하지 않으며, 같은 입력 값에 대해서는 항상 같은 출력값(output)만 리턴한다는 것이다.

- pure function으로 작동한다는 것은, 입력으로 받은 이전 상태를 직접 변경하는 대신, 새로운 상태 객체를 만들어 반환한다는 것이다.
- Redux에서 상태는 불변성(immutability)을 유지해야 한다. 즉, Redux State는 생성된 이후 값을 변경할 수 없으며, 상태를 업데이트할 때는 기존 상태를 변경하지 않고 새로운 상태 객체를 만들어야 한다.

- Redux Toolkit은 불변성을 지키기 위해 immer.js를 사용한다.

 

 


 

 

 

 

 3. Redux vs Context api의 공통점

 

 1) 상태 관리 도구 

 

- Redux와 Context API 모두 애플리케이션 전역에서 공유해야 하는 상태를 관리하는 데 사용된다.
- 부모-자식 간 props를 여러 단계로 전달하는 "prop drilling" 문제를 해결할 수 있다.

 

 2) React와 통합 

 

- 둘 다 React에 최적화되어 있으며, React의 생태계에서 사용됩니다.
- React 컴포넌트 트리 전체에 상태를 제공할 수 있는 Provider 패턴을 사용한다.

 

 


 

 

 4. Redux와 Context API의 차이점 

 

 

 1) 디버깅 및 개발 도구 

 

Redux 

- Redux DevTools를 사용할 수 있다.
- Redux DevTools는 상태 변화 기록 및 액션 히스토리를 시각적으로 확인할 수 있도록 지원한다.
- 이전 상태로 돌아가거나, 하나씩 액션을 실행하면서 상태 변경 과정을 디버깅할 수 있다.

 

Context API 

- 별도의 개발 도구는 제공되지 않는다.
- 상태 변화 과정을 추적하거나 디버깅하려면 개발자가 직접 로그를 추가하거나, React Developer Tools로 추적해야 한다.

 

 

 2) 컴포넌트 범위 및 사이드 이펙트 관리 

 

Redux 

- 모든 애플리케이션 상태가 단일 Redux Store에서 관리되며, 전역적으로 상태를 공유할 수 있다.
- 상태는 구독하고 있는 컴포넌트만 영향을 받으므로, 불필요한 리렌더링이 발생하지 않는다.

 

Context API

- 여러 Context를 만들어, 특정 Context와 관련된 컴포넌트들을 묶어 분리할 수 있다.
- 이렇게 분리하면, 관련 없는 컴포넌트는 Context 데이터에 접근할 수 없으므로 사이드 이펙트를 방지할 수 있다.
- 하지만 Context의 상태가 변경되면 해당 Context를 사용하는 모든 컴포넌트가 리렌더링된다.

 

 

 3) 데이터 관리 방식 

 

Redux 

- 전체 애플리케이션의 상태를 Redux Store라는 단일 객체로 중앙 집중 관리한다.
- 상태 변경은 반드시 사전에 정의된 Action과 Reducer를 통해 이루어지며, 상태 변경 과정이 명확하고 예측 가능하다.

 

Context API

- Context는 데이터를 관리하지 않고, 데이터를 전달하기 위한 통로 역할만 한다.
- Context를 통해 상태를 전달하려면, 상태는 상위 컴포넌트에서 관리되며, 상위 컴포넌트의 상태 변경이 Context를 통해 하위 컴포넌트에 전달된다.
- 즉, 상태 관리는 Context가 아닌 상위 컴포넌트의 책임이다.

 

 

 요약 정리 

 

특징 Redux Context API
디버깅 도구 Redux DevTools로 상태 변화와 디버깅 지원 별도의 디버깅 도구 없음
컴포넌트 범위 관리 전역 상태 관리에 적합, 구독된 컴포넌트만 리렌더링 Context 분리를 통해 관련 없는 컴포넌트에 데이터 접근 차단 가능, 하지만 상태 변경 시 전체 리렌더링 발생
데이터 관리 방식 단일 Store에서 상태를 중앙 집중 관리, Action과 Reducer로 상태 변경 데이터를 전달하는 통로 역할, 상태 관리는 상위 컴포넌트에 의존

 

 


 

 

 4.  어떤걸 사용해야할까? 

 

✅ 규모가 크고 관리해야 할 상태가 많다 ➡️ Redux

중앙 집중식 상태 관리와 예측 가능한 상태 변경 로직이 필요한 대규모 애플리케이션에서 효과적이다.

 

규모가 작고 관리해야 할 상태가 적다 ➡️ Context API

간단한 데이터 전달이나 소규모 상태 공유에 유리하며, 설정이 간단하다.

 

 

 

 

728x90

'Libraries > Redux' 카테고리의 다른 글

[Redux] Redux와 React를 연동하기  (1) 2025.01.18
[Redux] Reducer  (0) 2025.01.12
[Redux] Action  (0) 2025.01.12
[Redux] Dispatch  (0) 2025.01.01
[Redux] Store  (0) 2025.01.01