[javascript] Express.js에서의 캐싱 기법

Express.js는 Node.js를 기반으로 한 웹 애플리케이션 프레임워크로, 많은 개발자들이 사용하고 있습니다. 이러한 Express.js를 효율적으로 사용하기 위해서는 캐싱 기법을 잘 활용하는 것이 중요합니다. 이 글에서는 Express.js에서 캐싱을 구현하는 다양한 기법을 알아보겠습니다.

1. 메모리 캐싱

Express.js에서 가장 간단한 캐싱 기법은 메모리 캐싱입니다. 이는 서버의 메모리에 데이터를 저장하고, 다음에 동일한 요청이 들어올 경우에는 메모리에 저장된 데이터를 사용하는 방식입니다. 아래는 메모리 캐싱을 구현하는 예제 코드입니다.

const cache = {};

app.get('/data', (req, res) => {
  if (cache.data) {
    res.send(cache.data);
  } else {
    // 데이터를 가져와서 cache에 저장
    const data = fetchData();
    cache.data = data;
    res.send(data);
  }
});

위 예제 코드에서는 /data 경로로 요청이 들어올 경우, 먼저 cache 객체에 저장된 데이터를 확인하고 있을 경우에는 그 값을 응답으로 보내줍니다. 만약 데이터가 캐싱되어 있지 않을 경우에는 데이터를 가져와서 cache에 저장하고 응답으로 보내줍니다. 이러한 방식으로 간단하게 메모리 캐싱을 구현할 수 있습니다.

2. 파일 캐싱

메모리 캐싱은 간단하고 빠르지만, 서버를 재시작하면 캐시된 데이터가 모두 사라지게 됩니다. 만약 서버를 재시작해도 캐싱된 데이터를 유지하고 싶다면 파일 캐싱을 사용할 수 있습니다. 파일 캐싱은 데이터를 파일로 저장하고, 필요할 때마다 파일에서 읽어온 뒤 사용하는 방식입니다. 아래는 파일 캐싱을 구현하는 예제 코드입니다.

const fs = require('fs');
const cacheFilePath = 'cache.txt';

app.get('/data', (req, res) => {
  if (fs.existsSync(cacheFilePath)) {
    const data = fs.readFileSync(cacheFilePath);
    res.send(data);
  } else {
    // 데이터를 가져와서 파일에 저장
    const data = fetchData();
    fs.writeFileSync(cacheFilePath, data);
    res.send(data);
  }
});

위 예제 코드에서는 /data 경로로 요청이 들어올 경우, 먼저 파일이 존재하는지 확인하고 있을 경우에는 파일에서 데이터를 읽어와서 응답으로 보내줍니다. 파일이 존재하지 않을 경우에는 데이터를 가져와서 파일에 저장하고 응답으로 보내줍니다. 이러한 방식으로 파일 캐싱을 구현할 수 있습니다.

3. 외부 캐싱 서비스 사용

메모리 캐싱이나 파일 캐싱은 비교적 간단한 캐싱 기법이지만, 서버를 클러스터링하거나 여러 대의 서버를 사용하는 경우에는 캐시 데이터의 공유가 어렵습니다. 이런 경우 외부 캐싱 서비스를 사용하여 캐싱을 구현할 수 있습니다. 점점 더 많은 개발자들이 Redis나 Memcached와 같은 외부 캐싱 서비스를 사용하여 Express.js 애플리케이션의 성능을 향상시키고 있습니다.

아래는 Redis를 사용한 캐싱 예제 코드입니다.

const redis = require('redis');
const redisClient = redis.createClient();

app.get('/data', (req, res) => {
  redisClient.get('data', (err, reply) => {
    if (reply) {
      res.send(reply);
    } else {
      // 데이터를 가져와서 Redis에 저장
      const data = fetchData();
      redisClient.set('data', data);
      res.send(data);
    }
  });
});

위 예제 코드에서는 Redis 클라이언트를 생성한 뒤, /data 경로로 요청이 들어올 경우 Redis에서 데이터를 확인하고 있을 경우에는 그 값을 응답으로 보내줍니다. 데이터가 존재하지 않을 경우에는 데이터를 가져와서 Redis에 저장하고 응답으로 보내줍니다. 이러한 방식으로 외부 캐싱 서비스를 활용할 수 있습니다.

결론

Express.js에서 캐싱 기법을 활용하면 데이터를 빠르게 처리하고 애플리케이션의 성능을 향상시킬 수 있습니다. 메모리 캐싱, 파일 캐싱, 외부 캐싱 서비스를 적절히 사용하여 캐싱을 구현해보세요. 이를 통해 사용자들에게 더 나은 사용 경험을 제공할 수 있습니다.