[nodejs] 비동기식 플로우 제어

Node.js는 비동기식 프로그래밍 환경을 가지고 있어 많은 개발자들이 비동기식 코드를 작성하는데 익숙합니다. 하지만 때로는 여러 비동기 작업들을 조정하거나, 순차적으로 실행해야 하는 경우가 있습니다. 이런 상황에서는 콜백 지옥(callback hell)에 빠질 수 있고 코드를 관리하기 어려워질 수 있습니다. 이런 문제를 해결하기 위해 Node.js는 다양한 방법을 제공하고 있습니다.

콜백 사용하기

첫 번째 방법은 기본적으로 콜백(callback)을 사용하는 것입니다. 하지만, 콜백을 여러 개 중첩해서 사용하다 보면 코드가 복잡해지고 가독성이 떨어질 수 있습니다.

doTask1(function(result1) {
  doTask2(result1, function(result2) {
    doTask3(result2, function(result3) {
      // ...
    });
  });
});

Promise 활용

Promise는 ES6부터 도입된 개념으로, 비동기 처리를 보다 간편하게 할 수 있도록 도와줍니다.

doTask1()
  .then(result1 => {
    return doTask2(result1);
  })
  .then(result2 => {
    return doTask3(result2);
  })
  .then(result3 => {
    // ...
  })
  .catch(error => {
    // error handling
  });

async/await 활용

ES8(또는 ES2017)에서 도입된 async/await는 Promise를 더 쉽게 다룰 수 있게 해줍니다.

async function myFunction() {
  try {
    const result1 = await doTask1();
    const result2 = await doTask2(result1);
    const result3 = await doTask3(result2);
    // ...
  } catch (error) {
    // error handling
  }
}

RxJS 활용

RxJS는 Observables와 마치 스트림처럼 작업을 처리할 수 있도록 도와주는 라이브러리입니다.

const { from } = require('rxjs');
const { mergeMap, toArray } = require('rxjs/operators');

from(doTask1())
  .pipe(
    mergeMap(result1 => doTask2(result1)),
    mergeMap(result2 => doTask3(result2)),
    toArray()
  )
  .subscribe(
    finalResults => {
      // ...
    },
    error => {
      // error handling
    }
  );

Node.js는 위와 같은 다양한 방법을 제공하여 비동기식 플로우를 쉽게 제어할 수 있도록 도와줍니다. 개발자는 상황에 맞게 가장 적합한 방법을 선택하여 비동기 코드를 관리할 수 있습니다.

참고 자료