EventEmitter은 Node.js에서 제공하는 클래스 중 이벤트 기반 프로그래밍을 지원하는 클래스입니다. 이를 통해 객체들이 서로 이벤트를 주고받아 비동기적으로 소통할 수 있습니다.
기본 구조는 pub/sub 패턴 기반으로 움직입니다. Pub/Sub 패턴에 대해 더 알고 싶다면 제가 쓴 블로그 글을 참고해주세요. 📝
EventEmitter을 사용하려면 발행하는 로직과 구독하는 로직이 필요합니다.
발행(Publish): emit 메서드를 이용해 이벤트를 발행하며, 동시에 데이터도 함께 전달할 수 있습니다. 발행된 이벤트는 해당 이벤트를 구독한 모든 리스너에게 전달됩니다.
구독(Subscribe): on 메서드를 이용해 이벤트를 구독할 수 있습니다. 구독할 때 첫 번째 매개변수로 이벤트 이름을, 두 번째 매개변수로는 콜백 함수를 전달합니다. 해당 이벤트가 발생하면 이 콜백 함수가 호출됩니다.
아래는 EventEmitter를 사용하는 간단한 예시입니다.
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// 'event'라는 이벤트를 구독
myEmitter.on('event', () => {
console.log('An event occurred!');
});
// 'event'라는 이벤트를 발행
myEmitter.emit('event');
위 코드에서 myEmitter.on('event', ...)는 event라는 이름의 이벤트를 구독합니다. 이 이벤트가 발행될 때마다 구독된 리스너가 호출됩니다.
• emit(eventName, ...args): 발행자가 호출하여 특정 이벤트를 발생시킵니다. eventName은 이벤트의 이름이고, ...args는 이벤트 리스너에게 전달될 인수들입니다.
• on(eventName, listener): 구독자가 특정 이벤트를 구독하도록 등록합니다. 이벤트가 발생하면 listener 함수가 호출됩니다.
• once(eventName, listener): 한 번만 호출될 이벤트 리스너를 등록합니다. 이벤트가 발생하면 리스너가 호출되고 자동으로 제거됩니다.
• removeListener(eventName, listener): 특정 이벤트에 대한 리스너를 제거합니다.
• removeAllListeners(eventName): 특정 이벤트나 모든 이벤트에 대한 리스너를 모두 제거합니다.
느슨한 결합: 발행자와 구독자는 서로에 대해 알 필요가 없으며, 직접 참조하지 않습니다. 이는 시스템의 모듈화와 유지보수를 용이하게 합니다.
확장성: 새로운 이벤트나 구독자를 추가해도 기존 시스템에 영향을 주지 않으므로, 확장이 쉽습니다.
비동기 처리: 이벤트 기반의 비동기 처리 모델을 쉽게 구현할 수 있어, 시스템 성능을 향상시킬 수 있습니다.
EventEmitter는 이러한 Pub/Sub 패턴을 통해 효율적인 이벤트 관리와 비동기 처리를 가능하게 하며, Node.js 애플리케이션에서 핵심적인 역할을 합니다. 🎯