์๋ ํ์ธ์, ์ ๋ ์บ๋ฒ์ค ์์ญ์ด์๋ ํ๋ก์ ํธ๊ฐ ์์ผ๋ฉฐ 3 ๊ฐ์ ์ ์ ๋ ์ด์์ ์ค ํ๋์์ ๊ทธ๋ํ (์ : ๋ ธ๋ + ๊ฐ์ฅ์๋ฆฌ)๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๋ค๋ฅธ ๊ตฌ์ฑ ์์ (์๋จ ํ์ ๋ชจ์ ์ผ ์ ์์)์์ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์บ๋ฒ์ค๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ ํด๋น ๋ ธ๋์ ๊ฐ์ฅ์๋ฆฌ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๊ณ ์ด๋ํ์ฌ 3 ๊ฐ ์ค ๋ค๋ฅธ ๋ ์ด์์์ผ๋ก ๋ณ๊ฒฝํด์ผํฉ๋๋ค.
๊ทธ๋์ ๋ด ๋ฌธ์ ๋ :์ด ์๋๋ฆฌ์ค์์ ์ํฉ์ ๊ทธ๋ฆฌ๋ ์์
์ด๊ธฐ ๋๋ฌธ์ ์ํ๊ฐ ์บ๋ฒ์ค๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ๋๋ฌด ์ ์ฉํ์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์บ๋ฒ์ค์๋ ์ฌ์ ํ ๋ ์ด์์ ๋งค๊ฐ ๋ณ์ ์ธ "์ํ"๊ฐ ์์ง๋ง state.layout
๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๊ฐ HTML ์บ๋ฒ์ค ์์๋ฅผ ์๋ก ๊ณ ์น์ง ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ปจํ
์คํธ (์บ๋ฒ์ค๊ฐ ์๋ HTML ์์๋ฅผ ๋ค์ ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒํ๋ฉด ์ ๋๋ฉ์ด์
์ด ์์ค๋ฉ๋๋ค). ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ํ์ํ ๊ฒ์ Actions๋ฅผ ํตํ ๊ตฌ์ฑ ์์ ๊ฐ์ ๋์คํจ์น๋ฟ์
๋๋ค.
๊ทธ๋ฌ๋ Flux (Redux์ ๋์ผ)์์๋ UI ์ฌ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ๋๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํ ๊ฒ์ผ๋ก ์์๋๋ฉฐ UI๋ ์ํ ์์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋กํฉ๋๋ค. ์บ๋ฒ์ค์์ ์ก์ ์ ์ฌ์ ํ โโ์ํ ๋ณ๊ฒฝ์ ํธ๋ฆฌ๊ฑฐ ํ ๊ฒ์ผ๋ก ์์๋์ง๋ง UI (์บ๋ฒ์ค)๋ ๋ค์ ๊ทธ๋ ค์ ๋ ๋๋ง๋ฉ๋๋ค.
๋ด ํ๋ก์ ํธ์ ์ ๋ฐ ๋ง ์บ๋ฒ์ค๋ฅผ ์ฌ์ฉํ๊ณ React์ ์ํด ์์ํ๊ฒ ๋ ๋๋ง๋๋ ๋ง์ ๊ตฌ์ฑ ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฌป์ต๋๋ค (์, React๋ฅผ ์ฌ์ฉํ์ง๋ง Flux ํจํด์ ์ฌ์ฉํ์ง ์์ต๋๋ค). ๋๋ Flux๊ฐ ์ ์๊ฐ์ ์ฝ๊ฐ "๊ณผ๋ํ๊ฒ ์ค๊ณ ๋์๊ธฐ"๋๋ฌธ์ ์ซ์ดํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์์ด Redux๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.์ด Redux๋ Flux์์ ์ซ์ดํ๋ ๋ถ๋ถ์ ์ค์ฌ์ค๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ์ด ์บ๋ฒ์ค ๋ฌธ์ ๊ฐ ์์ต๋๋ค .Redux๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ช ํ ์ง ํ์คํ์ง ์์ต๋๋ค.
๋์์ด ๋ ๋งํ ๋ช ๊ฐ์ง ํ์ด๋ ๊ฐ๋จํ ์ฝ๋๋ฅผ ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ์์์ ์ธ๊ธ ํ ํ๋ก์ ํธ์์ Redux๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ์ง ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ ์๊ฒ๋ ์๋ ค์ฃผ์ญ์์ค.
์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
์ถ์ : YouTube์์ ๋น๋์ค๋ฅผ ๋ดค์ต๋๋ค (๋ฐ์ ํซ ๋ก๋ + Redux ์ฐ์ค๊ณผ ๊ด๋ จํ์ฌ). ํ๋ฅญํ.
๋ด๊ฐ ๋น์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ์ต๊ทผ์ D3๋ฅผ React์ ํตํฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์
๋๋ค. ์ด๊ธฐ <svg>
ํ๊ทธ๋ฅผ ์์ฑํ๊ณ ์ํ๋ฅผ ๋ ๋๋ง ํ ๋ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด d3 ์ ๋๋ฉ์ด์
์ ์์ํ๊ณ ์ ์์๋ฅผ ์ถ๊ฐํ๊ณ ์์๋ฅผ ์ ๊ฑฐํ๋ ๋ฑ์ ์์
์ด ํ์ํ์ต๋๋ค.
์ด StackOverflow ๊ธฐ์ฌ ๋ React๊ฐ <svg>
์์๋ฅผ ์ฒ์์ผ๋ก ๋ ๋๋งํ๋๋กํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค๋ช
์ ์ ๊ณตํฉ๋๋ค (๋๋ ๊ทํ์ ๊ฒฝ์ฐ <canvas>
). ์ํ๊ฐ ๋ณ๊ฒฝ ๋ ๋ ๋ค์ ๊ทธ๋ฆด ์์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ค์์ ๊ธฐ์ฌ์ ์ฝ๋์ ๋๋ค.
React.createClass({
render: function() {
return <svg></svg>;
},
componentDidMount: function() {
d3.select(this.getDOMNode())
.call(chart(this.props));
},
shouldComponentUpdate: function(props) {
d3.select(this.getDOMNode())
.call(chart(props));
return false;
}
});
์ฃผ๋ชฉํด์ผ ํ ์ค์ํ ์ ์ shouldComponentUpdate()
ํญ์ false
๋ฐํํ๋ฏ๋ก React๋ ์ด๊ธฐ ๋ ๋๋ง ํ์ DOM์ ํด๋น ๋ถ๋ถ์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค.
d3 ํธ์ถ์ ๋ ๋๋ง ์ฝ๋ ํธ์ถ๋ก ๋์ฒด ํ ์ ์์ด์ผํฉ๋๋ค.
@mindjuice ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ํ์คํ ๋๋ฅผ ๋์์ต๋๋ค. ๋ง๋ถ์ฌ์ ์ ๋์ด ์ง๋ฌธ์ ์ ์ ์ธ rui-infotrack์ ๋๋ค. ์ด์ ์ ํ์ฌ ๊ณ์ ์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ ...
๋ง๊ฐํ๊ฒ ์ต๋๋ค. ํ์ํ Redux์ ๋ํ ์ถ๊ฐ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ด๊ฐ ๋น์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ์ต๊ทผ์ D3๋ฅผ React์ ํตํฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ์ด๊ธฐ
<svg>
ํ๊ทธ๋ฅผ ์์ฑํ๊ณ ์ํ๋ฅผ ๋ ๋๋ง ํ ๋ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด d3 ์ ๋๋ฉ์ด์ ์ ์์ํ๊ณ ์ ์์๋ฅผ ์ถ๊ฐํ๊ณ ์์๋ฅผ ์ ๊ฑฐํ๋ ๋ฑ์ ์์ ์ด ํ์ํ์ต๋๋ค.์ด StackOverflow ๊ธฐ์ฌ ๋ React๊ฐ
<svg>
์์๋ฅผ ์ฒ์์ผ๋ก ๋ ๋๋งํ๋๋กํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค๋ช ์ ์ ๊ณตํฉ๋๋ค (๋๋ ๊ทํ์ ๊ฒฝ์ฐ<canvas>
). ์ํ๊ฐ ๋ณ๊ฒฝ ๋ ๋ ๋ค์ ๊ทธ๋ฆด ์์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.๋ค์์ ๊ธฐ์ฌ์ ์ฝ๋์ ๋๋ค.
์ฃผ๋ชฉํด์ผ ํ ์ค์ํ ์ ์
shouldComponentUpdate()
ํญ์false
๋ฐํํ๋ฏ๋ก React๋ ์ด๊ธฐ ๋ ๋๋ง ํ์ DOM์ ํด๋น ๋ถ๋ถ์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค.d3 ํธ์ถ์ ๋ ๋๋ง ์ฝ๋ ํธ์ถ๋ก ๋์ฒด ํ ์ ์์ด์ผํฉ๋๋ค.