본문 바로가기

언어/Node.js

[ Node.js ] 비동기 함수 구현 하는 방법

반응형

 

 

 

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)

콜백 패턴의 복잡성을 줄이기 위해 도입된 기능입니다. 프로미스는 비동기 작업이 성공 또는 실패했을 때 호출되는 thencatch 메서드를 제공합니다.

// 프로미스를 사용하는 비동기 함수 - 파일 읽기
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에서 비동기로 동작하는 함수를 구현할 수 있습니다. 상황에 맞는 방식을 선택하여 사용하면 효율적인 비동기 프로그래밍을 할 수 있습니다.

반응형