ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JavaScript) Express에 Redis로 Cache 적용해보기
    Programing Language/JavaScript 2021. 11. 14. 23:01
    728x90
    반응형

    사용자들이 공통적으로 자주 요청하게 되는 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',
        });
      }
    };
    728x90
    반응형
Designed by Tistory.