본 블로그에서는 Node.js에서의 비동기식 프로그래밍과 예외 처리에 대해 다루고자 합니다.
비동기식 프로그래밍
Node.js는 단일 스레드 이벤트 루프를 사용하여 비동기식 프로그래밍을 지원합니다. 이는 I/O 처리나 네트워크 요청과 같은 작업을 기다리는 동안 다른 작업을 수행할 수 있게 합니다.
비동기식 코드에서는 주로 콜백 함수나 Promise를 사용하여 작업을 완료하고 결과를 처리합니다. 콜백 함수를 사용할 때는 에러 우선 콜백 방식을 따라야 합니다. 이는 첫 번째 매개변수로 에러를 전달하고, 두 번째 매개변수로 결과를 전달하는 방식을 말합니다.
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) {
console.error('에러 발생:', err);
return;
}
console.log('파일 내용:', data);
});
Promise를 사용할 때는 then
및 catch
메서드를 사용하여 성공 또는 실패 결과를 처리합니다.
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 라이브러리도 함께 고려해볼만 합니다.