🛠️ 처음부터 만드는 LRU Cache — 가장 오래된 데이터를 자동으로 버리기
캐시는 빠르지만, 메모리는 무한하지 않습니다. LRU(Least Recently Used) Cache는 가장 오랫동안 사용하지 않은 데이터를 자동으로 제거하는 전략입니다.
`Map`은 삽입 순서를 기억합니다. 데이터에 접근할 때마다 해당 항목을 삭제 후 다시 삽입하면, 가장 오래된 항목이 항상 맨 앞에 위치합니다.
```javascript
function createLRUCache(capacity) {
const cache = new Map();
return {
get(key) {
if (!cache.has(key)) return undefined;
const value = cache.get(key);
cache.delete(key);
cache.set(key, value); // 맨 뒤로 이동 → 최근 사용
return value;
},
set(key, value) {
if (cache.has(key)) cache.delete(key);
cache.set(key, value);
if (cache.size > capacity) {
// Map.keys()의 첫 번째 = 가장 오래된 항목
const oldest = cache.keys().next().value;
cache.delete(oldest);
}
},
get size() {
return cache.size;
},
};
}
```
```javascript
const cache = createLRUCache(3);
cache.set('a', 1);
cache.set('b', 2);
cache.set('c', 3);
cache.get('a'); // 1 — 'a'가 최근 사용됨
cache.set('d', 4); // 용량 초과 → 'b' 제거 (가장 오래됨)
cache.get('b'); // undefined
```
LRU Cache는 브라우저 캐시, DNS 캐시, 데이터베이스 쿼리 캐시 등 거의 모든 시스템에서 사용됩니다. `Map`의 순서 보장 특성을 활용하면 O(1) 시간복잡도로 `get`과 `set` 모두 처리할 수 있습니다.
> 💡 실전 팁: Node.js에서는 [`lru-cache`](https://www.npmjs.com/package/lru-cache) 패키지가 TTL, 크기 기반 제거 등 고급 기능을 제공합니다. 원리를 이해한 뒤 실무에서는 검증된 라이브러리를 사용하세요.
핵심 아이디어
`Map`은 삽입 순서를 기억합니다. 데이터에 접근할 때마다 해당 항목을 삭제 후 다시 삽입하면, 가장 오래된 항목이 항상 맨 앞에 위치합니다.
구현
```javascript
function createLRUCache(capacity) {
const cache = new Map();
return {
get(key) {
if (!cache.has(key)) return undefined;
const value = cache.get(key);
cache.delete(key);
cache.set(key, value); // 맨 뒤로 이동 → 최근 사용
return value;
},
set(key, value) {
if (cache.has(key)) cache.delete(key);
cache.set(key, value);
if (cache.size > capacity) {
// Map.keys()의 첫 번째 = 가장 오래된 항목
const oldest = cache.keys().next().value;
cache.delete(oldest);
}
},
get size() {
return cache.size;
},
};
}
```
사용 예시
```javascript
const cache = createLRUCache(3);
cache.set('a', 1);
cache.set('b', 2);
cache.set('c', 3);
cache.get('a'); // 1 — 'a'가 최근 사용됨
cache.set('d', 4); // 용량 초과 → 'b' 제거 (가장 오래됨)
cache.get('b'); // undefined
```
왜 중요한가요?
LRU Cache는 브라우저 캐시, DNS 캐시, 데이터베이스 쿼리 캐시 등 거의 모든 시스템에서 사용됩니다. `Map`의 순서 보장 특성을 활용하면 O(1) 시간복잡도로 `get`과 `set` 모두 처리할 수 있습니다.
> 💡 실전 팁: Node.js에서는 [`lru-cache`](https://www.npmjs.com/package/lru-cache) 패키지가 TTL, 크기 기반 제거 등 고급 기능을 제공합니다. 원리를 이해한 뒤 실무에서는 검증된 라이브러리를 사용하세요.
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!