Express로 만든 API를 Redis로 Cache하기

kshired·2021년 6월 6일
2

사용자들이 공통적으로 자주 요청하게 되는 end-point의 데이터는 미리 Cache해놓으면, 다음번에는 더 빠르게 데이터를 응답해줄 수 있습니다.

그럼 Express에서는 Caching을 어떻게 진행할까요?
Redis를 사용하여 진행합니다.

Redis?

Redis는 Remote Dictionary Server의 약자로, "key-value" 구조의 데이터를 저장하고 관리하는 비관계형 데이터베이스 관리 시스템입니다.

메모리에서 데이터를 처리하기 때문에 속도가 상당히 빠릅니다.

그래서, 이번 포스트에서는 Redis에 데이터를 저장하고 캐싱해보겠습니다.

Redis 설정하기

  1. redis 설치하기
    • 이 부분은 인터넷 검색으로 하실 수 있으니 대체.
  2. redis 패키지 설치
    yarn add redis 혹은 npm install redis
  3. caching을 위한 미들웨어 및 유틸리티 함수 작성
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,
};

API에 적용하기

  1. 사용 할 end-point의 router에 미들웨어 추가
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;
  1. router의 콜백함수에 set 적용하기
...
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',
    });
  }
};
profile
글 쓰는 개발자

0개의 댓글