[javascript] 프로미스를 사용한 캐싱 및 메모이제이션 기법

프로미스는 JavaScript에서 비동기 작업을 다룰 때 매우 유용한 도구입니다. 그런데 프로미스는 한 번 실행된 후에는 캐싱되지 않으므로 같은 작업을 여러 번 실행해야 할 때 매번 비동기 작업을 수행해야 합니다. 이러한 문제를 해결하기 위해 프로미스를 사용한 캐싱 및 메모이제이션 기법을 적용할 수 있습니다.

1. 캐싱 기법

캐싱은 이전에 수행한 작업의 결과를 저장하여 동일한 작업을 다시 실행할 때 저장된 결과를 반환하는 것을 말합니다. 프로미스를 사용한 캐싱을 구현하기 위해서는 캐시를 저장할 객체를 만들고, 그 안에 결과를 저장하고 반환하는 로직을 구현해야 합니다. 이를 위해 다음 코드를 참고해보세요.

const cache = {};

function myFunction(arg) {
  if (cache[arg]) {
    return Promise.resolve(cache[arg]);
  }

  return new Promise((resolve, reject) => {
    // 비동기 작업 수행
    // 결과를 resolve로 반환
    // 결과를 cache[arg]에 저장
  });
}

위의 코드에서 cache 객체는 결과를 저장할 캐시입니다. myFunction 함수에서는 입력값 arg를 키로 사용해 캐시에 저장된 결과를 확인하고, 결과가 존재하면 즉시 Promise를 반환하여 동일한 작업을 다시 수행하지 않도록 합니다. 결과가 캐시에 없는 경우에는 실제 비동기 작업을 수행하고, 작업이 완료된 후에 결과를 resolve로 반환하고 캐시에 저장합니다.

2. 메모이제이션 기법

메모이제이션은 함수의 결과를 저장하여 동일한 인자로 함수를 호출할 때 이전에 계산한 결과를 반환하는 것을 말합니다. 프로미스를 사용한 메모이제이션을 구현하기 위해서는 메모이제이션을 위한 캐시와 메모이제이션 로직을 구현해야 합니다. 다음 코드를 참고해보세요.

const cache = new Map();

function memoizedFunction(arg) {
  if (cache.has(arg)) {
    return Promise.resolve(cache.get(arg));
  }

  return new Promise((resolve, reject) => {
    // 비동기 작업 수행
    // 결과를 resolve로 반환
    // 결과를 cache에 저장
    cache.set(arg, result);
  });
}

위의 코드에서는 cache라는 맵 객체를 사용하여 결과를 저장합니다. memoizedFunction 함수에서는 입력값 arg를 키로 사용해 캐시에 저장된 결과를 확인하고, 결과가 존재하면 즉시 Promise를 반환합니다. 결과가 캐시에 없는 경우에는 비동기 작업을 수행하고, 작업이 완료된 후에 결과를 resolve로 반환하고 캐시에 저장합니다.

결론

프로미스를 사용한 캐싱 및 메모이제이션 기법은 동일한 작업을 반복적으로 수행해야 할 때 비동기 작업을 최적화할 수 있는 좋은 방법입니다. 위에서 소개한 캐싱 및 메모이제이션 예제를 참고하여 자신의 프로미스 기반 비동기 코드에 적용해보세요. 이를 통해 작업 속도를 향상시킬 수 있습니다.

참고 자료