자바스크립트앱에서 예측가능한 상태관리를 해주는 컨테이너
-> 자식 컴포넌트끼리 상태를 공유하기 위해서는 부모 컴포넌트를 거쳐야하는데 자식이 많아진다면 부모 컴포넌트를 거치는 과정이 매우 복잡해집니다. 이런 복잡성을 줄이기 위해 Redux를 사용합니다.
store: 상태가 관리되는 오직 하나의 공간을 말합니다.
action: 자바스크립트 객체형태로 스토어에게 데이터를 운반해주는 역할을 한다. action은 action creator 내부에 함수형태로 리턴값을 객체로 받는다.
reducer: action을 통해서 스토어에 데이터를 운반하기 위해서는 거쳐야하는 기능이다.
*사이클: action creator > action > dispatch > reducer > state
액션객체가 디스패치 메소드에 전달이 되고, 디스패치가 리듀서를 호출해서 새로운 스테이트값을 만들어낸다.
(출처: 코드스테이츠)
Presentational Component: 어떻게 보여지는지에 초점을 맞춘 컴포넌트입니다. props를 사용하여 데이터와 함수를 가져와 dom에 관련된 코드를 작성하는 함수라고 생각합니다.
Container Component: 어떻게 동작하는지에 초점을 맞춘 컴포넌트입니다. redux를 사용하여 state를 변경하는 경우가 이에 해당한다고 생각하면 될 것 같습니다.
코드스테이츠에서 진행하는 스프린트는 아무래도 부분적으로 테스트만 통과하면 되기때문에 상대적으로 이해되는 정도가 떨어졌습니다. 그런데 마침 스프린트 점검 시간에 간단한 redux를 처음부터 짜보는 예시를 보여주셔서 직접 짜면서 과정을 처음부터 이해하려 해보았습니다.
//1. 스토어 생성을 위해 제일 먼저 작성해줍니다.
const { createStore } = require('redux')
//2. 초기 state를 정의합니다.
const initState = {
name: '김개발',
post: []
}
//action
//3. action creator 함수 작성. 리턴 값은 객체로 작성해줍니다.
const changeUsername = (data) => {
return {
type: 'CHANGE_NAME',
data
}
}
const addPost = (post) => {
return {
type: 'ADD_POST',
post
}
}
//4. reducer
//action 의 타입에 따라서 새로운 state를 생성해내는 순수 함수
const reducer = (prevState, action) => {
switch(action.type){
case 'CHANGE_NAME':
return {
...prevState,
name: action.data
}
case 'ADD_POST':
return {
...prevState,
post: [...prevState.post, action.post]
}
default:
return prevState
}
}
//5. store를 선언해줍니다. createStore에는 첫 번째 인자로 reducer, 두 번째 인자로initState, 초기값이 들어갑니다.
const store = createStore(reducer, initState)
//6. dispatch 작성. store에서 정보를 가져와 action 객체를 dispatch로 실행하면 리듀서에서 상태를 바꾸어 줍니다.
store.dispatch(changeUsername('이름변경'))
store.dispatch(addPost('post 1'))
//store.getState()로 상태변화를 파악할 수 있습니다.
console.log(store.getState())
redux-thunk는 redux에서 동기적으로 실행되는 dispatch를 활용하여 비동기적으로 보이게 만들어줍니다. 액션 생산자 안에서 dispatch를 실행하고 setTimeout를 활용하여 함수를 dispatch로 실행시켜 준다면 비동기 액션이 발생하게 만들 수 있습니다. 중요한 것은 비동기 액션은 상태 변경이 일어나는 동기 액션으로 구분지어 생각해야 한다는 점입니다.
const example = () => {
dispatch(func());
setTimeout(() => {
dispatch(anotherFunc())
}, time)
}
위와 같이 func()를 실행하고 time 시간뒤에 anotherFunc()가 실행되는 비동기적 액션을 구현할 수 있는데 이것이 redux-thunk입니다.
정신없이 블로깅을 하고 있는데 정리가 잘 되는지 모르겠습니다. 주말을 이용해서 직접 코드를 작성해가면서 익숙해지도록 해야겠습니다.