Node.js에서 비동기로 동작하는 함수는 다양한 방법으로 만들 수 있습니다. 비동기 프로그래밍은 Node.js의 핵심 기능 중 하나이며, 이를 통해 I/O 작업이나 네트워크 요청을 효율적으로 처리할 수 있습니다. 비동기로 동작하는 함수를 만드는 몇 가지 주요 방법에 대해 설명드리겠습니다.
1. 콜백 (Callback)
Node.js 초기부터 사용된 비동기 프로그래밍 방식입니다. 함수에 콜백을 전달하여 작업이 완료되었을 때 호출되도록 합니다.
// 비동기 함수의 예 - 파일 읽기
const fs = require('fs');
function readFileCallback(filePath, callback) {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
return callback(err);
}
callback(null, data);
});
}
// 사용 예
readFileCallback('example.txt', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log('File content:', data);
});
2. 프로미스 (Promise)
콜백 패턴의 복잡성을 줄이기 위해 도입된 기능입니다. 프로미스는 비동기 작업이 성공 또는 실패했을 때 호출되는 then
과 catch
메서드를 제공합니다.
// 프로미스를 사용하는 비동기 함수 - 파일 읽기
const fs = require('fs');
function readFilePromise(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
return reject(err);
}
resolve(data);
});
});
}
// 사용 예
readFilePromise('example.txt')
.then(data => {
console.log('File content:', data);
})
.catch(err => {
console.error('Error reading file:', err);
});
3. async/await
Promise
기반 코드를 더 읽기 쉽게 만드는 최신 문법입니다. async
함수는 항상 프로미스를 반환하며, await
키워드는 프로미스가 해결될 때까지 함수 실행을 일시 중지합니다.
// async/await를 사용하는 비동기 함수 - 파일 읽기
const fs = require('fs').promises;
async function readFileAsync(filePath) {
try {
const data = await fs.readFile(filePath, 'utf8');
return data;
} catch (err) {
throw err;
}
}
// 사용 예
(async () => {
try {
const data = await readFileAsync('example.txt');
console.log('File content:', data);
} catch (err) {
console.error('Error reading file:', err);
}
})();
4. EventEmitter
이벤트 기반 비동기 작업을 처리하는 데 사용됩니다. 노드의 EventEmitter
를 상속받아 비동기 이벤트를 발생시키고 처리할 수 있습니다.
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// 이벤트 리스너 설정
myEmitter.on('event', (message) => {
console.log('An event occurred:', message);
});
// 비동기 함수에서 이벤트 발생
function emitEventAsync() {
setTimeout(() => {
myEmitter.emit('event', 'Hello from async event!');
}, 1000);
}
// 사용 예
emitEventAsync();
5. 네이티브 비동기 함수 사용
Node.js는 많은 기본 모듈에서 이미 비동기 함수를 제공합니다. 예를 들어, fs
, http
등에서 비동기 메서드를 사용할 수 있습니다.
const fs = require('fs');
// 비동기 파일 쓰기
fs.writeFile('example.txt', 'Hello, Node.js!', 'utf8', (err) => {
if (err) {
console.error('Error writing file:', err);
return;
}
console.log('File has been saved!');
});
6. 네이티브 비동기 API와 Promise를 사용하는 방법
Node.js v10.0.0부터 util.promisify
함수를 사용하여 콜백 기반의 Node.js 표준 라이브러리 함수들을 쉽게 프로미스 기반으로 변환할 수 있습니다.
const fs = require('fs');
const util = require('util');
// fs.readFile을 프로미스로 변환
const readFilePromise = util.promisify(fs.readFile);
// 사용 예
readFilePromise('example.txt', 'utf8')
.then(data => {
console.log('File content:', data);
})
.catch(err => {
console.error('Error reading file:', err);
});
이러한 다양한 방법들로 Node.js에서 비동기로 동작하는 함수를 구현할 수 있습니다. 상황에 맞는 방식을 선택하여 사용하면 효율적인 비동기 프로그래밍을 할 수 있습니다.
'언어 > Node.js' 카테고리의 다른 글
[ Node.js ] Node.js 문법 발전 역사 (JavaScript) (0) | 2024.06.16 |
---|---|
[ Node.js ] 비동기 함수들의 장점과 단점 정리 (0) | 2024.06.16 |
[ Node.js ] 프로젝트 작성 및 실행 (express-generator) (0) | 2024.06.16 |
Node.js ESM(ECMAScript) 모듈 사용해 보기 (0) | 2024.06.10 |
Node.js CommonJS란 무엇인가? (0) | 2024.06.10 |