1 minute read

[Node.js] event

이벤트

노드는 이벤트를 기반으로 하는 비동기 방식으로 처리한다. 비동기 방식으로 처리하기 위해 서로 이벤트를 전달해야한다.
노드에는 이런 이벤트를 전달할 수 있는 EventEmitter 를 통해 이벤트를 주고 받는다.

NOTE: 이벤트는 한쪽에서 다른쪽으로 이벤트가 발생했음을 알려주는 것으로 다른쪽에서 이벤트를 받기 위해 Event Listener 를 등록해야 한다.

웹에서 JavaScript로 작업한 경우 마우스 클릭, 키보드 버튼, 마우스 움직임에 따라 사용자와 상호작용하는 웹을 만들 수 있는데, Node.js의 event 모듈은 유사한 기능을 구현할 수 있도록 도와준다.

이벤트 전달

노드 객체는 EventEmitter 를 상속받아 on()emit() 메소드를 사용할 수 있다.

메소드 설명
on(event, listener) 이벤트의 리스너에 추가
once(event, listener) 이벤트의 리스너에 추가하지만 한 번 실행 후 제거
removeListener(event, listener) 이벤트 리스너 제거
emit(event, parameter) 이벤트 트리거

process 객체는 내부적으로 EventEmitter 를 상속 중이기 때문에 바로 on()emit() 메소드를 사용가능하다.

process.on('start', function(count){
    console.log('start 이벤트 발생');
});

setTimeout(function(){
    console.log('2초 뒤에 start 이벤트 전달');
    
    process.emit('start');
}, 2000);
Timeout {
  _idleTimeout: 2000,
  _idlePrev: [TimersList],
  _idleNext: [TimersList],
  _idleStart: 12913,
  _onTimeout: [Function (anonymous)],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(refed)]: true,
  [Symbol(kHasPrimitive)]: false,
  [Symbol(asyncId)]: 9,
  [Symbol(triggerId)]: 6
}



2초 뒤에 start 이벤트 전달
start 이벤트 발생

객체를 모듈로

항상 process 객체를 사용해 이벤트를 전달한다면 같은 이름의 이벤트를 사용하는 경우 충돌이 발생할 수 있다.
때문에 별도의 모듈 파일을 만들고 그 안에서 이벤트를 처리하도록 만드는 것이 좋다.

//계산기 객체 모듈 ./calc.js
var util = require('util');
var EventEmitter = require('events').EventEmitter;

var Calc = function(){
    var self = this;
    
    this.on('stop', function(){
        console.log('Calc에 stop event 전달');
    });
};

util.inherits(Calc, EventEmitter);

Calc.prototype.add = function(a,b){
    return a+b;
}
module.exports = Calc;
module.exports.title = 'calculator';

Calc 객체는 function 을 사용해 프로토타입 객체로 만든다. 프로토타입 객체 안에서 this 를 통해 자신을 가르켜 객체안에 정의된 속성에 접근한다.
util.inherits() 메소드를 이용해 Calc 객체가 EventEmitter 를 상속하게 한다.

아래 코드는 위에서 만들어진 모듈을 사용하는 코드이다.

var Calc = require('./calc');

var calc = new Calc();
calc.emit('stop');

console.log(Calc.title + '에 stop 이벤트 전달');
Calc에 stop event 전달
calculator에 stop 이벤트 전달

Leave a comment