[nodejs] 비동기식 프로그래밍과 예외 처리

본 블로그에서는 Node.js에서의 비동기식 프로그래밍과 예외 처리에 대해 다루고자 합니다.

비동기식 프로그래밍

Node.js는 단일 스레드 이벤트 루프를 사용하여 비동기식 프로그래밍을 지원합니다. 이는 I/O 처리나 네트워크 요청과 같은 작업을 기다리는 동안 다른 작업을 수행할 수 있게 합니다.

비동기식 코드에서는 주로 콜백 함수Promise를 사용하여 작업을 완료하고 결과를 처리합니다. 콜백 함수를 사용할 때는 에러 우선 콜백 방식을 따라야 합니다. 이는 첫 번째 매개변수로 에러를 전달하고, 두 번째 매개변수로 결과를 전달하는 방식을 말합니다.

fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('에러 발생:', err);
    return;
  }
  console.log('파일 내용:', data);
});

Promise를 사용할 때는 thencatch 메서드를 사용하여 성공 또는 실패 결과를 처리합니다.

function readFile() {
  return new Promise((resolve, reject) => {
    fs.readFile('file.txt', 'utf8', (err, data) => {
      if (err) {
        reject(err);
      }
      resolve(data);
    });
  });
}

readFile()
  .then(data => {
    console.log('파일 내용:', data);
  })
  .catch(err => {
    console.error('에러 발생:', err);
  });

예외 처리

Node.js에서는 try-catch 문을 사용하여 동기식 코드와 마찬가지로 예외를 처리할 수 있지만, 비동기식 코드에서는 주의가 필요합니다. 비동기 함수 내에서 발생한 예외는 해당 함수 내에서만 처리되며, 호출자에게 전달되지 않습니다. 이러한 이유로 콜백 함수나 Promise 안에서 발생한 예외는 해당 함수 내에서 처리해주어야 합니다.

try {
  // 비동기 함수 호출
  someAsyncFunction((err, result) => {
    if (err) {
      console.error('비동기 함수에서 발생한 에러:', err);
      return;
    }
    console.log('비동기 함수 결과:', result);
  });
} catch (err) {
  console.error('try-catch에서 처리되지 않는 에러:', err);
}

Node.js 8부터는 process.on('unhandledRejection') 이벤트를 통해 Promise에 reject 핸들러를 등록하여 관리되지 않는 Promise reject를 처리할 수 있습니다.

process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled Rejection 발생:', reason);
  // 적절한 처리
});

마치며

Node.js에서의 비동기식 프로그래밍과 예외 처리는 핵심적인 주제입니다. 제대로 이해하고 적절히 다루는 것이 안정적이고 성능 좋은 애플리케이션을 만드는 데 중요합니다.

더 자세한 내용은 Node.js 공식 문서를 참고하시기 바랍니다.

간편한 사용을 위해 Node.js 비동기식 처리 패턴Bluebird Promise 라이브러리도 함께 고려해볼만 합니다.