[nodejs] 비동기 I/O 작업

Node.js는 단일 쓰레드 이벤트 루프를 사용하여 비동기 I/O 작업을 처리하는 데 강점을 가지고 있습니다. 이를 통해 높은 성능과 확장성을 제공합니다.

비동기 I/O란?

비동기 I/O는 입출력 작업을 수행할 때, 결과를 기다리지 않고 다른 작업을 수행하는 방식을 말합니다. Node.js는 이를 효율적으로 처리하여 여러 개의 I/O 작업을 동시에 다룰 수 있습니다.

콜백 함수

Node.js에서는 콜백 함수를 사용하여 비동기 함수의 작업이 완료되면 특정 작업을 수행하도록 합니다.

예를 들어, 파일을 읽는 작업을 수행하는 fs.readFile 함수는 다음과 같이 사용할 수 있습니다.

const fs = require('fs');

fs.readFile('file.txt', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

위 예제에서는 readFile 함수의 결과를 기다리지 않고, 콜백 함수를 등록하여 파일을 읽은 후에 작업을 수행하도록 설정했습니다.

Promise와 Async/Await

Node.js 8버전 이후부터는 Promise와 Async/Await을 지원하여 비동기 작업을 보다 간편하게 다룰 수 있습니다.

예를 들어, Promise를 사용하여 파일을 읽는 작업을 다음과 같이 수행할 수 있습니다.

const fs = require('fs');

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

readFileAsync('file.txt')
  .then(data => {
    console.log(data);
  })
  .catch(err => {
    console.error(err);
  });

또는 Async/Await을 사용하여 다음과 같이 작성할 수도 있습니다.

const fs = require('fs');

async function readAndPrintFile(path) {
  try {
    const data = await fs.promises.readFile(path);
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readAndPrintFile('file.txt');

결론

Node.js의 비동기 I/O는 콜백 함수, Promise, Async/Await을 통해 효율적으로 다룰 수 있습니다. 이를 통해 높은 성능과 확장성을 제공하는 Node.js의 핵심적인 특징 중 하나입니다.

참고문헌: Node.js 공식 문서