Redux๋ JavaScript ์ดํ๋ฆฌ์ผ์ด์
์์ data-state ์ UI-state ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ๋๊ตฌ
์ํ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ์๊ฐ์ด ํ๋ฆ์ ๋ฐ๋ผ ๋ณต์กํด์ง์๋ ์๋ ์ฑ๊ธ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์
(Single Page Application) ์์ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , Redux๋ React ์ธ์๋, jQuery ํน์ Angular ๋ฅผ ์ฌ์ฉํ๋ ์ดํ๋ฆฌ์ผ์ด์
์์๋ ์ฌ์ฉ ๋ ์ ์์ต๋๋ค.
React ์์ ๋ฐ์ดํฐํ๋ฆ์ ๋จ์ผ ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅธ๋ค
parent-child ๊ด๊ณ๋ฅผ ํตํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ต๋ฅํ๋ ๋ฐฉ๋ฒ์ ๋จ์ :
์ปดํฌ๋ํธ ๊ฐฏ์ ์ฆ๊ฐ์ ๊ฒฝ์ฐ ๋๋
์ปดํฌ๋ํธ๋ค์ ๊ด๊ณ๊ฐ parent-child ๊ด๊ณ ์๋ ๊ฒฝ์ฐ
==> ๋ณต์กํด์ง๋ค
๋นจ๊ฐ์์ด ํ๋์๊ณผ ์ด๋ก์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ค๋ฉด ๋ณต์กํด์ง๋ค.
ํด๊ฒฐ๋ฐฉ์์ ํ๋: MVC ๋์์ธ ํจํด ์ค FLUX ํจํด
MVC ํจํด์ Controller, Model, View ์ด 3๊ฐ์ง ๊ฐ๋
์ผ๋ก ์ด๋ค์ ธ์์ต๋๋ค. ์ด๋ ํ Action ์ด ์
๋ ฅ๋๋ฉด, Controller์ Model์ด ์ง๋๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์
๋ฐ์ดํธ ํ๋ฉฐ, ์ด ๋ณํ๋ View ์ ๋ฐ์๋๋ ๊ตฌ์กฐ์
๋๋ค. ๋ํ, View์์ Model์ ๋ฐ์ดํฐ์ ์ ๊ทผ ํ ์๋ ์์ต๋๋ค.
๋ฌดํ๋ฃจํ๊ฐ ๋ฐ์ํ ์๋,, ์ด๋์ ์๋ชป๋๊ฑด์ง ์ฐพ๊ธฐ๋ ํ๋ค๋ค
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ FLUX ๋ผ๋ ๋์์ธ ํจํด์ด ๋ง๋ค์ด์ก์ต๋๋ค.
์์คํ
์์ ์ด๋ ํ Action ์ ๋ฐ์์ ๋, Dispatcher๊ฐ ๋ฐ์ Action๋ค์ ํต์ ํ์ฌ Store์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณ๋๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด View ์ ๋ฆฌ๋ ๋๋งํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , View์์ Dispatcher๋ก Action์ ๋ณด๋ผ ์๋ ์์ฃ
Dispatcher์ ์์
์ด ์ค์ฒฉ๋์ง ์๋๋ก ํด์ค๋๋ค. ์ฆ, ์ด๋ค Action์ด Dispatcher๋ฅผ ํตํ์ฌ Store์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ์์
์ด ๋๋ ๋ ๊น์ง ๋ค๋ฅธ Action๋ค์ ๋๊ธฐ์ํต๋๋ค.
Redux๋, ์์์ ์ค๋ช
๋ Flux ์ํคํ
์ณ๋ฅผ ์ข ๋ ํธํ๊ฒ ์ฌ์ฉ ํ ์ ์๋๋ก ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ๋ค์๊ณผ๊ฐ์ด ํธํ๊ฒ ํ ์ ์๊ฒ๋ฉ๋๋ค.
์์ ๊ฐ์ด, store์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๊ณ , ์ปดํฌ๋ํธ๋ผ๋ฆฌ๋ ์ง์ ๊ต๋ฅํ์ง ์๊ณ store ์ค๊ฐ์๋ฅผ ํตํ์ฌ ๊ต๋ฅํฉ๋๋ค. ๋นจ๊ฐ ํ์ดํ๋ dispatch ๋ฅผ ์๋ฏธํ๋ฉฐ store์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋๊ฒ์ ๊ฐ๋ฅดํค๊ณ , ์ฃผํฉ์ ํ์ดํ๋ subscribe๋ฅผ ์๋ฏธํ๋ฉฐ, ํด๋น ์ปดํฌ๋ํธ์์ store์ ์๋ ํน์ ๋ฐ์ดํฐ์ ๋ณ๋์ ์ฃผ์ํ๊ณ ์๋ค๊ฐ ๋ณ๋์ด ์์์ ๋ฐ๋ก ๋ฐ์์ํค๋๊ฒ์ ๊ฐ๋ฅดํต๋๋ค.
Redux๋ ์ดํ๋ฆฌ์ผ์ด์
์ state๋ฅผ ์ํด ๋จ ํ๊ฐ์ store ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Flux ์์ ์ฃผ์ ์ฐจ์ด ์
๋๋ค. Flux ์์๋ ์ฌ๋ฌ๊ฐ์ store ๋ฅผ ์ฌ์ฉํฉ๋๋ค.)
์ดํ๋ฆฌ์ผ์ด์
์์ state๋ฅผ ์ง์ ๋ณ๊ฒฝ ํ ์๋ ์๋ค๋ ์๋ฏธ์
๋๋ค.
state ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋, action ์ด dispatch ๋์ด์ผ ํฉ๋๋ค.(dispatch ๋ โ๋ณด๋ธ๋คโ๋ ๋ป ์
๋๋ค)
action ์ ์ด๋ค ๋ณํ๊ฐ ์ผ์ด๋์ผ ํ ์ง ์๋ ค์ฃผ๋ ๊ฐ์ฒด
๋ฐ์์จ action ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ Reducer ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
action์ ์ด๋ค ๋ณํ๋ฅผ ์ผ์ด๋์ผ ํ ์ง ์๋ ค์ฃผ๋ ๊ฐ์ฒด๋ผ๋ฉด, Reducer ๋ ๊ทธ ์ ๋ณด๋ฅผ ๋ฐ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊ฟ์ง ์ ์ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
Reducer ๋ โ์์ ํจ์โ ๋ก๋ง ์์ฑ
Redux๋ ๋ ๊ฐ์ฒด(prevState,newState)์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๋น๊ตํ์ฌ ์ด์ ๊ฐ์ฒด๊ฐ ์ ๊ฐ์ฒด์ ๋์ผํ์ง ์ฌ๋ถ๋ฅผ ๋จ์ ์ฒดํฌํ๋ค(shallowCompare,===). ๋ง์ฝ ๋ฆฌ๋์ ๋ด๋ถ์์ ์ด์ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ฉด ์ ์ํ ์ ์ด์ ์ํ๊ฐ ๋ชจ๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ๋ฆฌ๋์ค๋ ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์๋ค๊ณ ํ๋จํ์ฌ ๋์ํ์ง ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฐ๋ ์์ฑ๋ง ๋น๊ตํ๋ฉด ๋์ง ์ ์ฃผ์๋ฅผ ๋น๊ตํ๋ ๊ฑธ๊น? ๋ผ๋ ์๋ฌธ์ด ์๊ธด๋ค. ๊ทธ ์ด์ ๋ ์ฑ๋ฅ๊ณผ ๋ณต์ก๋์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ด๋ค. ์์ ์์ ์๋ ๋ค๋ฅด๊ฒ ๋ฉ์น๊ฐ ํฐ ๊ฐ์ฒด๋ฅผ ๋น๊ตํด์ผ ๋๋ ์ํฉ์ด๋ฉด ๊ฐ์ฒด์ ์ฃผ์ ๋น๊ต๋ผ๋ฉด O(1) ๋งํผ ๋น๊ต๋ฅผ ํ๋ฉด ๋์ง๋ง, ์์ฑ์ ๋น๊ตํ๊ฒ ๋๋ค๋ฉด O(n)๋งํผ ๋น๊ต๋ฅผ ํด์ผ๋๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
react-redux๊ฐ ์ ๊ณตํ๋ ํจ์๋ ๋๋ถ๋ถ ์ฐ๊ฒฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
import React from "react";
import ReactDOM from "react-dom";
// Provider๋ react-redux ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์จ๋ค.
import { Provider } from "react-redux";
// createStore๋ redux์์ ๊ฐ์ ธ์จ๋ค.
import { createStore } from "redux";
import App from "./components/App";
import reducers from "./reducers";
ReactDOM.render(
// connect()ํจ์์ ํฌํจ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ redux store๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ์ํด,
// Provider๋ ์ต์์ ๋ ๋ฒจ์์ ๋ ๋๋ง ๋๋ค
// provider์ props๋ก store๊ฐ ์์ผ๋ฉฐ redux store๋ฅผ ํ ๋นํ๋ค.
<Provider store={createStore(reducers)}>
<App />
</Provider>,
document.querySelector("#root")
);
1. connect() ํจ์๋ฅผ 'react-redux' ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์จ๋ค.
2. 'export default connect()(์์์ปดํฌ๋ํธ)' ํํ๋ก ์ปดํฌ๋ํธ๋ฅผ connect()ํจ์๋ก ์ฐ๊ฒฐํ๋ค.
3. (connect()์ ์ฒซ๋ฒ์งธ ์ธ์๋ก mapStateToProps, ๋๋ฒ์งธ ์ธ์๋ก๋ reducer์ ์ ๋ฌํ action์ ๋ฃ๋๋ค.)
๋ณด๊ธฐ์ ์ด์ํ์ง๋ง,
function connect()()๋ ์ ํจํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ด๋ค.
function connect(){
return function(){
return '์๋
'
}
}
connect()() // '์๋
'
// ์ปดํฌ๋ํธ ์์ฑ ์ฝ๋์ ์ธ๋ถ์์ mapStateToProps ์ฌ์ฉ(store ์์ ๋ฐ์ดํฐ ๋ฐ์์ค๊ธฐ)
const mapStateToProps = (state) => {
return {
//๋ฐ์์ฌ๋ ์ธ state์ ์ด๋ฆ' : state.'reducer์์ ์ ํ ๋ฐ์ดํฐ ์ด๋ฆ'
needData : state.needData
}
}
import React, {Commponent} from 'react'
์ฌ๊ธฐ์, ์ React๋ {}๊ฐ ์๊ณ ์ Component ๋ถ๋ถ์ {}๊ฐ ์์๊น?
import React from 'react'
import { Component } from 'react'
/config.js
const a = 0;
const b = 1
export { a };
export const c = 2;
export default b;
import f, {a, c as two} from '/config';
console.log(f, a, two) // 1, 0, 2
export default๋ก ์ ์ธ๋ ๋ณ์๋ ์ค๊ดํธ {} ์์ด ๋ฐ์์ฌ ์ ์์ผ๋ฉฐ ๋ณ์๋ช ์ด ๋ฌ๋ผ๋ ๋๋ค
export default b = f = 1
๋จ์ง export๋ก ์ ์ธ๋ ๋ณ์๋ค์ ์ค๊ดํธ {}๋ก ๋ฐ์์์ผ ํ๊ณ , ๋ณ์๋ช ์ด ๋์ผํด์ผ ํ๋ค
๋ณ์๋ช ์ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ c as two ์ฒ๋ผ as๋ฅผ ์ด์ฉํด์ ๋ฐ๊ฟ ์ ์๋ค
์ถ์ฒ
https://velopert.com/1225
https://velopert.com/3401
https://velopert.com/3486
https://ideveloper2.tistory.com/159
https://velog.io/@velopert/Redux-3-%EB%A6%AC%EB%8D%95%EC%8A%A4%EB%A5%BC-%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%99%80-%ED%95%A8%EA%BB%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-nvjltahf5e
https://stackoverflow.com/questions/36084515/how-does-shallow-compare-work-in-react
https://velog.io/@mokyoungg/Redux-react-redux-react-redux
https://redux.js.org/faq/immutable-data#what-are-the-benefits-of-immutability