To mutate, or not to mutate, in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์๋ฌธ : https://slemgrim.com/mutate-or-not-to-mutate/
mutable: ๊ฐ๋ณ
immutable: ๋ถ๋ณ
primitive: ์์ ํ์
https://ko.wikipedia.org/wiki/%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4
๋ง์ ์ฌ๋๋ค์ด ๋ถ๋ณ์ฑ์ ๋ํ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ ๋ํด ๋ ผ์๋ฅผ ํ๊ณ ์์ต๋๋ค. ์ด๋ค ์ฌ๋๋ค์ ๋ถ๋ณ์ฑ์ ์ํฐํ๋ผ์ด์ฆ ์์คํ ์ด๋ ํจ์ํ ํ๋ก๊ทธ๋ด๋ฐ์์์ ๊ฐ์ฅ ํฐ ๋ถ๋ถ์ด ์๋๋ผ๊ณ ๋งํฉ๋๋ค. ๋ง์ฝ ๊ตฌ๊ธ์์ ์ฐพ๋๋ค๋ฉด(๊ตฌ๊ธ๋ง์ ํ๋ค๋ฉด), ๋ถ๋ณ์ฑ์ด ๋ฌด์์ธ์ง ์ค๋ช ํ๋ ์ ๋ง์ ์๊ฒฌ๊ณผ ๊ธฐ์ฌ๋ค์ ๋ณผ ์ ์์ ๊ฒ์ ๋๋ค. ์ด ๊ธ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋๊ณ ์๋ ์ฌ๋ก๋ฅผ ์ง์ค์ ์ผ๋ก ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
์ ๋ง์ ๋ค๋ฅธ ์ธ์ด์์ ์ฒ๋ผ ์์ ํ์ ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ถ๋ณ์ ๋๋ค. ์ด ์๋ฏธ๋ ์์ํ์ ์ ์ธ์ ๋ ๋ณ๊ฒฝ์ด ๋ ์ ์๊ณ ์ด ์์ํ์ ์ด ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
// Strings
let str = "Hello world!";
let res = str.slice(1,5); //ello
// Numbers
let number = 10;
number += 15;
๋ถ๋ณ์ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
๋์์ฑ- ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ์ ์ฅ
- ์ฌ์ด๋ ์ดํํธ๊ฐ ์์
- ์ผ์์ ์ธ ์ปคํ๋ง์ด ์์
- ๊ฐ๋ ์ฑ ํฅ์
- ๋ฉ๋ชจ๋ฆฌ ์๋น ๊ฐ์
- ์บ์ํ๊ธฐ ์ฌ์
- ํ ์คํธํ๊ธฐ ์ฌ์
ELM ๊ทธ๋ฆฌ๊ณ ํ์ค์ผ๊ณผ ๊ฐ์ ์ด๋ ํ ๊ฐ์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ์์ํ ํจ์ ์ธ์ด์ ๋ง์ด ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ ์ค ํ๋๊ฐ ์๋๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋ณ์ ๋๋ค. ๊ฐ๋ณ์ ์ฌ์ฉํ์๋ง์ ๋ถ๋ณ์ด ๊ฐ์ง ์ฅ์ ๋ค์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ฐ๋ณ์ ์ธ ๊ฒ์ ๋ถ๋ณ์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ต๋๋ค.
๋น๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ง์ํ์ง ์์ง๋ง ๋๋ถ๋ถ ๊ฐ๋ณ์ ํผํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ฃผ์ด์ง ์ค๋ธ์ ํธ์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๋์ ์ ๋ณ๊ฒฝ๋ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ ํจ์๋ฅผ ์์ฑํฉ๋๋ค.
//bad
function save(object){
object.saved = true;
return object;
}
//better
function save(object){
let newObject = object.clone();
newObject.saved = true;
return newObject;
}
๊ฐ์ฒด๋ ์ฐธ์กฐ ์ ๋๋ค. ์์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ๋ช ํํ์ง ์์ ์ํ์ ์ํฉ์ ํผํ ์ ์์ต๋๋ค. ๋ํ ์์ฑ๋ ์ฝ๋๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
let request = {
method: "GET",
uri: "http://slemgrim.com"
}
// don't do this
request.method = "POST"
setter์ ๋ ๊ฐ์ง ์ฌํญ์ ์ค๋ณต์ด ๋ฉ๋๋ค. ๋ง์ฝ setter์ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝ ํฉ๋๋ค. ๊ทธ๋์ setter์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ณ์ด๋ฅผ ํผํ๊ธฐ ์ํด์ ์ง๋ฃจํ ์์ ๋ค์ด ์กด์ฌํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ถ๋ณํ ๊ฐ์ฒด๊ฐ ๋นํธ์ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ง ์๋ ๊ฒ์ ์์ ์๋ฅผ ํ๋ค๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ๋์์ ๋ฐ์์ผ ํฉ๋๋ค.
ํ์ด์ค๋ถ์ Immutable.js๋ ์ํ ๋ถ๋ณ์ ์ ์งํ๋๋ฐ ๋์์ ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค. ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก(Mori, seamless-immutable ) ์ ๊ฐ์ ๊ฐ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ํด๋น ๊ธ์์๋ Immutable.js์ ์ฌ์ฉํฉ๋๋ค.
์์ธํ ๋ด์ฉ์documentation์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ข ๋ ์์ธํ ์ค๋ช ์ ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ ๋ง ๊ฐ๋จํ์ง๋ง ๋ง๋ฌด๋ฆฌ๋ :
Immutable.js๋
List, Stack, Map, OrderedMap, Set, OrderedSet and Record
์ ๊ฐ์ ๋ฐ์ดํฐ์ ๋ถ๋ณ์ ์ ๊ณตํฉ๋๋ค.
๋๋ ์ฝ๋์ ํผ์์:
import Map from 'immutable';
var request = Map({method: 'GET', uri: 'http://slemgrim.com'});
var post = request.set('method', 'POST');
request.get('method'); // GET
post.get('method'); // POST
๋น๋ก ๊ฐ์ฒด ์์ฑ์ ๋ํ ์ง์ ์ ์ธ ์ ๊ทผ์ ํ ์ ์์ง๋ง, ๊ฐ๋ณ๊ฐ์ฒด์ ๋ถ๋ชํ๋ ๋์ ์ ๋ณธ์ฐ์ ๋ชฉ์ ์ ์ง์คํ ์ ์์ต๋๋ค.
eslint-plugin-immutable ํ๋ฌ๊ทธ์ธ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ๊ฐ๋ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฆฌ๋๋ฏธ์ ๋ฆฌ์กํธ, ๋ฆฌ๋์ค๋ฅผ ์ธ๊ธํ์ง๋ง ์ด ๋๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ ์ธํ๊ณ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- no-let: let๋์ ์ const๋ฅผ ์ฌ์ฉํ์ธ์.
- no-this: ES6 class ์ฌ์ฉ์ ๊ธ์งํฉ๋๋ค.
- no-mutation: ๋ฉค๋ฒ ํํ์์ ๊ฒฐ๊ณผ์ ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค.
์ด๊ฒ์ ๋ถ๋ณ์ฑ์ด ํ๋นํ ๊ฐ์ฅ ์ค์ํ ์ด์ ์ ๋๋ค. ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ธฐ ์ํด์๋ ๋ณ๊ฒฝ๋์ง ์๋ ํญ๋ชฉ์ ์ ๊ทธ์ง ์์๋ ๋ฉ๋๋ค. JS์์๋ ์ค์ ๋์์ฑ์ด ์์ต๋๋ค. ๋์ Event Loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop)๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ์์ด๋ฒ๋ ค๋ ์ข์ต๋๋ค.
๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ณ์ ์ธ ๊ฒ์ ๋๋ค. ๊ฐ๋ณ์ ์ฌ์ด๋ ์ดํํธ์ ์ํด ์ ์ ๋ฉ๋๋ค. ์ฌ์ด๋ ์ดํํธ๋ฅผ ํผํด์ผ ํ๋ค๊ณ ๋ฐฐ์ ์ต๋๋ค. ์ฌ์ด๋ ์ดํํธ๊ฐ ์๋ค๋ฉด ํจ์์ ๊ตฌํ์ ๋ค์ฌ๋ค๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์ฝ๋๋ ์ถ๋ก ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์์ธก ๊ฐ๋ฅํ๊ณ ๋ ํ ์คํธ ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ ๋๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ค๋ฃจ๊ณ ์๋ ์ง์ ๋ํ ์๊ฐ์ ๋ฉ์ถฐ์ผ ํฉ๋๋ค. ๋ถ๋ณ์ ๊ฐ์ฒด๋ ํญ์ ๊ฐ์ ๋๋ค .์ด๊ฒ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ์๋ฆฌ์ค ํ๋์ ๋๋ค. ํจ์์ ๊ฐใ ๋ฅด ์ ๋ฌํ๋ฉด ํ๋ก๋ฏธ์ค๋ฅผ ์์ํ ์ ์งํ ์ ์์ต๋๋ค.
์ค์ ๋ก ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ณ๊ฒฝ์ ๋ํด ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ด๊ฒ์ ๊ฒ์๊ณผ ์๋ฎฌ๋ ์ด์ ์์ ํนํ ๋๋ฒ ๋ฐ๋ณต๋๋ ๊ฒฝ์ฐ์ ํด๋น๋ฉ๋๋ค. ๋น์ ์ด ๊ฒ์์์ ๋ถ๋ณ์ฑ์ ์ฌ์ฉํ ์ ์๋ค๋ ๋ง์ ์๋์ง๋ง, ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ณด๋ค ์ฑ๋ฅ ๋ฌธ์ ์ ๋น ์ง๊ธฐ ์ฝ์ต๋๋ค.
์ ๋ง ๊ฑฐ๋ํ ๋ฐ์ดํฐ ํธ๋ฆฌ๊ฐ ๋ถ๋ณ ์ปจํ ์ด๋๋ก ์ ์ฅ๋์ด ์๋ค๋ฉด, ๋ฉ๋ชจ๋ฆฌ ์๋น๋์ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฌผ๋ก ๊ฐ๋น์ง ์์ง์ ๋ชจ๋ ์ค๋๋ ๊ฐ์ฒด๋ฅผ ์ฃฝ์ผ ๊ฒ์ด์ง๋ง ํฐ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ ์ฌ์ ํ ๋น์ฉ์ด ๋ญ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ณ์ ํ์ ์ ๊ณ ์ํ๋ ๊ฒ์ ๊ฝค ํฉ๋ฆฌ์ ์ธ ์ธ์ด ๋์์ธ์ ์ ํ์ ๋๋ค. ์ฌ์ง์ด ๋ชจ๋ ๊ฒ์ด ๋ถ๋ณ ์ผ ๋ ๋ฉ์ง๊ฒ ๋ชจ๋ธ๋งํ์ง ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ํฉ์์ ๋ถ๋ณ ํ์ ์ฅ์ ์ ๋จ์ ๋ณด๋ค ํจ์ฌ ์ค์ํ๋ฉฐ ๋์๋ณด๋ค ๋ฐ์ด๋๊ณ ๋ ๋์ ์ฝ๋์ ๋ ๋น ๋ฅธ ์คํ ํ์ผ์ ์ ๊ณตํฉ๋๋ค.