IT/NodeJS

Node.js에서 비동기 함수 최적화 방법

KeepGooing 2024. 11. 21. 14:05
반응형

1. 병렬 실행

독립적인 비동기 작업을 병렬로 실행하여 전체 실행 시간을 단축할 수 있습니다.

async function optimizedGetFruits() {
    console.time('getFruits');
    const applePromise = getApple();
    const bananaPromise = getBanana();
    const [apple, banana] = await Promise.all([applePromise, bananaPromise]);
    console.log(`${apple} and ${banana}`);
    console.timeEnd('getFruits');
}

optimizedGetFruits();
        

설명: Promise.all을 사용하여 여러 비동기 작업을 동시에 시작하고 모든 작업이 완료될 때까지 기다립니다. 이 방법은 각 작업이 서로 독립적일 때 특히 효과적입니다.

2. 캐싱 활용

자주 사용되는 비동기 작업의 결과를 캐싱하여 불필요한 반복 작업을 줄일 수 있습니다.

const cache = new Map();

async function getCachedData(key) {
    if (cache.has(key)) {
        return cache.get(key);
    }
    const data = await fetchDataFromDatabase(key);
    cache.set(key, data);
    return data;
}
        

설명: 데이터베이스 쿼리와 같은 비용이 큰 작업의 결과를 메모리에 캐싱합니다. 이후 동일한 요청이 들어오면 캐시된 결과를 반환하여 성능을 향상시킵니다.

3. async/await 활용

async/await를 사용하여 비동기 코드를 더 읽기 쉽고 관리하기 쉽게 만들 수 있습니다.

async function processData() {
    try {
        const data = await fetchData();
        const processedData = await processData(data);
        await saveData(processedData);
        console.log('Data processing completed');
    } catch (error) {
        console.error('Error processing data:', error);
    }
}
        

설명: async/await를 사용하면 비동기 코드를 동기 코드처럼 작성할 수 있어 가독성이 향상되고 에러 처리가 용이해집니다.

4. 효과적인 에러 처리

비동기 함수에서 발생할 수 있는 에러를 적절히 처리하여 애플리케이션의 안정성을 높입니다.

async function safeAsyncOperation() {
    try {
        const result = await riskyAsyncOperation();
        return result;
    } catch (error) {
        console.error('An error occurred:', error);
        // 에러 로깅, 사용자에게 알림 등의 처리
        throw error; // 필요한 경우 에러를 상위로 전파
    }
}
        

설명: try-catch 블록을 사용하여 비동기 작업에서 발생할 수 있는 에러를 포착하고 적절히 처리합니다. 이는 애플리케이션의 안정성과 사용자 경험을 향상시킵니다.

5. 메모리 관리 최적화

비동기 작업에서 메모리 사용을 최적화하여 성능을 향상시킵니다.

const fs = require('fs');
const stream = fs.createReadStream('largeFile.txt');

stream.on('data', (chunk) => {
    // 청크 단위로 데이터 처리
    processChunk(chunk);
});

stream.on('end', () => {
    console.log('File processing completed');
});
        

설명: 대용량 데이터를 처리할 때는 스트림을 사용하여 메모리 사용을 최적화합니다. 이 방법은 전체 파일을 메모리에 로드하지 않고 청크 단위로 처리하므로 메모리 효율성이 높아집니다.

결론

Node.js에서 비동기 함수를 최적화하는 것은 애플리케이션의 성능과 확장성을 크게 향상시킬 수 있습니다. 병렬 실행, 캐싱, async/await 활용, 효과적인 에러 처리, 그리고 메모리 관리 최적화 등의 기법을 적절히 조합하여 사용하면, 더 효율적이고 안정적인 Node.js 애플리케이션을 개발할 수 있습니다. 각 기법의 적용은 프로젝트의 특성과 요구사항에 따라 신중히 고려해야 하며, 지속적인 성능 모니터링과 최적화가 필요합니다.

반응형