[nodejs] 콜백 지옥과 비동기 프로그래밍

많은 Node.js 개발자들이 맞닥뜨리는 문제 중 하나가 콜백 지옥입니다. 이는 비동기 콜백 함수의 중첩이 깊어지면서 코드가 상당히 복잡해지고 가독성이 떨어지는 현상을 말합니다.

콜백 지옥의 예

예를 들어, 파일을 읽은 후 그 결과를 가지고 데이터베이스에 쓰는 동작을 작성한다고 가정해봅시다.

fs.readFile('file1.txt', function(err, data1) {
    if (err) throw err;
    db.write('file1', data1, function(err) {
        if (err) throw err;
        fs.readFile('file2.txt', function(err, data2) {
            if (err) throw err;
            db.write('file2', data2, function(err) {
                if (err) throw err;
                // 더 많은 콜백 함수들...
            });
        });
    });
});

이처럼 콜백 지옥은 코드를 복잡하게 만들며 유지 보수가 어렵게 만듭니다.

해결책: Promise와 async/await

Node.js에서는 Promiseasync/await을 통해 콜백 지옥을 해결할 수 있습니다.

Promise는 비동기 작업의 결과를 나타내는 객체로, 비동기 작업이 성공 또는 실패했을 때의 결과에 따라 처리를 할 수 있도록 합니다.

function readFileAsync(filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, (err, data) => {
            if (err) reject(err);
            else resolve(data);
        });
    });
}

readFileAsync('file1.txt')
    .then(data1 => db.write('file1', data1))
    .then(() => readFileAsync('file2.txt'))
    .then(data2 => db.write('file2', data2))
    .then(() => {
        // 더 많은 비동기 작업들...
    })
    .catch(err => console.error(err));

async/await를 사용하면 Promise 기반의 비동기 코드를 동기식으로 작성할 수 있습니다. 위의 예제를 async/await를 사용하여 다음과 같이 변경할 수 있습니다.

async function processFiles() {
    try {
        const data1 = await readFileAsync('file1.txt');
        await db.write('file1', data1);
        const data2 = await readFileAsync('file2.txt');
        await db.write('file2', data2);
        // 더 많은 비동기 작업들...
    } catch (err) {
        console.error(err);
    }
}

processFiles();

이렇게 Promise와 async/await을 사용하면 콜백 지옥을 피하고 비동기 코드를 보다 간결하고 가독성있게 작성할 수 있습니다.

콜백 지옥에 빠지지 않고 비동기 코드를 작성하기 위해 Promise와 async/await을 잘 활용해보세요.