먼저 이벤트를 이해하기 위해서는 이벤트를 생성하고, 연결한 후, 이벤트를 발생시켜서 연결된 로직을 실행하는 기본 기능들을 알아야만 하는데 node.js 에서는 기본적으로 EventEmitter를 생성하고 메소드를 이용해서 이벤트를 관리한다.
emitter.addListener(event, listener): 이벤트를 생성하는 메소드입니다. on() 메소드와 같습니다.
emitter.on(event, listener): 이벤트를 생성하는 메소드입니다. addListener()과 동일합니다.
emitter.once(event, listener): 이벤트를 한 번만 연결한 후 제거합니다.
emitter.removelistener(event, listener):
특정 이벤트의 핸들러를 제거합니다.
이 메소드를 이용해 리스너를 삭제하면 리스너 배열의 인덱스가 갱신되니 주의해야 합니다.
emitter.removeAllListeners([event]): 모든 이벤트 핸들러를 제거합니다.
emitter.setMaxListeners(n):
n으로 한 이벤트에 최대허용 개수를 지정합니다.
node.js는 기본값으로 한 이벤트에 10개의 이벤트 핸들러를 작성할 수 있는데,
11개 이상을 사용하고 싶다면 n값을 넘겨주면 됩니다.
n값으로 0을 넘겨주면 연결 개수 제한이 사라집니다.
emitter.emit(eventName[, ...args]): 이벤트를 발생시킵니다.
다음 코드에서 이벤트 모듈을 재정의해서 새로운 객체를 생성한 후 각 함수를 사용해보겠습니다.
코드
// 1. 이벤트가 정의되 있는 events 모듈 생성. 이전 버전의 process.EventEmitter() 는 deprecated!
let EventEmitter = require('events');
// 2. 생성된 이벤트 모듈을 사용하기 위해 custom_object로 초기화
let custom_object = new EventEmitter();
// 3. events 모듈에 선언되어 있는 on( ) 함수를 재정의 하여 'call' 이벤트를 처리
// 이벤트를 연결하는 함수인 on을 사용했다
custom_object.on('call', ()=> {
console.log('called events!');
});
// 4. call 이벤트를 강제로 발생
// 위의 on 함수가 캐치되기 위해서는 다음 emit 함수가 실행되야 .on에서 캐치가 가능함
custom_object.emit('call');
출력
server$ node custom_event.js
called events
다음 코드에서는 Emitter를 이용해 1초에 한번씩 timer 객체에 tick 이벤트를 발생시키는 코드를 확인해보겠습니다.
setInterval에서 계속 반복실행되고 있다.
코드
let EventEmitter = require("events");
// 1. setInterval 함수가 동작하는 interval 값을 설정합니다. 1초에 한번씩 호출
let sec = 1;
// 2. timer변수를 EventEmitter 로 초기화
exports.timer = new EventEmitter();
// 3. javascript 내장함수인 setInterval 을 사용해서 1초에 한번씩 timer 객체에 tick 이벤트 발생
setInterval(function () {
exports.timer.emit("tick");
console.log("exports.timer.emit(tick);", exports.timer.emit("tick"));
}, sec * 1000);
출력
/server$ node custom_module_timer.js
exports.timer.emit(tick); false
exports.timer.emit(tick); false
exports.timer.emit(tick); false
exports.timer.emit(tick); false
exports.timer.emit(tick); false
exports.timer.emit(tick); false
다음 코드에서는 현재시간을 가져와서 계속 시간을 출력하는 이벤트를 만들고 출력해보겠다.
코드
let module = require("./custom_module_timer");
// 1. module 내부에 선언된 timer객체를 통해 tick 이벤트를 캐치하고, 이벤트 발생시마다 현재시간을 출력
module.timer.on("tick", function (time) {
let time = new Date(); // 2. 현재 시간을 가져오기 위한 Date 객체 생성
console.log("now:" + time);
});
출력
now:Tue Jan 03 2023 22:43:42 GMT+0900 (대한민국 표준시)
now:Tue Jan 03 2023 22:43:42 GMT+0900 (대한민국 표준시)
exports.timer.emit(tick); true
now:Tue Jan 03 2023 22:43:43 GMT+0900 (대한민국 표준시)
now:Tue Jan 03 2023 22:43:43 GMT+0900 (대한민국 표준시)
exports.timer.emit(tick); true
now:Tue Jan 03 2023 22:43:44 GMT+0900 (대한민국 표준시)
now:Tue Jan 03 2023 22:43:44 GMT+0900 (대한민국 표준시)
exports.timer.emit(tick); true
참조 :
https://velog.io/@ragnarok_code/EventEmitter%EB%9E%80
Node JS - Mini Node Server (0) | 2023.01.04 |
---|---|
nvm & node.js (0) | 2023.01.01 |
Javascript 런타임에 대하여 (0) | 2022.12.23 |