본문 바로가기

언어/Node.js

[ Node.js ] 비동기 함수 EventEmitter 사용하기

반응형

 

 

 

Node.js에서 EventEmitter는 이벤트를 관리하고 처리하는 데 사용되는 핵심 모듈입니다. 이를 통해 비동기 이벤트 기반의 프로그래밍을 쉽게 구현할 수 있습니다. EventEmitter는 Node.js의 events 모듈에서 제공되며, 클래스로 사용하여 이벤트를 생성하고 이를 처리하는 이벤트 리스너를 관리할 수 있습니다.

아래는 EventEmitter를 사용하는 방법을 단계별로 설명한 가이드입니다.

1. EventEmitter 모듈 불러오기

먼저, EventEmitter 클래스를 가져와야 합니다.

const EventEmitter = require('events');

2. EventEmitter 인스턴스 생성

EventEmitter 클래스의 인스턴스를 생성하여 사용할 수 있습니다.

const myEmitter = new EventEmitter();

3. 이벤트 리스너 등록

on 메서드를 사용하여 특정 이벤트가 발생했을 때 실행될 리스너 함수를 등록할 수 있습니다.

// 'event'라는 이름의 이벤트에 대한 리스너 등록
myEmitter.on('event', () => {
    console.log('An event occurred!');
});

여기서 on 메서드는 첫 번째 인수로 이벤트 이름을, 두 번째 인수로 이벤트가 발생했을 때 실행할 콜백 함수를 받습니다.

4. 이벤트 발생

emit 메서드를 사용하여 이벤트를 발생시킬 수 있습니다. 이때 이벤트 이름과 함께, 리스너로 전달할 데이터를 추가적으로 넘길 수 있습니다.

// 'event' 이벤트 발생
myEmitter.emit('event');

이 코드를 실행하면 이전에 등록한 리스너가 호출되어 'An event occurred!'라는 메시지가 출력됩니다.

5. 이벤트에 데이터 전달

emit 메서드로 이벤트를 발생시킬 때, 추가적인 데이터를 전달할 수 있으며, 이를 리스너에서 받을 수 있습니다.

// 'greet' 이벤트 리스너 등록, 인수를 받음
myEmitter.on('greet', (name) => {
    console.log(`Hello, ${name}!`);
});

// 'greet' 이벤트 발생, 'John'이라는 인수 전달
myEmitter.emit('greet', 'John');

여기서 emit 메서드의 두 번째 인수로 John을 전달하면, 리스너 함수의 name 매개변수로 John이 전달됩니다.

6. 한번만 실행되는 리스너

once 메서드를 사용하여 이벤트가 한 번만 발생할 때 리스너가 실행되도록 설정할 수 있습니다.

// 'special' 이벤트 리스너 등록, 한 번만 실행됨
myEmitter.once('special', () => {
    console.log('This will be logged only once');
});

// 'special' 이벤트를 두 번 발생시킴
myEmitter.emit('special');
myEmitter.emit('special');

여기서 'special' 이벤트는 첫 번째 발생 시에만 리스너가 호출되고, 두 번째 발생 시에는 호출되지 않습니다.

7. 리스너 제거

removeListener 또는 off 메서드를 사용하여 특정 이벤트의 리스너를 제거할 수 있습니다. Node.js v10 이후로 off 메서드도 사용할 수 있습니다.

function responseToEvent() {
    console.log('Event occurred and listener responded.');
}

// 'event' 이벤트에 리스너 등록
myEmitter.on('event', responseToEvent);

// 'event' 이벤트 발생
myEmitter.emit('event');

// 'event' 이벤트에서 리스너 제거
myEmitter.removeListener('event', responseToEvent);

// 'event' 이벤트 발생 - 리스너가 없으므로 아무 일도 일어나지 않음
myEmitter.emit('event');

또는 off 메서드를 사용할 수도 있습니다:

// 'event' 이벤트에서 리스너 제거
myEmitter.off('event', responseToEvent);

8. 이벤트 리스너 관리

EventEmitter에는 이벤트 리스너를 관리하기 위한 다양한 메서드가 있습니다:

  • listenerCount(eventName): 특정 이벤트에 등록된 리스너의 수를 반환합니다.
  • listeners(eventName): 특정 이벤트에 등록된 리스너 배열을 반환합니다.
  • removeAllListeners([eventName]): 특정 이벤트 또는 모든 이벤트에 대해 등록된 모든 리스너를 제거합니다.
// 리스너 개수 확인
console.log(myEmitter.listenerCount('event')); // 0
myEmitter.on('event', responseToEvent);
console.log(myEmitter.listenerCount('event')); // 1

// 모든 'event' 이벤트의 리스너 제거
myEmitter.removeAllListeners('event');
console.log(myEmitter.listenerCount('event')); // 0

9. EventEmitter 확장

EventEmitter를 확장하여 고유한 이벤트 기반 클래스를 만들 수 있습니다.

class MyEmitter extends EventEmitter {}

const myCustomEmitter = new MyEmitter();

// 사용자 정의 이벤트 등록
myCustomEmitter.on('customEvent', () => {
    console.log('Custom event triggered!');
});

// 사용자 정의 이벤트 발생
myCustomEmitter.emit('customEvent');

이렇게 하면 EventEmitter의 모든 기능을 상속받아 사용할 수 있으며, 필요에 따라 더 많은 기능을 추가할 수 있습니다.

10. 에러 이벤트 처리

EventEmittererror 이벤트를 자동으로 인식하며, 에러 이벤트는 특별한 의미를 가집니다. error 이벤트에 리스너가 없으면 기본적으로 에러가 발생하고 프로세스가 종료됩니다. 따라서 error 이벤트에는 반드시 리스너를 등록하는 것이 좋습니다.

myEmitter.on('error', (err) => {
    console.error('An error occurred:', err.message);
});

// 에러 이벤트 발생
myEmitter.emit('error', new Error('Something went wrong'));

전체 예제

아래는 EventEmitter의 다양한 기능을 종합적으로 보여주는 예제입니다.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// 이벤트 리스너 등록
myEmitter.on('event', (message) => {
    console.log('Event occurred:', message);
});

// 한 번만 실행되는 리스너
myEmitter.once('oneTime', () => {
    console.log('This will run only once');
});

// 에러 이벤트 리스너
myEmitter.on('error', (err) => {
    console.error('An error occurred:', err.message);
});

// 이벤트 발생
myEmitter.emit('event', 'Hello, Event!');
myEmitter.emit('oneTime');
myEmitter.emit('oneTime'); // 이 호출은 무시됩니다

// 에러 이벤트 발생
myEmitter.emit('error', new Error('Oops!'));

// 리스너 개수 확인
console.log('Event listener count:', myEmitter.listenerCount('event'));

// 모든 리스너 제거
myEmitter.removeAllListeners('event');

// 다시 발생 - 리스너가 없으므로 출력되지 않음
myEmitter.emit('event', 'Hello again!');

이 예제는 다양한 이벤트 유형에 대한 리스너를 등록하고, 이를 발생시키며, 에러 이벤트와 리스너 관리를 포함한 다양한 기능을 보여줍니다.

이제 EventEmitter를 사용하여 Node.js 애플리케이션에서 이벤트를 관리하고 처리하는 방법을 이해하셨기를 바랍니다. 이를 통해 비동기 프로그래밍을 보다 효율적으로 수행할 수 있습니다.

반응형