🛠️ 처음부터 만드는 Memoize — 함수 결과를 캐싱하는 고차 함수
문제: 비싼 함수를 몇 번이나 호출할 건가?
```javascript
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci(40); // 2초 소요, fibonacci(39)·fibonacci(38)·... 수천 번 중복 계산!
```
매번 같은 입력값이 들어오는데 같은 결과를 반복 계산하는 낭비를 막아봅시다.
기본 구현: 5줄 Memoize
```javascript
function memoize(fn) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
return key in cache ? cache[key] : (cache[key] = fn(...args));
};
}
const memoFib = memoize(fibonacci);
memoFib(40); // 첫 호출: 2초 | 두 번째: 즉시 완료
```
개선: WeakMap으로 메모리 누수 방지
object를 키로 사용할 때 메모리가 쌓이는 문제를 해결합니다:
```javascript
function memoize(fn) {
const cache = new WeakMap();
return function(arg) {
if (typeof arg === 'object' && arg !== null) {
if (!cache.has(arg)) cache.set(arg, fn(arg));
return cache.get(arg);
}
// 원시값은 Map 사용
return fn(arg);
};
}
```
실무 팁: API 응답 캐싱
```javascript
const getCachedUser = memoize(async (userId) => {
return fetch(`/api/users/${userId}`).then(r => r.json());
});
// 동일 userId 재요청 → 네트워크 호출 없이 캐시 반환
await getCachedUser(1);
await getCachedUser(1); // 즉시 반환
```
주의: 비동기 함수는 Promise를 캐싱합니다 (결과값 아님). TTL(Time-To-Live)이 필요하면 `set timeout으로 캐시 만료 구현`을 추가하세요.
[공식 문서: 고차 함수(Higher-Order Function)](https://developer.mozilla.org/en-US/docs/Glossary/Higher-order_function)
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!