โ ์ฝ๋ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ง๋๋ฅผ ์ธก์ ํ๋ ๊ฒ์ ๋นํ๊ธฐ ์ ์ ์ง๋๋ฅผ ๋ฌด๊ฒ๋ก ์ธก์ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. โ
- Bill Gates
๋ง์ดํฌ๋ก์ํํธ ์ค๋ฆฝ์

Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Lodash(๋ก๋์ฌ)๋ JavaScript์ ์ธ๊ธฐ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก ์ ์ด์ฟผ๋ฆฌ, ๋ฆฌ์กํธ์ ๊ฐ์ด ์ ์ธ๊ณ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Jquery๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ DOM์ ๊ฐํธํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด ํ์ํ๋ฏ์ด, Lodash๋ ์ฃผ๋ก array, collection, date ๊ฐ์ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐํธํ๊ฒ ํจ์ํ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํ๊ธฐ ์ํด์ ํ์ํ๋ค.
์๋ฅผ๋ค์ด ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด ์์ ๊ฐ์ฒด๋ค์ ๊ฐ์ ํธ๋ค๋ง ํ ๋ (๋ฐฐ์ด, ๊ฐ์ฒด ๋ฐ ๋ฌธ์์ด ๋ฐ๋ณต / ๋ณตํฉ์ ์ธ ํจ์ ์์ฑ) ์ฝ๋ ๋ช์ค๋ง์ผ๋ก ์ ๊ธฐ์ ์ผ๋ก ๋ค๋ฃฐ์๊ฐ ์์ด์ ๋งค์ฐ ์ ์ฉํ๋ค.
ํนํ Frontend ํ๊ฒฝ์์ ์๋ฒ(DB)์์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๊ณ ๋ณถ์๋ฃ์๋ ๋ง์ด ์ฐ์ด๋ ํธ์ด๋ค.
Lodash ๋ผ๋ ๋จ์ด๋ฅผ ๋ณด๋ฉด ์๋ฏ์ด, ๋ก๋์ฌ๋ ๋ฐ์ค _ ๊ธฐํธ๋ฅผ ์ฒ์์ ์ ์ธํ์ฌ ์ฌ์ฉ๋๋ค.
__. (๋ณ์) ์ด๋ฐ์์ผ๋ก ์์ฑํ ๊ฒฝ์ฐ lodash wrapper๋ก ๋ณ์๋ฅผ ๊ฐ์ธ๊ฒ ๋๋ฉด์ ํด๋น ๋ณ์์ ๋ํ chaining์ ์์ํ๋ค.
์ ์ด์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ๋$( )๋ฌ๋ฌ ๊ธฐํธ๋ก DOM์ ๋ฌถ์ด ์ฌ์ฉํ๋ฏ์ด ๋ก๋์ฌ๋ ๋ฌ๋ฌ ๊ธฐํธ ๋์ ๋ฐ์ค ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ค๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
// $() ๋ก ๋ฌถ์ผ๋ฉด jquery ์ ์ฉ ๋ณ์๋ก ๋ํ๋๋ฏ์ด
let dom = 'div span'
let $dom = $(dom);
// _()๋ก ๋ฌถ์ผ๋ฉด Lodash ์ ์ฉ์ผ๋ก ๋ํ๋๋ค.
let values = { "f":3, "g":15 };
let rap_val = _(values);
๊ทธ ์ธ์ lodash.js ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ์ง ์๋ ์ฑ๋ฅ์ด ๋ณด์ฅ๋์ด์๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์.
- ํผํฌ๋จผ์ค ์ธก๋ฉด์์ native๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๊ฐ์ง.
- npm์ด๋ ๊ธฐํ ํจํค์ง ๋งค๋์ ๋ฅผ ํตํด ์ฝ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ.
Lodash ์ค์น & ์ฌ์ฉ
Lodash
_.defaults({ 'a': 1 }, { 'a': 3, 'b': 2 });_.partition([1, 2, 3, 4], n => n % 2);DownloadLodash is released under the MIT license & supports modern environments. Review the build differences & pick one thatโs right for you.InstallationIn
lodash.com
โ
CDN ์ฝ๋ (ํด๋ผ์ด์ธํธ)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>โ
npm ์ค์น (์๋ฒ)
# npm ์ค์น
npm i -g npm
npm i --save lodash
lodash ์ฌ์ฉ ๋ฐฉ๋ฒ
// ES6
import _ from 'lodash';
// commonJs
var _ = require('lodash');
var myFriend=[
{name:'kys',job:'developer',age:27},
{name:'cys',job:'webtoons man',age:27},
{name:'yhs',job:'florist',age:26},
{name:'chj',job:'nonghyup man',age:27},
{name:'ghh',job:'coffee man',age:27},
{name:'ldh',job:'kangaroo',age:27},
]
// ์ฝ๋ฐฑํจ์๊ฐ ์ฒ์์ผ๋ก ์ฐธ์ด๋๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ
_.find(myFriend, function(friend) {
return friend.age < 28;
}); // โ { name: 'kys',job:'developer' ,'age': 27}
Lodash vs ES6 ๋น๊ต

์์ ๋งํ๋ฏ์ด, Lodash๋ ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ์ข๋ ๊ฐํธํ๋ฉด์ ์ ๊ธฐ์ ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ ํ๋ค.
๊ทธ๋ผ lodash์ es6์ ํจ์ ์๋๋ ์ด๋์ ๋ ์ฐจ์ด๊ฐ ๋ ๊น?
๋ค์์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๊ธฐ์กด ๋ค์ดํฐ๋ธ ํจ์๋ฅผ ์ฌ์ฉํ์๋ ๋์ ์ฑ๋ฅ ๋น๊ต๋ฅผ ํ ๊ทธ๋ํ์ด๋ค.
์ฑ๋ฅ ๋น๊ต๋ ์๋ ๋งํฌ์์ ์งํํ ์ ์๋ค.
Benchmark: native find vs lodash _.find - MeasureThat.net
measurethat.net
find() ์ฑ๋ฅ ๋น๊ต
- find()๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ปฌ๋ ์ ์์์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ฐพ๋ ๋ฉ์๋
var array = [
{ name: 'lim', age: 26 },
{ name: 'kim', age: 28 },
{ name: 'choi', age: 32 },
{ name: 'park', age: 21 },
]
/* Lodash */
_.find(array, arr => arr.age < 28)
/* ES6 */
array.find(arr => arr.age < 28)

โ๋ค์ดํฐ๋ธ find() ๊ฐ ์๋์ ์ผ๋ก ๋ฒค์น๋งํฌ ์ ์๊ฐ ๋๋ค. (์๋๊ฐ ๋น ๋ฅด๋ค)
โ
forEach() ์ฑ๋ฅ ๋น๊ต
- forEach()๋ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋๋ฉฐ ํด๋น ๋ฐฐ์ด์ ์์์ ์ง์ ์ ์ธ ์์ ์ ํ๋ ๋ฉ์๋
var array = [
{ name: 'lim', age: 26 },
{ name: 'kim', age: 28 },
{ name: 'choi', age: 32 },
{ name: 'park', age: 21 },
]
/* Lodash */
_.forEach(array, (arr, index, self) => {
// ...
})
_.each(array, (arr, index, self) => {
// ...
})
/* ES6 */
array.forEach((arr, index, self) => {
// ...
})

โLodash์ each๋ ๋ธ๋ผ์ฐ์ ์ ์คํ์ ๋ฐ๋ผ ๊ตฌํ์ ๋ค๋ฅด๊ฒ ๊ฐ์ ธ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฒค์น๋งํฌ ์ ์๊ฐ ๋๋ค (๋น ๋ฅด๋ค)
filter() ์ฑ๋ฅ ๋น๊ต
- filter()๋ ์ฝ๋ ์ ์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ชจ๋ ์์๋ฅผ ์ถ์ถํด ์ค๋ค.
const numbers = [10, 40, 230, 15, 18, 51, 1221]
/* Lodash */
_.filter(numbers, num => num % 3 === 0)
/* ES6 */
numbers.filter(num => num % 3 === 0)

includes() ์ฑ๋ฅ ๋น๊ต
- includes() ๋ ์ฝ๋ ์ ์ ํด๋น ์์๋ฅผ ๊ฐ๊ณ ์๋์ง๋ฅผ ํ์ธํ๋ค.
const primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,97]
/* Lodash */
_.includes(primes, 47) // true
/* ES6 */
primes.includes(79) // true

Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ด์
์ง๊ธ๊น์ง ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ก๋์ฌ์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋ณด๋ฉด, ๋๋ถ๋ถ์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ํจ์ native ES6 ๋ฌธ๋ฒ์ด lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ๋ฒ๋ณด๋ค ์ฑ๋ฅ์ด ๋น ๋ฅด๋ค๋๊ฑธ ์ ์ ์๋ค.
๊ทธ๋ผ ์๋ฌธ์ด ๋ค๊ฒ์ด๋ค.
๋น์ฐํ native๋ฌธ๋ฒ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ๋ฒ๋ณด๋ค ๋น ๋ฅด๊ณ , ๊ธฐ๋ณธ ์ง์ํ๋๋ฐ ์ ๊ตณ์ด ๋ฌด๊ฑฐ์ด lodash๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์จ์ผ ํ๋?
์ ๋ต์ ๋ฐ๋ก ํจ์์ ํ์ฅ์ฑ ๋๋ฌธ์ด๋ค.
โ
findIndex() ํจ์ (๋ฆฌํด๊ฐ๊ณผ ์ผ์นํ๋ ํด๋น ์์์ ์ธ๋ฑ์ค ๋ฐํ)๋ฅผ ์๋ฅผ ๋ค์ด ์ค๋ช ํด๋ณด๊ฒ ๋ค.
var myFriend = [
{name:'kys',job:'developer',age:27},
{name:'cys',job:'webtoons man',age:27},
{name:'yhs',job:'florist',age:26},
{name:'chj',job:'nonghyup man',age:27},
];
myFriend.findIndex(function(friend){
return friend.age === 26 // 2
});
_.findIndex(myFriend, function(friend) {
return friend.age === 26; // 2
});
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ ์ ์ ์๋ค.
ํ์ง๋ง, ES6์ findIndex()๋ ํ๋ผ๋ฏธํฐ๋ก ์ฝ๋ฐฑํจ์๋ฐ์ ๋ชป์ค์ง๋ง, Lodash์ findIndex()๋ ๊ฐ์ฒด๊ฐ๋ ์ค์ ์๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
// ์ฒ์ ์ผ์นํ๋ object์ index ๊ฐ์ ๋ฐํํฉ๋๋ค.
_.findIndex(myFriend, { name: 'cys', job:'webtoons man',age: 27 });
// -> 1
// ๋์ด๊ฐ 26์ธ ๊ฐ์ฒด๊ฐ ์ฒ์์ผ๋ก ๋์ค๋ index ๋ฐํ
_.findIndex(myFriend, {age: 26});
// โ 2
โ
map() ํจ์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ES6์์๋ ํํ ๋ฐฐ์ด ๊ณ ์ฐจํจ์๋ผ๊ณ ๊ฐ๋ฅด์น์ง๋ง, lodash์ map()ํจ์๋ ๋ฐฐ์ด๋ฟ๋ง ์๋๋ผ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ค์ ์๋ค.
const data = {
a: 20,
b: 30,
c: 10,
}
// ์๋๋ผ๋ฉด map๋ฉ์๋๋ ๋ฐฐ์ด์์ ๋ชป์ฐ์ง๋ง, _.map์ ๊ฐ์ฒด ์ํ๋ฅผ mapํ ์ ์์
// ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์
๊ทธ๋ ์ด๋๋ ๊ฐ์ฒด๋ฅผ ๋ฆฌํด
_.map(data, (count, type) => ({
type: type,
count: count,
}))
/* ๊ฒฐ๊ณผ๊ฐ
[
{
type: 'a',
count: 20
},
{
type: 'b',
count: 30
},
{
type: 'c',
count: 10
}
]
*/
๋ํ, ๋ฐฐ์ด์ ์์๋ค์ค ์ค๋ณต๊ฐ์ ์ ๊ฑฐํ ๊ฐ์ ๊ตฌํ ๋๋ lodash๋ฅผ ์ด์ฉํ๋ฉด ๊ฐํธํ๊ฒ ํจ์๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ๋ฒค์น๋งํฌ ์ ์๋ฅผ ๋ณด๋ฉด ์์์๋ฏ์ด ์คํ๋ ค ์ฑ๋ฅ์ด ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํํ๋ ๊ฒ ๋ณด๋ค ์ข๋ค.
var elements = [1,2,3,1,2,4,2,3,5,3]
/* Lodash */
// ์ง์ ํจ์๋ฅผ ํ๋ฐฉ์!!
_.uniq(elements) // [1,2,3,4,5]
/* ES6 */
// Set์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ ๋ค sperad ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋ฐฐ์ด๋ก ๋๋ ค ๋๋ ๋ณต์กํ ๋ก์ง์ ์ฌ์ฉํ๋ค.
[...new Set(elements)] // [1,2,3,4,5]

๋ง์ง๋ง์ผ๋ก ์ง์ฐํ๊ฐ ์๋ฆฌ์ ์ํด์, Lodash๋ ์คํ๋ ค ES6๋ณด๋ค ์ฑ๋ฅ์ด ์ข์์ ์๋ค๋ ์ฌ๋ก๋ ์กด์ฌํ๋ค.
์์ธํ ๋ด์ฉ์ ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[LODASH] ๐ ์ง์ฐ ํ๊ฐ ์๋ฆฌ (lodash๋ ์คํ๋ ค ์ฑ๋ฅ์ด ์ข์ ์ ์๋ค)
์ง์ฐ ํ๊ฐ๋? ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์์ ๋๊ธํ ๊ณ์ฐ๋ฒ(Lazy evaluation)์ ๊ณ์ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ด ํ์ํ ๋๊น์ง ๊ณ์ฐ์ ๋ฆ์ถ๋ ๊ธฐ๋ฒ์ด๋ค. ์ง์ฐ ํ๊ฐ๋ ํ์ ํ ๋๊น์ง ๊ณ์ฐ์ ๋ฆ์ถ๋ฉด์ ๋ถํ์ํ ๊ณ์ฐ์ ์ค
inpa.tistory.com
โ์ด ์ฒ๋ผ Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณต๋๋ ํจ์๋ ํ๊ฐ์ง ๊ธฐ๋ฅ๋ง ์๋๊ฒ ์๋๋ผ ๋ค์ํ ๊ธฐ๋ฅ์ ๋ดํฌํ๊ณ ์๋ค.
๋์ผ๋ก Lodash ์ ES6 ์ฐจ์ด๋ฅผ ํ๋ก ๊ฐํํ ์ ๋ฆฌํ๊ณ ๋ง์น๊ฒ ๋ค.
์ฅ์ | ๋จ์ | |
Lodash | ๋ฉ์๋์์ ์ ๊ณตํ๋ ๋ค์ํ ๊ธฐ๋ฅ์ผ๋ก ์์ฐ์ฑ์ด ๋๋ค. | ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฒ๋ค. ES6์ ๋นํ์ฌ ์๋๊ฐ ๋๋ฆฌ๋ค. |
ES6 | ์๋๊ฐ ๋น ๋ฅด๋ค. ๋น์ฐํ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ด๋ผ ํธํ์ฑ์ด ์ข๋ค. |
์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ํด์ผํ๋ค. ์๋ํ๋ฉด Array ํ์ ๋ฐ์ ์ง์์ ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์๋ ์ง์ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ฏ๋ก ๋ฒ๊ฑฐ๋กญ๋ค. |
# ์ฐธ๊ณ ์๋ฃ
https://ui.toast.com/weekly-pick/ko_20190515
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.