백엔드 개발에서 REST API를 설계할 때, 성능을 극대화하고 응답 시간을 단축시키기 위한 다양한 방법들이 존재합니다. 그중에서도 캐싱 전략은 자주 사용되는 기법 중 하나입니다. 이번 글에서는 Node.js를 사용하여 REST API의 캐싱 전략을 어떻게 구현할 수 있는지 살펴보겠습니다.
캐싱의 필요성
REST API는 클라이언트와 서버 간의 데이터 전송을 원활하게 하기 위해 설계되었습니다. 하지만 데이터 요청이 빈번하게 발생할 경우, 매번 데이터베이스에 접근하는 것은 성능 저하를 초래할 수 있습니다. 이때 캐싱을 통해 자주 요청되는 데이터를 미리 저장해 두면 응답 속도를 크게 향상시킬 수 있습니다.
캐싱 전략 개요
캐싱 전략은 크게 두 가지로 나눌 수 있습니다.
- 서버 사이드 캐싱: 서버에서 직접 캐시를 관리하고 클라이언트의 요청을 처리합니다.
- 클라이언트 사이드 캐싱: 클라이언트가 직접 데이터를 캐싱하여 서버와의 통신을 최소화합니다.
- TTL(Time To Live): 캐시된 데이터의 유효 시간을 설정합니다.
- 수동 무효화: 데이터가 변경될 때마다 캐시에 저장된 데이터를 수동으로 삭제합니다.
- 이벤트 기반 무효화: 특정 이벤트가 발생할 때 캐시를 무효화합니다.
이번 글에서는 서버 사이드 캐싱에 중점을 두고 설명하겠습니다.
Node.js에서의 캐싱 구현
Node.js에서는 다양한 라이브러리를 사용하여 캐싱을 구현할 수 있습니다. 그중에서도 node-cache 라이브러리가 간단하면서도 유용합니다. 이 라이브러리를 사용하여 REST API의 캐싱을 어떻게 구현할 수 있는지 살펴보겠습니다.
1. node-cache 설치
먼저 node-cache를 설치해야 합니다. 다음 명령어를 사용하여 설치하세요.
npm install node-cache
2. 캐시 설정 및 API 구현
아래는 간단한 Express.js 기반의 REST API와 캐시를 적용한 예제입니다.
const express = require('express');
const NodeCache = require('node-cache');
const app = express();
const port = 3000;
// 캐시 설정
const cache = new NodeCache({ stdTTL: 100, checkperiod: 120 });
// 더미 데이터
const data = {
id: 1,
name: 'Node.js',
description: 'Node.js is a JavaScript runtime built on Chrome\'s V8 JavaScript engine.',
};
// API 엔드포인트
app.get('/api/data/:id', (req, res) => {
const id = req.params.id;
// 캐시에서 데이터 검색
const cachedData = cache.get(id);
if (cachedData) {
console.log('캐시에서 데이터 반환');
return res.json(cachedData);
}
// 캐시가 없을 경우, 데이터베이스에서 조회 (여기서는 더미 데이터 사용)
if (data.id == id) {
cache.set(id, data);
console.log('데이터베이스에서 데이터 반환');
return res.json(data);
} else {
return res.status(404).json({ message: '데이터를 찾을 수 없습니다.' });
}
});
// 서버 시작
app.listen(port, () => {
console.log(서버가 http://localhost:${port} 에서 실행 중입니다.);
});
3. 동작 원리 설명
위 코드에서는 /api/data/:id 엔드포인트를 통해 요청된 ID에 대한 데이터를 제공합니다. 요청이 들어오면, 먼저 캐시에서 해당 ID에 대한 데이터를 검색합니다. 데이터가 캐시에 존재하면 그 데이터를 반환하고, 없으면 더미 데이터(여기서는 정적 데이터)를 사용하여 응답합니다. 그 후, 새로운 데이터를 캐시에 저장하여 다음 요청에 대비합니다.
이와 같은 방식으로 캐시를 구현하면 데이터베이스에 대한 요청을 줄일 수 있으며, 응답 시간을 획기적으로 단축할 수 있습니다.
4. 캐시 무효화 전략
캐싱을 사용할 때, 데이터가 변경될 가능성도 고려해야 합니다. 데이터가 변경되면 캐시된 데이터가 오래된 정보가 될 수 있습니다. 이를 방지하기 위해 다음과 같은 방법을 사용할 수 있습니다:
위의 예제에서 stdTTL을 사용하여 데이터의 유효 시간을 설정했습니다. 필요에 따라 데이터베이스의 데이터가 변경될 때 캐시를 삭제하는 로직을 추가할 수 있습니다.
마무리
Node.js를 사용하여 REST API의 캐싱 전략을 구현하는 방법에 대해 살펴보았습니다. 캐싱은 서버의 성능을 향상시키고, 사용자 경험을 개선하는 중요한 요소입니다. 이번 글에서 소개한 node-cache 라이브러리를 통해 간단하게 캐시를 적용할 수 있으며, 필요에 따라 다양한 캐싱 전략을 조합하여 사용하시면 됩니다. 캐싱을 통해 더 나은 백엔드 서비스를 만들어 보시기 바랍니다.