사용자들이 공통적으로 자주 요청하게 되는 end-point의 데이터는 미리 Cache해놓으면, 다음번에는 더 빠르게 데이터를 응답해줄 수 있습니다.
그럼 Express에서는 Caching을 어떻게 진행할까요?
Redis를 사용하여 진행합니다.
Redis는 Remote Dictionary Server의 약자로, "key-value" 구조의 데이터를 저장하고 관리하는 비관계형 데이터베이스 관리 시스템입니다.
메모리에서 데이터를 처리하기 때문에 속도가 상당히 빠릅니다.
그래서, 이번 포스트에서는 Redis에 데이터를 저장하고 캐싱해보겠습니다.
yarn add redis
혹은 npm install redis
const redis = require('redis');
const redisClient = redis.createClient(process.env.REDIS_PORT);
// redis에 데이터 저장
const set = (key, value) => {
redisClient.set(key, JSON.stringify(value));
};
// 저장 된 데이터를 redis에서 가져오는 미들웨어
const get = (req, res, next) => {
// End-Point의 url을 key로 설정
let key = req.originalUrl;
redisClient.get(key, (error, data) => {
if (error) {
res.status(400).send({
ok: false,
message: error,
});
}
if (data !== null) {
// 데이터가 cache되어 있으면, parsing하여 response
res.status(200).send({
ok: true,
data: JSON.parse(data),
});
} else next();
});
};
module.exports = {
set,
get,
};
const express = require('express');
const { getItems } = require('./getItemList');
const { get } = require('../../utils/cache');
const router = express.Router();
// cache되어 있으면 get 미들웨어에서 데이터 반환
router.get('/', get, getItems);
module.exports = router;
...
const { set } = require('../../utils/cache');
const getItems = async (req, res) => {
...
if (items.length) {
// 데이터 caching하고 response
set(req.originalUrl, items);
res.status(200).send({
ok: true,
data: items,
});
} else {
res.status(404).send({
ok: false,
message: 'No more pages',
});
}
};