리액트의 데이터 흐름은 일방통행!

컴포넌트 간의 데이터 공유가 여간 까다로운 것이 아님

그래서 필요한 것이 리덕스!

(물론 리덕스가 리액트만을 위한 것은 아님이다...)
리덕스는 컴포넌트 외부에 있는 스토어를 통해 상태를 관리!

근데 상태를 아무렇게나 건들 수 있는 게 아님!

상태 변화가 필요할 때는 액션을 쏴준다!!

액션을 쏴주는 게 디스패치

액션이 날라오면 리듀서가 달라진 스테이트를 반환해줌

달라진 상태는 스토어에 잘 보관됨

리덕스의 세가지 원칙
Single source of truth

State is read-only

Changes are made with pure functions
