IT/NodeJS

Node.js의 비동기 작업 처리 패턴

KeepGooing 2024. 11. 21. 11:32
반응형

 

Node.js는 단일 스레드 이벤트 기반 아키텍처를 기반으로 동작하며, 이를 통해 동시에 많은 작업을 처리할 수 있습니다. 비동기 프로그래밍은 Node.js에서 핵심적인 개념으로, 성능과 확장성을 높이는 데 중요한 역할을 합니다. 이 글에서는 Node.js에서 사용되는 주요 비동기 작업 처리 패턴을 살펴보고 이에 대한 장점과 단점에 대해서 간단하게 알아보겠습니다.

1. 콜백 (Callbacks)

콜백은 가장 기본적인 비동기 패턴입니다. 비동기 작업이 완료되면 실행될 함수를 인자로 전달합니다.


const fs = require('fs');

fs.readFile('file.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

console.log('This will log before the file content!');
        

장점: 간단하고 직관적입니다.

단점: 복잡한 비동기 로직에서 '콜백 지옥'을 초래할 수 있습니다[2].

2. 프로미스 (Promises)

프로미스는 비동기 작업의 최종 완료 또는 실패를 나타내는 객체입니다[3].


const fs = require('fs').promises;

fs.readFile('file.txt', 'utf8')
    .then(data => console.log(data))
    .catch(err => console.error(err));
        

장점: 콜백 지옥을 해결하고, 더 나은 에러 처리를 제공합니다.

단점: 여전히 복잡한 비동기 로직에서는 가독성이 떨어질 수 있습니다.

3. Async/Await

Async/Await는 프로미스를 기반으로 한 더 직관적인 문법을 제공합니다.


const fs = require('fs').promises;

async function readFile() {
    try {
        const data = await fs.readFile('file.txt', 'utf8');
        console.log(data);
    } catch (err) {
        console.error(err);
    }
}

readFile();
        

장점: 동기 코드와 유사한 구조로 가독성이 높고 에러 처리가 용이합니다.

단점: 오래된 Node.js 버전에서는 지원되지 않을 수 있습니다.

4. 이벤트 이미터 (Event Emitters)

Node.js의 내장 모듈인 EventEmitter를 사용하여 이벤트 기반의 비동기 패턴을 구현할 수 있습니다.


const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
    console.log('An event occurred!');
});

myEmitter.emit('event');
        

장점: 복잡한 비동기 흐름을 관리하는 데 유용합니다.

단점: 오용 시 메모리 누수의 위험이 있습니다.

결론

Node.js에서 비동기 작업을 처리하는 다양한 패턴이 있으며, 각각의 장단점이 있습니다. 콜백은 간단하지만 복잡한 로직에서는 관리가 어려울 수 있습니다. 프로미스와 Async/Await는 더 나은 가독성과 에러 처리를 제공합니다. 프로젝트의 요구사항과 복잡성에 따라 적절한 패턴을 선택하는 것이 중요합니다. 최신 Node.js 프로젝트에서는 Async/Await를 사용하는 것이 권장되지만, 레거시 코드나 특정 상황에서는 다른 패턴들도 여전히 유용할 수 있습니다.

반응형