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