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. 에러 이벤트 처리
EventEmitter
는 error
이벤트를 자동으로 인식하며, 에러 이벤트는 특별한 의미를 가집니다. 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 애플리케이션에서 이벤트를 관리하고 처리하는 방법을 이해하셨기를 바랍니다. 이를 통해 비동기 프로그래밍을 보다 효율적으로 수행할 수 있습니다.
'언어 > Node.js' 카테고리의 다른 글
[ Node.js ] Node.js 버전 역사. (0) | 2024.09.04 |
---|---|
[ Node.js ] 간단한 웹 스파이더 작성하기 (0) | 2024.06.16 |
[ Node.js ] 비동기 함수에서 발생하는 에러 처리하기 (0) | 2024.06.16 |
[ Node.js ] Node.js 문법 발전 역사 (JavaScript) (0) | 2024.06.16 |
[ Node.js ] 비동기 함수들의 장점과 단점 정리 (0) | 2024.06.16 |