728x90
반응형
1. 이벤트 모듈이란
events 모듈은 Node.js에서 이벤트 기반 프로그래밍을 구현하기 위한 핵심 내장 모듈입니다. Node.js의 많은 내장 모듈(http, fs, stream 등)이 이 모듈을 기반으로 동작합니다. 이벤트를 발생시키고(emit) 리스너를 등록하여(on) 비동기 작업을 처리하는 패턴을 제공합니다.
2. EventEmitter 기본 사용법
2.1 EventEmitter 생성
const EventEmitter = require('events');
// 방법 1: 직접 인스턴스 생성
const emitter = new EventEmitter();
// 방법 2: 클래스 상속
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
2.2 이벤트 등록과 발생
const EventEmitter = require('events');
const emitter = new EventEmitter();
// 이벤트 리스너 등록
emitter.on('greeting', (name) => {
console.log(`안녕하세요, ${name}님!`);
});
// 이벤트 발생
emitter.emit('greeting', '홍길동');
// 출력: 안녕하세요, 홍길동님!
3. 이벤트 리스너 메서드
3.1 on() - 이벤트 리스너 등록
const emitter = new EventEmitter();
// 여러 개의 리스너 등록 가능
emitter.on('data', (data) => {
console.log('리스너 1:', data);
});
emitter.on('data', (data) => {
console.log('리스너 2:', data);
});
emitter.emit('data', '테스트');
// 출력:
// 리스너 1: 테스트
// 리스너 2: 테스트
3.2 once() - 일회성 리스너
const emitter = new EventEmitter();
emitter.once('connect', () => {
console.log('연결됨 (한 번만 실행)');
});
emitter.emit('connect'); // 연결됨 (한 번만 실행)
emitter.emit('connect'); // 아무 출력 없음
3.3 off() / removeListener() - 리스너 제거
const emitter = new EventEmitter();
function handler(data) {
console.log('데이터:', data);
}
emitter.on('data', handler);
emitter.emit('data', '첫 번째'); // 데이터: 첫 번째
emitter.off('data', handler);
// 또는 emitter.removeListener('data', handler);
emitter.emit('data', '두 번째'); // 아무 출력 없음
3.4 removeAllListeners() - 모든 리스너 제거
const emitter = new EventEmitter();
emitter.on('event', () => console.log('리스너 1'));
emitter.on('event', () => console.log('리스너 2'));
// 특정 이벤트의 모든 리스너 제거
emitter.removeAllListeners('event');
// 모든 이벤트의 모든 리스너 제거
emitter.removeAllListeners();
4. 이벤트 정보 확인
const emitter = new EventEmitter();
emitter.on('data', () => {});
emitter.on('data', () => {});
emitter.on('error', () => {});
// 등록된 이벤트 이름 목록
console.log(emitter.eventNames());
// ['data', 'error']
// 특정 이벤트의 리스너 수
console.log(emitter.listenerCount('data'));
// 2
// 특정 이벤트의 리스너 배열
console.log(emitter.listeners('data'));
// [Function, Function]
반응형
5. 에러 처리
error 이벤트는 특별하게 처리됩니다. 리스너가 없으면 예외가 발생합니다.
const emitter = new EventEmitter();
// error 이벤트 리스너가 없으면 프로세스가 종료됨
// emitter.emit('error', new Error('문제 발생')); // 예외 발생!
// error 이벤트 리스너 등록
emitter.on('error', (err) => {
console.error('에러 발생:', err.message);
});
emitter.emit('error', new Error('문제 발생'));
// 에러 발생: 문제 발생
6. 최대 리스너 수 설정
메모리 누수 방지를 위해 기본적으로 이벤트당 10개의 리스너 제한이 있습니다.
const emitter = new EventEmitter();
// 기본값 확인
console.log(emitter.getMaxListeners()); // 10
// 최대 리스너 수 변경
emitter.setMaxListeners(20);
// 전역 기본값 변경
EventEmitter.defaultMaxListeners = 15;
// 무제한으로 설정 (권장하지 않음)
emitter.setMaxListeners(0);
7. 비동기 이벤트 처리
const emitter = new EventEmitter();
// 비동기 리스너
emitter.on('fetch', async (url) => {
try {
const response = await fetch(url);
const data = await response.json();
emitter.emit('data', data);
} catch (err) {
emitter.emit('error', err);
}
});
emitter.on('data', (data) => {
console.log('받은 데이터:', data);
});
emitter.on('error', (err) => {
console.error('에러:', err.message);
});
emitter.emit('fetch', 'https://api.example.com/data');
8. 실전 활용 예시
8.1 커스텀 클래스에서 이벤트 사용
const EventEmitter = require('events');
class Database extends EventEmitter {
constructor() {
super();
this.connected = false;
}
connect() {
setTimeout(() => {
this.connected = true;
this.emit('connected');
}, 1000);
}
query(sql) {
if (!this.connected) {
this.emit('error', new Error('데이터베이스 연결 안됨'));
return;
}
setTimeout(() => {
this.emit('result', { sql, rows: [] });
}, 500);
}
disconnect() {
this.connected = false;
this.emit('disconnected');
}
}
// 사용
const db = new Database();
db.on('connected', () => console.log('DB 연결됨'));
db.on('result', (data) => console.log('쿼리 결과:', data));
db.on('error', (err) => console.error('에러:', err.message));
db.on('disconnected', () => console.log('DB 연결 해제'));
db.connect();
결론
events 모듈의 EventEmitter는 Node.js 이벤트 기반 아키텍처의 핵심입니다. on()으로 리스너를 등록하고 emit()으로 이벤트를 발생시키는 패턴을 사용합니다. error 이벤트는 반드시 리스너를 등록해야 하며, 클래스 상속을 통해 커스텀 이벤트 기반 객체를 만들 수 있습니다.
728x90
반응형
'Node.js' 카테고리의 다른 글
| Node.js의 스트림 모듈(stream module) (0) | 2026.02.24 |
|---|---|
| Node.js의 경로 모듈(path module) (0) | 2026.02.23 |
| Node.js의 URL 모듈(url module) (0) | 2026.02.23 |
| Node.js의 HTTP 모듈(http module) (0) | 2026.02.23 |
| Node.js의 파일 시스템 모듈(fs module) (0) | 2026.02.23 |