상세 컨텐츠

본문 제목

Node JS - EventEmitters

Web/NodeJS

by Yongari 2023. 1. 4. 19:39

본문

 

 

 

 

먼저 이벤트를 이해하기 위해서는 이벤트를 생성하고, 연결한 후, 이벤트를 발생시켜서 연결된 로직을 실행하는 기본 기능들을 알아야만 하는데 node.js 에서는 기본적으로 EventEmitter를 생성하고 메소드를 이용해서 이벤트를 관리한다.

 

  • EventEmitter : 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

 

EventEmitter란 ?

Nodejs EventEmitter는 nodejs 애플리케이션을 만들다보면 많이 사용하게 되는 라이브러리다. 그러나 이름만 비슷할 뿐, EventEmitter와 EventLoop 사이에는 아무런 관계가 없다.Nodejs의 EventLoop는 Nodejs의 비동

velog.io

 

'Web > NodeJS' 카테고리의 다른 글

Node JS - Mini Node Server  (0) 2023.01.04
nvm & node.js  (0) 2023.01.01
Javascript 런타임에 대하여  (0) 2022.12.23

관련글 더보기