[JS] Lodash _.memoize ์์ค ์ฝ๋ ํบ์๋ณด๊ธฐ
_.memoize ์์ค์ฝ๋
Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Memoize ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ ์ ์งํํ๋ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค. ์ค์๊ฐ ๊ฒ์์ฐฝ์ ๊ตฌํํ ๋ ์ ๋ ฅํ ํค์๋์ ๋ํ API ํธ์ถ์ ์๋ํ๋๋ฐ, ์ด๋ฏธ ๊ฒ์ํ๋ ํค์๋๋ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํด๋๊ณ ์ฌ์ฌ์ฉํ๋ฉด API ์ค๋ณต ํธ์ถ์ ๋ฐฉ์งํ ์ ์๋ค. ์ด๋ Lodash์ Memoize๋ฅผ ํ์ฉํ ์ ์๋ค(๋ฌผ๋ก ํค์๋์ ๋ํ ๊ฒฐ๊ณผ๊ฐ์ด ์์ฃผ ๋ณํ๋ค๋ฉด ์บ์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ํ์ ์๋ค)
์ค์๊ฐ ๊ฒ์์ฐฝ์ ํ์ฉํ Memoize
import _ from 'lodash';
export const requestQuotes = _.memoize(async (title) => {
const res = await fetch(
`https://animechan.vercel.app/api/quotes/anime?title=${title}`,
);
if (res.status !== 200) return [];
const quotesArray = await res.json();
return quotesArray;
});
requestQuotes('china'); // 'china' ํค์๋์ ๋ํ API ํธ์ถ ๊ฒฐ๊ณผ ์บ์ฑ(Map์ 'china' key์ ์ ์ฅ)
requestQuotes.cache; // Map(1) { 'china' -> ...} ๋์ถฉ ์ด๋ฐ ๋ชจ์
Memoize ๋ฉ์๋์ ์บ์ฑ์ ์ด๋ป๊ฒ ๊ตฌํํ๊ณ ์ด๋์ ์ ์ฅ๋๋์ง ๊ถ๊ธํด์ ์์ค์ฝ๋๋ฅผ ์ฐพ์๋ดค๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก Map๊ณผ ํด๋ก์ ๋ฅผ ํ์ฉํด์ ๊ตฌํํ๋ค. memoize
ํจ์์ ์ฒซ๋ฒ์งธ ์ฝ๋ฐฑ์ด ๋ฐ๋ ํ๋ผ๋ฏธํฐ๋ Map(์บ์)์ key
๋ก ์ฌ์ฉ๋๋ค. Map์ ๋ฌธ์, ์ซ์ ๊ฐ์ ์์ํ์ ๋ฌผ๋ก ์ฐธ์กฐํ(ํจ์, ๊ฐ์ฒด ๋ฑ)๋ key
๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ Map์ ํ์ฉํ๋ ๊ฒ ๊ฐ๋ค.
_.memoize ์์ค ์ฝ๋ โผ
function memoize(func, resolver) {
if (
typeof func !== 'function' ||
(resolver != null && typeof resolver !== 'function')
) {
throw new TypeError('Expected a function');
}
const memoized = function (...args) {
const key = resolver ? resolver.apply(this, args) : args[0];
const { cache } = memoized;
if (cache.has(key)) {
return cache.get(key);
}
const result = func.apply(this, args);
memoized.cache = cache.set(key, result) || cache;
return result;
};
memoized.cache = new (memoize.Cache || Map)();
return memoized;
}
memoize.Cache = Map;
์ฐธ๊ณ ๋ก memoize.Cache
ํ๋กํผํฐ๋ Map ์์ฑ์ ํจ์๋ฅผ ์ฐธ์กฐํ๋๋ก ์์ฑ๋์ด ์๋ค.
memoize.Cache === Map; // true
์๋ ๋ฐฉ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด์ด๋ฏ๋ก, ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ/์ญ์ ํ ์ ์๋ค. ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก length
(ํ๋ผ๋ฏธํฐ ๊ฐฏ์)์ prototype
(์์ฑ์ ํจ์์ผ ๋) ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ค. ์ต๋ช
ํจ์๊ฐ ์๋๋ฉด name
ํ๋กํผํฐ๋ ๊ฐ์ง๋ค.
const add10 = (num) => num + 10;
Object.getOwnPropertyDescriptors(add10);
// length: {value: 1, writable: false, enumerable: false, configurable: true}
// name: {value: 'add10', writable: false, enumerable: false, configurable: true}
add10.desc = '์ซ์๋ฅผ ์ธ์๋ก ๋ฐ์ 10์ ๋ํ ๊ฐ์ ๋ฐํํ๋ ํจ์';
console.log(add10.desc); // '์ซ์๋ฅผ ์ธ์๋ก ๋ฐ์ 10์ ๋ํ ๊ฐ์ ๋ฐํํ๋ ํจ์'
delete add10.desc; // true
console.log(add10.desc); // undefined
๐ก memoize()
ํ๋ผ๋ฏธํฐ์ resolver ํจ์๋ฅผ ๋๊ธฐ๋ฉด, resolver๊ฐ ๋ฐํํ๋ ๊ฐ์ ์บ์์ key๋ก ์ฌ์ฉํ๋ค.
์ซ์๋ฅผ ์ธ์๋ก ๋ฐ์ 10์ ๋ํ ๊ฐ์ ๋ฐํํ๋ add10
ํจ์๋ฅผ memoize
์ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด๋ค๊ณ ๊ฐ์ ํด๋ณธ๋ค. memoize
ํจ์๊ฐ ๋ฐํํ๋ ํจ์๋ cache
(Map ๊ฐ์ฒด)๋ผ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฌ๊ธฐ์ ์บ์ฑ๋ ๊ฐ๋ค์ด ๋ด๊ธด๋ค. ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒผ๋ add10
ํจ์๋ memoize
ํจ์์ ์ง์ญ ๋ณ์๋ก ๋ฑ๋ก๋ผ์ ์ฌ์ฉ๋๋ค(ํด๋ก์ ).
const add10 = (num) => num + 10;
const cachedValue = memoize(add10);
console.log(cachedValue); // ƒ (...args) {...}
console.log(cached.cache); // Map(0) {size: 0}
cachedValue
ํ๋ผ๋ฏธํฐ์ 8
์ ๋๊ฒจ ์คํํ๋ค๊ณ ๊ฐ์ ํ๋ฉด...
cachedValue(8);
โถ key ํ๋. ์ ๊ณต๋ resolver
ํจ์๊ฐ ์์ผ๋ฏ๋ก ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ 8
์ด key
๊ฐ ๋๋ค. (args๋ [8]
)
โท cache
(Map) ๊ฐ์ฒด์ 8
์ด๋ผ๋ key๊ฐ ์๋์ง ํ์ธ. ์์ผ๋ฉด ํด๋น key(8)์ ๊ฐ์ ๋ฐํํ๊ณ ์์ผ๋ฉด ๋ค์ ๋จ๊ณ ์งํ.
โธ memoize
ํจ์๊ฐ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐ์๋ ์ฝ๋ฐฑ ํจ์(add10)์ 8
์ ๋๊ฒจ์ ์คํ. apply
๋ฉ์๋๋ ๋๋ฒ์งธ ์ธ์์ ๊ฐ์ ๋๊ธธ๋๋ ๋ฐฐ์ด ํํ์ด๊ณ , ๋ฐ๋ ๊ณณ์์ ๋ฐฐ์ด์ด ํ๋ฆฐ ํํ์ด๋ค.
const result = func.apply(this, args); // func = add10, args = [8]
// apply ์ฐธ๊ณ : Math.max.apply(null, [3, 2, 5]) -> Math.max(...[3, 2, 5])์ ๋์ผ
โน ์คํ ๊ฒฐ๊ณผ cache(Map ๊ฐ์ฒด)์ ์ ์ฅ. Map์ set ๋ฉ์๋๋ value ์ ์ฅ ํ ํญ์ ์๊ธฐ ์์ (Map)์ ๋ฐํํ๋ค.
โบ ๊ฒฐ๊ณผ ๋ฐํ.
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[AWS] EC2 ๋์คํฌ ๊ณต๊ฐ ๋๋ฆฌ๊ธฐ / ์ฌ์ ๊ณต๊ฐ ํ๋ณดํ๊ธฐ
[AWS] EC2 ๋์คํฌ ๊ณต๊ฐ ๋๋ฆฌ๊ธฐ / ์ฌ์ ๊ณต๊ฐ ํ๋ณดํ๊ธฐ
2024.04.30 -
[JS] ์ ๊ท์์ผ๋ก ๊ฒ์์ด ํ์ด๋ผ์ดํธ / ๋ฌธ์์ด ๋งํฌ ๊ฑธ๊ธฐ(Linkify)
[JS] ์ ๊ท์์ผ๋ก ๊ฒ์์ด ํ์ด๋ผ์ดํธ / ๋ฌธ์์ด ๋งํฌ ๊ฑธ๊ธฐ(Linkify)
2024.04.30 -
[React] ๋ฆฌ์กํธ๋ก ์ค์๊ฐ ๊ฒ์์ฐฝ ๊ตฌํํ๊ธฐ
[React] ๋ฆฌ์กํธ๋ก ์ค์๊ฐ ๊ฒ์์ฐฝ ๊ตฌํํ๊ธฐ
2024.04.30 -
[HTML/CSS] ํผ ํ๋(input) ์์ ๋ณ๊ฒฝํ๊ธฐ — accent-color
[HTML/CSS] ํผ ํ๋(input) ์์ ๋ณ๊ฒฝํ๊ธฐ — accent-color
2024.04.29