Redux: ๊ทธ๋ž˜์„œ html5 canvas๋กœ redux ๊ฑฐ๋ž˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2015๋…„ 07์›” 21์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: reduxjs/redux

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์บ”๋ฒ„์Šค ์˜์—ญ์ด์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ 3 ๊ฐœ์˜ ์ •์  ๋ ˆ์ด์•„์›ƒ ์ค‘ ํ•˜๋‚˜์—์„œ ๊ทธ๋ž˜ํ”„ (์˜ˆ : ๋…ธ๋“œ + ๊ฐ€์žฅ์ž๋ฆฌ)๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ (์ƒ๋‹จ ํƒ์ƒ‰ ๋ชจ์Œ ์ผ ์ˆ˜ ์žˆ์Œ)์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์บ”๋ฒ„์Šค๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ ํ•ด๋‹น ๋…ธ๋“œ์™€ ๊ฐ€์žฅ์ž๋ฆฌ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๊ณ  ์ด๋™ํ•˜์—ฌ 3 ๊ฐœ ์ค‘ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด ๋ฌธ์ œ๋Š” :์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ƒํ™ฉ์„ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๊ฐ€ ์บ”๋ฒ„์Šค๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ์œ ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์บ”๋ฒ„์Šค์—๋Š” ์—ฌ์ „ํžˆ ๋ ˆ์ด์•„์›ƒ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ธ "์ƒํƒœ"๊ฐ€ ์žˆ์ง€๋งŒ state.layout ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๊ฐ€ HTML ์บ”๋ฒ„์Šค ์š”์†Œ๋ฅผ ์ƒˆ๋กœ ๊ณ ์น˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ (์บ”๋ฒ„์Šค๊ฐ€ ์•„๋‹Œ HTML ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ ๊ฒƒ์€ Actions๋ฅผ ํ†ตํ•œ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ๋””์ŠคํŒจ์น˜๋ฟ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Flux (Redux์™€ ๋™์ผ)์—์„œ๋Š” UI ์žฌ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋„๋ก ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฉฐ UI๋Š” ์ƒํƒœ ์ž์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค. ์บ”๋ฒ„์Šค์—์„œ ์•ก์…˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ƒํƒœ ๋ณ€๊ฒฝ์„ ํŠธ๋ฆฌ๊ฑฐ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€๋งŒ UI (์บ”๋ฒ„์Šค)๋Š” ๋‹ค์‹œ ๊ทธ๋ ค์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์ ˆ๋ฐ˜ ๋งŒ ์บ”๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  React์— ์˜ํ•ด ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š” ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฌป์Šต๋‹ˆ๋‹ค (์˜ˆ, React๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ Flux ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” Flux๊ฐ€ ์ œ ์ƒ๊ฐ์— ์•ฝ๊ฐ„ "๊ณผ๋„ํ•˜๊ฒŒ ์„ค๊ณ„ ๋˜์—ˆ๊ธฐ"๋•Œ๋ฌธ์— ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ์ด Redux๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.์ด Redux๋Š” Flux์—์„œ ์‹ซ์–ดํ•˜๋Š” ๋ถ€๋ถ„์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ์ด ์บ”๋ฒ„์Šค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค .Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•œ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋ ๋งŒํ•œ ๋ช‡ ๊ฐ€์ง€ ํŒ์ด๋‚˜ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ €์—๊ฒŒ๋„ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ถ”์‹  : YouTube์—์„œ ๋น„๋””์˜ค๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค (๋ฐ˜์‘ ํ•ซ ๋กœ๋” + Redux ์—ฐ์„ค๊ณผ ๊ด€๋ จํ•˜์—ฌ). ํ›Œ๋ฅญํ•œ.

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ตœ๊ทผ์— 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 ํ˜ธ์ถœ์„ ๋ Œ๋”๋ง ์ฝ”๋“œ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ตœ๊ทผ์— 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์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰