Model
View
Controller
[MVC 패턴 단점]
➡ Redux는 Flux 패턴을 근본으로한 라이브러리이다.
앱에서 전체적으로 사용할 데이터 관리가 필요
하나의 state(데이터)를 여러 컴포넌트에서 필요한 경우가 있다.
페이지의 레이아웃에 영향 받지 않는 modal, toast, alert
같은 전역 UI 컴포넌트의 상태 관리도 필요하다.
store
: Application 전체 state는 store에서 관리된다.
➡ store는 redux의 상태값(state)를 갖는 객체다
action
: action은 state 변화를 일으킬 수 있는 행동 정보
dispatcher
: action이 일어나면 Dispatcher를 통해서 store의 state가 업데이트 된다.
view
: state가 변경되면 view에서 감지하고, 화면에 반영(rerender)된다.
전체 상태값이 하나의 객체로 표현된다.
➡ store는 하나다!
상태값(state)은 읽기 전용이다.
➡ useState처럼 state값을 직접 바꾸는게 아니고, setState 함수를 사용해서 변경한다.
상태값(state)은 순수 함수에 의해서만 변경되어야 한다.
➡ 상태값을 변경시키려면 상태값을 변경하는 함수가 필요하다. (➡ 이 함수가 reducer!)
reducer는 항상 같은 input은 같은 output을 반환하는 순수함수여야 한다.
사용자의 입력이나 UI 조작, 웹 요청 완료같이 어떠한 상태 변화를 일으킬 수 있는 현상.
즉, 어떤 조작인지 정보를 갖고 있는 자바스크립트 객체이다.
{
type: 'SHOW_MODAL'
}
function showModal({ title }) {
return { type: 'SHOW_MODAL', title }
}
showModal({ title: '로그인' });
reducer는 action이 발생했을 때, state를 변화시키기 위한 함수다.
reducer는 현재의 state와 action을 인자로 받고,
이 action의 내용(type)에 따라 state를 변화시킨다.
function modal(state, action) {
switch(action.type) {
case 'SHOW_MODAL':
return {
...state,
showModal: true
};
case 'CLOSE_MODAL':
return {
...state,
showModal: false
};
default:
return state;
}
}
store는 앱에 오직 하나만 있고, 이 유일한 store를 사용하여 app의 전체 상태를 관리 한다.
import { createStore } from 'redux'
import modalReducer from './ModalReducer';
const store = createStore(modalReducer);