[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에서는 Promise와 async/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을 잘 활용해보세요.