[nodejs] 비동기식 코드 리팩토링

Node.js에서 비동기식 코드를 작성할 때 코드의 가독성을 높이고 유지보수성을 향상시키기 위해 리팩토링하는 것이 중요합니다. 이 글에서는 비동기식 코드를 개선하기 위한 몇 가지 팁을 소개하겠습니다.

목차

Callback 함수 대신 Promise나 Async/Await 사용

기존의 콜백 함수를 사용한 비동기식 코드는 콜백 지옥(callback hell)을 초래할 수 있습니다. 이러한 문제점을 해결하기 위해 Promise나 async/await을 사용하는 것이 좋습니다.

// 콜백 함수
getData(function(err, data) {
  if (err) {
    console.error(err);
  } else {
    processData(data, function(err, result) {
      if (err) {
        console.error(err);
      } else {
        saveData(result, function(err) {
          if (err) {
            console.error(err);
          } else {
            console.log('Data saved successfully');
          }
        });
      }
    });
  }
});

// Promise
getData()
  .then(data => processData(data))
  .then(result => saveData(result))
  .then(() => console.log('Data saved successfully'))
  .catch(err => console.error(err));

// Async/Await
try {
  const data = await getData();
  const result = await processData(data);
  await saveData(result);
  console.log('Data saved successfully');
} catch (err) {
  console.error(err);
}

모듈화 및 함수 분리

코드를 작게 분리하고 모듈화하여 각각의 함수가 명확한 역할을 수행하도록 하는 것이 좋습니다.

// 비모듈화된 코드
function getDataAndProcess() {
  fetchData(function(err, data) {
    if (err) {
      console.error(err);
    } else {
      processData(data, function(err, result) {
        if (err) {
          console.error(err);
        } else {
          saveData(result, function(err) {
            if (err) {
              console.error(err);
            } else {
              console.log('Data saved successfully');
            }
          });
        }
      });
    }
  });
}

// 모듈화된 코드
function getDataAndProcess() {
  getData()
    .then(processData)
    .then(saveData)
    .then(() => console.log('Data saved successfully'))
    .catch(err => console.error(err));
}

에러 핸들링

비동기식 코드에서 에러를 적절하게 처리하는 것은 매우 중요합니다. Promise나 async/await을 사용할 때는 .catch()를 이용하여 에러를 처리하고, 콜백 함수에서는 에러를 첫 번째 인자로 전달하여 처리할 수 있습니다.

// Promise 에러 핸들링
getData()
  .then(data => processData(data))
  .then(result => saveData(result))
  .then(() => console.log('Data saved successfully'))
  .catch(err => console.error(err));

// Async/Await 에러 핸들링
try {
  const data = await getData();
  const result = await processData(data);
  await saveData(result);
  console.log('Data saved successfully');
} catch (err) {
  console.error(err);
}

이러한 팁을 활용하여 비동기식 코드를 개선하면 가독성이 증가하고 유지보수가 용이해질 것입니다.

참고: MDN Web Docs - Promises, MDN Web Docs - Async/Await