...
Event 모듈
Node.js 에선 Event를 매우 많이 사용하고, 이 때문에 다른 비슷한 기술들보다 훨씬 빠른 속도를 자랑합니다.
Node.js 기반으로 만들어진 서버가 가동되면, 변수들을 initialize 하고, 함수를 선언하고 이벤트가 일어날때까지 기다립니다.
이벤트 위주 (Event-Driven) 어플리케이션에서는, 이벤트를 대기하는 메인 루프가 있습니다.
그리고 이벤트가 감지되었을시 Callback함수를 호출합니다.
이벤트가 콜백과 비슷해 보일 수 도 있습니다.
차이점은, 콜백함수는 비동기식 함수에서 결과를 반환할때 호출되지만,
이벤트핸들링은 옵저버 패턴에 의해 작동됩니다.
이벤트를 대기하는 (EventListeners) 함수들이 옵저버 역할을 합니다.
옵저버들이 이벤트를 기다리다가, 이벤트가 실행되면 이벤트를 처리하는 함수가 실행됩니다.
Node.js에서는 이벤트 모듈과 EventEmitter 클래스가 내장되어 있는데, 이를 사용하여 이벤트와 이벤트 핸들러를 연동시킬 수 있습니다.
이벤트 모듈을 사용하려면 require() 메소드를 이용하여 로드하고, 그 객체를 통해 EventEmitter 클래스를 로드하여 사용하는 것이 일반적입니다.
// events 모듈 사용
var events = require('events');
// EventEmitter 객체 생성
var eventEmitter = new events.EventEmitter();
이벤트 핸들러와 이벤트를 연동시키는건 다음과 같습니다
// event와 EventHandler 를 연동(bind)
// eventName 은 임의로 설정 가능
eventEmitter.on('eventName', eventHandler);
프로그램안에서 이벤트를 발생시킬땐 다음 코드를 사용합니다
eventEmitter.emit('eventName');
events 객체의 메소드
- addListener(event, listener) : on() 메소드와 같습니다. 이벤트를 생성하는 메소드입니다.
- .on(event, listener) : addListener()과 동일합니다. 이벤트를 생성하는 메소드입니다.
- once(event, listener) : 이벤트를 한 번만 연결한 후 제거합니다.
- removeListener(event, listener) : 특정 이벤트의 특정 이벤트 핸들러를 제거합니다. 이 메소드를 이용해 리스너를 삭제하면 리스너 배열의 인덱스가 갱신되니 주의해야 합니다.
- .removeAllListeners([event]) : 모든 이벤트 핸들러를 제거합니다.
- .off([event]) : removeListener와 기능이 같습니다.
- .setMaxListeners(n) : n으로 한 이벤트에 최대허용 개수를 정해줍니다. node.js는 기본값으로 한 이벤트에 10개의 이벤트 핸들러를 작성할 수 있는데, 11개 이상을 사용하고 싶다면 n값을 넘겨주면 됩니다. n값으로 0을 넘겨 주면 연결 개수 제한이 사라집니다.
- .emit(eventName[, ...args]) : 이벤트를 발생시킵니다.
- .listenerCount(이벤트명) : 현재 리스너가 몇개 연결되어 있는지 확인
이벤트 생성(이벤트 핸들러 연결)
이벤트를 추가하려면, emitter에 이벤트를 연결할 객체, event에 이벤트 이름, listener에 이벤트 핸들러를 작성하면 됩니다.
addlistener() 메소드와 on() 메소드는 서로 같으니 둘 중 익숙한 것을 사용하면 됩니다.
var EventEmitter = require('events'); // 모듈 사용
var custom_event = new EventEmitter(); // 객체 생성
custom_event.on('call', function() { // 이벤트 등록
console.log('이벤트 콜');
});
custom_event.emit('call'); // 이벤트 강제 발생
이벤트 제거
addlistener() 메소드나 on() 메소드를 통해 연결된 이벤트 핸들러를 제거하기 위해 사용됩니다.
removeListener()를 사용하면 특정 이벤트 리스너를 제거할 수 있고, removeAllListeners() 를 사용하면 모든 이벤트 리스너를 제거합니다.
var EventEmitter = require('events');
var custom_event = new EventEmitter();
custom_event.on('call', function() {
console.log('이벤트 콜');
});
custom_event.removeAllListeners();
custom_event.emit('call');
call 이벤트를 부르기 전 리스너를 삭제했기 때문에 실행하면 콘솔에 아무것도 찍히지 않습니다.
// events 모듈 사용
var events = require('events');
// EventEmitter 객체 생성
var eventEmitter = new events.EventEmitter();
// EventHandler 함수 생성
var connectHandler = function connected(){
console.log("Connection Successful");
// data_recevied 이벤트를 발생시키기
eventEmitter.emit("data_received");
}
// connection 이벤트와 connectHandler 이벤트 핸들러를 연동
eventEmitter.on('connection', connectHandler);
// data_received 이벤트와 익명 함수와 연동
// 함수를 변수안에 담는 대신에, .on() 메소드의 인자로 직접 함수를 전달
eventEmitter.on('data_received', function(){
console.log("Data Received");
});
// connection 이벤트 발생시키기
eventEmitter.emit('connection');
console.log("Program has ended");
$ node main.js
Connection Successful
Data Received
Program has ended
Reference
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.