Node.js는 비동기 이벤트 기반 아키텍처를 가지고 있어, 비동기 프로그래밍은 Node.js 애플리케이션의 필수적인 구성 요소입니다. 이러한 비동기 프로그래밍은 네트워크 요청, 파일 시스템 액세스, 데이터베이스 쿼리 등과 같이 I/O 작업이 필요한 상황에서 특히 중요합니다. 이번 포스트에서는 Node.js에서의 비동기 프로그래밍에 대해 알아보겠습니다.
콜백 함수
Node.js에서는 주로 콜백 함수를 사용하여 비동기 작업을 다룹니다. 콜백 함수는 비동기 작업이 완료되었을 때 호출되는 함수로, 일반적으로 다음과 같은 패턴을 따릅니다.
const fs = require('fs');
fs.readFile('file.txt', (err, data) => {
if (err) throw err;
console.log(data);
});
위의 예제에서 readFile
함수는 파일을 읽는 작업을 비동기적으로 수행하며, 작업이 완료되면 제공된 콜백 함수가 호출됩니다.
Promise
ES6부터는 Promise를 사용하여 비동기 작업을 다룰 수 있습니다. Promise는 비동기 작업의 완료 또는 실패와 같은 결과를 다루는 객체입니다.
const fetchData = () => {
return new Promise((resolve, reject) => {
// 비동기 작업 수행
if (error) {
reject(error);
} else {
resolve(data);
}
});
};
fetchData()
.then((data) => {
console.log(data);
})
.catch((error) => {
console.error(error);
});
위의 예제에서 fetchData
함수는 Promise 객체를 반환하며, 작업이 완료되면 then
메서드로 성공한 경우를, catch
메서드로 실패한 경우를 처리할 수 있습니다.
Async/Await
ES2017부터는 Async/Await 구문을 사용하여 비동기 코드를 더 쉽게 다룰 수 있게 되었습니다. Async/Await를 사용하면 비동기 작업을 동기적으로 작성할 수 있어 코드의 가독성을 향상시킵니다.
const fetchData = async () => {
try {
const data = await fetchDataFromAPI();
console.log(data);
} catch (error) {
console.error(error);
}
};
위의 예제에서 fetchData
함수는 async
키워드로 정의되어 비동기 작업을 수행하며, await
키워드를 사용하여 비동기 작업이 완료될 때까지 기다립니다.
Node.js에서의 비동기 프로그래밍은 이러한 다양한 방법을 통해 다룰 수 있으며, 개발자는 상황에 맞게 가장 적합한 방법을 선택하여 비동기 작업을 처리할 수 있습니다.
참고 자료
- Node.js 공식 문서
- “Node.js Design Patterns” - Mario Casciaro, Luciano Mammino