Immutable(1) - MoonGyeongHyeon/React_Study GitHub Wiki
React - Immutable.js(1)
๋ถ๋ณ ๊ฐ์ฒด
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์ด์ ๋ถ๋ณ ๊ฐ์ฒด๋ ์์ฑ ํ ๊ทธ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. ๋ถ๋ณ ๊ฐ์ฒด์ ๋ฐ๋๋ง์ ๊ฐ๋ณ ๊ฐ์ฒด๋ก Javascript์ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ๊ฐ์ฒด ๋ด์์ ๊ด๋ฆฌํ๋ ๊ฐ์ด๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ ๋งํ๋ค.
var greeting = new String('Hello World!!');
greeting.replace('World', 'Gil-dong');
greeting.valueOf(); // Hello World!!
์์ ์์์ greeting ๋ณ์์ ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ด ๊ฐ์ฒด์ replace ๋ฉ์๋๋ฅผ ํตํด 'World'๋ฅผ 'Gil-dong'์ผ๋ก ๋ณ๊ฒฝํ๋ค. ํ์ง๋ง ์ฌ์ ํ greeting ๋ณ์๋ 'Hello World!!'์ด๋ค.
greeting ๋ณ์์ ์์ฑํ ๋ฌธ์์ด ๊ฐ์ฒด๋ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ฏ๋ก ๊ฐ์ ๋ฐ๊ฟ์ ์๋ค. ๋ฐ๋ผ์ replace ๋ฉ์๋๋ ์๋ก์ด ์ํ๋ฅผ ๊ฐ์ง๋ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค ๋ฐํํ๋ค. ๋ณ์์ ๊ฐ์ ๋ฐ๊พธ๊ธฐ ์ํด์ ์๋์ฒ๋ผ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ณ์์ ๋์ ํด์ผ ํ๋ค.
var greeting = new String('Hello World!!');
greeting = greeting.replace('World', 'Gil-dong');
greeting.valueOf(); // Hello Gil-dong!!
๊ฐ ๊ฐ์ฒด
์ด๋ฌํ ๋ถ๋ณ ๊ฐ์ฒด์ ํน์ฑ์ number
, string
, boolean
์์ ์ฐพ์๋ณผ ์ ์๋ค. ๊ฐ ๊ฐ์ฒด๋ ๋น๊ต ์ฐ์ฐ ์ ์์ ์ ์ํ๋ณด๋ค ๊ฐ์ ์ฐ์ ์ํ๋ ๋จ์ํ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
React์์ ๋ถ๋ณ์ฑ?
React ์ปดํฌ๋ํธ์์๋ state
๋ ์์ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ์ props
๊ฐ์ด ๋ณํ ๋ ๋ฆฌ๋ ๋๋ง์ ํด์ผํ๋๋ฐ ๋ง์ฝ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์ ์ผ๋ก ์์ ํ๋ค๋ฉด, ๋ด๋ถ์ ๊ฐ์ด ์์ ๋์์ง๋ผ๋ ๋ ํผ๋ฐ์ค๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋๊ฐ๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ ๊ฐ์ผ๋ก ์ธ์ํ์ฌ ๋ฆฌ๋ ๋๋ง์ ํ์ง ์๋๋ค.
์ด๋ฌํ ํน์ง๋๋ฌธ์ ๊ฐ๋จํ ์์ ์ ํ๋๋ผ๋ ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์๋ค. ์๋์ ์ฝ๋๋ฅผ ๋ณด์.
let object1 = {
a: 1,
b: 2,
c: 3,
d: {
e: 4,
f: {
g: 5,
h: 6
}
}
};
// h๊ฐ์ 10์ผ๋ก ์
๋ฐ์ดํธํจ
let object2 = {
...object1,
d: {
...object1.d,
f: {
...object1.d.f,
h: 10
}
}
}
๋ง์ฝ ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ์ ์งํ ํ์๊ฐ ์์๋ค๋ฉด object1.d.f.h = 10;
์ผ๋ก ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์์์ ๊ฒ์ด๋ค.
๋ฐฐ์ด์ ๊ฒฝ์ฐ๋, ๋ฐฐ์ด ์์ ์๋ ๊ฐ์ ์์ ํ๋ ค๋ฉด ์์ ํ๋ ค๋ ์์ ์์น์ ์/๋ค๋ก slice
ํด์ ๊ฐ์ ธ์์ผ ํ๋๋ฐ, ์ฌ๊ฐ ๊ท์ฐฎ์ ์ผ์ด ์๋๋ค.
์ด๋ฅผ ์ํด...
Immutable.js๋ ์์ ๊ฐ์ ๋ถ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ํด ๋ฑ์ฅํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ฝ๋๋ฅผ ๋ณด๋ฉด,
let object1 = Map({
a: 1,
b: 2,
c: 3,
d: Map({
e: 4,
f: Map({
g: 5,
h: 6
})
})
});
let object2 = object1.setIn(['d', 'f', 'h'], 10);
object1 === object2;
// false
์์ ๊ฐ์ด ๊ฐ๊ฒฐํด์ง ๊ฑธ ๋ณผ ์ ์๋ค.
์ฌ์ฉ๋ฐฉ๋ฒ
Immutable์ Map
์ ๊ฐ์ฒด ๋์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ค. ์ด๋, Javascript์ ๋ด์ฅ๋์ด์๋ Map
๊ณผ๋ ๋ค๋ฅด๋ค.
var Map = Immutable.Map;
var data = Map({
a: 1,
b: 2,
c: Map({
d: 3,
e: 4,
f: 5
})
})
์์ ๊ฐ์ด Map ํจ์ ์์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด ํธ์ถํ๋ฉด ๋๋ค. ๋ง์ฝ, ๊ฐ์ฒด ๋ด๋ถ์ ๋๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ ๊ฐ์ธ์ผํ๋ค.
Map ํจ์๊ฐ ์๋ fromJS
๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.
var fromJS = Immutable.fromJS;
var data = fromJS({
a: 1,
b: 2,
c: {
d: 3,
e: 4,
f: 5
}
});
fromJS
๋ ๋ด๋ถ ๊ฐ์ฒด๋ค๋ ํ๋ฒ์ Map์ผ๋ก ๋ณํํด์ค๋ค.
Map ํจ์๋ fromJS ํจ์๋ก ๋ง๋ Map์ ๋ก๊ทธ๋ก ์ฐ์ด๋ณด๋๋ก ํ์.
[object Object] {
@@__IMMUTABLE_ITERABLE__@@: true,
@@__IMMUTABLE_KEYED__@@: true,
@@__IMMUTABLE_MAP__@@: true,
__altered: false,
__ensureOwner: function (t){return t===this.__ownerID?this:t?Yt(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},
__hash: undefined,
__iterate: function (t,e){var r=this,n=0;return this._root&&this._root.iterate(function(e){return n++,t(e[1],e[0],r)},e),n},
__iterator: function (t,e){return new Ht(this,t,e)},
__ownerID: undefined,
__toJS: function (){st(this.size);var t={};return this.__iterate(function(e,r){t[r]=e}),t},
__toString: function (t,e){return 0===this.size?t+e:t+
...
์์ ๊ฐ์ด ๋์จ๋ค. Map์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. console.log(data.a) // undefined
์ ๊ฐ์ ํํ๋ ์ฌ์ฉํ ์ ์๋ค.
Mapd์ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ค์ค์ผ ํ๋ค.
-
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ
Map์ ์ผ๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
data.toJS(); // { a:1, b:2, c: { d: 3, e: 4 } }
toJS()
ํจ์๋ Map์ ์ผ๋ฐ Javascript ๊ฐ์ฒด๋ก ๋ณํํด์ค๋ค. -
ํน์ ํค๊ฐ ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ์ค์ ํ๊ธฐ
Map์ ํน์ ํค๊ฐ๋ง์ ๋ถ๋ฌ์ค๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
data.get('a'); // 1 var newData = data.set('a', 4);
get()
ํจ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ key์ ๊ฐ์ ๋ถ๋ฌ์จ๋ค.set()
ํจ์๋ ๊ฐ์ ์ค์ ํ๋ค.set ํจ์๋ฅผ ํฌํจํด์ ์ด๋ ํ ๊ฐ์ ์ค์ ํ๋ ํจ์๋ ๊ธฐ์กด์ ๊ฐ์ ๋ฐ๊พธ๋ ๊ฒ ์๋๋ผ, ์ฃผ์ด์ง ๋ณํ๋ฅผ ์ ์ฉ์ํจ ์๋ก์ด Map์ ๋ฐํํ๋ค.
-
๊น์ํ ๊ฐ ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ์ค์ ํ๊ธฐ
๊น์ํ ๋ค์ด์๋ ๊ฐ์ ๋ถ๋ฌ์ค๊ณ ์ค์ ํด์ผ ํ ๋
getIn
๊ณผsetIn
์ ์ฌ์ฉํ๋ฉด ๋๋ค.data.getIn(['c', 'd']) // 3 var newData = data.setIn(['c', 'd'], 10);
-
์ฌ๋ฌ ๊ฐ์ ๊ฐ ์ค์ ํ๊ธฐ
์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋์์ ์ค์ ํ ๋๋
mergeIn
์ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, c.d์ c.e์ ๊ฐ์ ๋์์ ๋ฐ๊ฟ์ผ ํ๋ ๊ฒฝ์ฐ, setIn์ 2๋ฒ ํธ์ถํ ์๋ ์์ง๋ง ์๋์ ๊ฐ์ด ํ๋ฒ์ ํด๊ฒฐํ ์ ์๋ค.var newData = data.mergeIn(['c'], { d: 10, e: 10 });
์ด๋ ๊ฒ ํ์ ๋, c.f์ ๊ฐ์ ๊ทธ๋๋ก ์ ์ง๋๋ค.
์ต์์์์ merge๋ฅผ ํด์ผํ๋ค๋ฉด ์๋์ ๊ฐ์ด ํ๋ค.
var newData = data.merge({ a: 10, b: 10 })
-
์ ์ฒด ๊ฐ์ฒด ์ ๋ฐ์ดํธํ๊ธฐ
์ ์ฒด ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธ ํ ๋๋ merge๋ณด๋ค ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํ๋ ๊ฒ ์ข๋ค.
var newData = data.set('c', Map({ d: 10, e: 10, f: 10 }))
โ