본문 바로가기

Node.js

Node.js 이벤트


Node.js의 가장 특징적인 부분은 이벤트 기반 비동기 프로그래밍이다.

가장 많이 활용될 부분이므로 주의 깊게 살펴 보아야 한다.



1. 이벤트 연결

[ 코드 ]

<script>

//window 객체에 load 이벤트를 연결한다.

window.addEventListener('load', function() {


});

</script>

  • 일반적으로 사용되는 자바스크립트로 window 객체에 load 이벤트를 연결하는 코드이다.
  • load를 이벤트 이름 또는 이벤트 타입이라고 한다.
  • 매개변수로 입력한 함수를 이벤트 리스너 또는 이벤트 핸들러라고 한다.


[ 코드 ]

//process 객체에 exit 이벤트를 연결한다.

process.addEventListener('exit', function() {


});

  • process 객체에 exit 이벤트를 연결하는 방법이다. window 객체에 연결한 것과 별반 차이가 없다.
  • Node.js는 addEventListener() 메서드보다 이름이 간단한 메서드를 제공한다.


[ 메서드 - 이벤트 연결 메서드 ]

  • on(eventName, eventHandler) : 이벤트를 연결한다.


[ 코드 ]

//process 객체에 exit 이벤트를 연결한다.

process.on('exit', function() {


});

  • addEventListener() 메서드와 사용하는 방법이 동일하다.
[ 코드 - uncaughtException ]
//process 객체에 uncaughtException 이벤트를 연결한다
process.on('uncaughtException', function(error) {

});
  • uncaughtException 이벤트는 예외가 발생할 때 실행되는 이벤트이다.

[ 코드 - 이벤트 연결 ]

//process 객체에 exit 이벤트를 연결한다.

process.on('exit', function() {

console.log('안녕~ Good Bye~ ^_^');

});


//process 객체에 uncaughtException 이벤트를 연결한다.

process.on('uncaughtException', function(error) {

console.log('예외가 발생했다!!!');

});


//2초 간격으로 3번 예외를 발생시킨다.

var count = 0;

var id = setInterval(function() {

//횟수를 증가시킨다.

count++;


//3번 실행하면 타이머를 중지한다.

if (count == 3) { clearInterval(id); }


//예외를 강제로 발생시킨다.

error.error.error();

}, 2000);

  • 이벤트를 연결하고 2초마다 예외를 발생시킨다.
  • 하지만 책의 내용과는 다르게 예외가 발생하면 setInterval() 메서드가 중지되어 반복 실행이 되질 않는다.
  • Mac버전의 문제일지 일반 PC로 테스트 해봐야겠다.


[ 실행 - 이벤트 연결 ]


2. 이벤트 연결 개수 제한

  • Node.js는한 이벤트에 10개가 넘는 이벤트 리스너를 연결할 경우 개발자 실수로 간주한다.
[ 코드 - 이벤트 11개 연결 ]

//이벤트를 연결한다.

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });


[ 실행 - 이벤트 11개 연결 ]

  • 코드를 실행하면 정상적으로 실행되고 종료되지만 경고가 발생한다.
[ 메서드 - 이벤트 연결 개수 제한 메서드 ]
  • setMaxListeners(limit) : 이벤트 리스너 연결 개수를 조절한다.


[ 코드 - 이벤트 연결 개수 제한 메서드 ]

//이벤트 연결 개수 제한을 15개까지 늘린다.

process.setMaxListeners(15);


//이벤트를 연결한다.

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });

process.on('exit', function() { });


[ 실행 - 이벤트 연결 개수 제한 메서드 ]

  • 경고 없이 실행후 종료되었다.
  • 이벤트 리스너를 무한 개 연결하고 싶을 때는 setMaxListeners() 메서드의 매개변수에 0을 입력한다.


3. 이벤트 제거

[ 메서드 - 이벤트 제거할 때 사용되는 메서드 ]

removeListener(eventName, handler) : 특정 이벤트의 이벤트 리스너를 제거한다.

removeAllListeners([eventName]) : 모든 이벤트 리스너를 제거한다.


[ 코드 - 이벤트 제거 ]

//변수를 선언한다.

var onUncaughtException = function (error) {

//출력한다.

console.log("예외가 발생했군 ^_^ 이번에만 봐주겠다 ^_^ .. !");


//이벤트를 제거한다.

process.removeListener('uncaughtException', onUncaughtException);

};


//이벤트를 연결한다.

process.on('uncaughtException', onUncaughtException);


//2초마다 함수를 실행한다.

setInterval(function() {

//예외를 발생시킨다.

error.error.error('^_^');

}, 2000);

  • 코드를 실행하면 2초 후 예외가 발생하고 uncaughtException 이벤트 리스너가 실행된다.
  • 처음에는 "예외가 발생했군 ^_^ 이번에만 봐주겠다 ^_^ .. !"를 출력하고 넘어가지만 두 번째 예외가 발생하면 프로그램이 종료된다.

[ 실행 - 이벤트 제거 ]



[ 메서드 - 이벤트연결 메서드 ]

  • once(eventName, eventHandler) : 이벤트 리스너를 한 번만 연결한다.


[ 코드 - once() 메서드 ]

//이벤트를 연결한다.

process.once('uncaughtException', function(error) {

//출력한다.

console.log("예외가 발생했군 ^_^ 이번에만 봐주겠다 ^_^ .. !");

});


//2초마다 함수를 실행한다.

setInterval(function() {

//예외를 발생시킨다.

error.error.error('^_^');

}, 2000);


5.5 이벤트 생성

Node.js에서 이벤트를 연결할 수 있는 모든 객체는 EventEmitter 객체의 상속을 받는다. 지금까지 살펴본 process 객체도 EventEmitter 객체의 상속을 받기 때문에 이벤트를 연결할 수 있는 것이다.

EventEmitter 객체는 process 객체 안에 있는 생성자 함수로 생성할 수 있는 객체이다.


[ 메서드 - EventEmitter 객체의 메서드 ]

  • addEventListener(eventName, eventHandler) : 이벤트를 연결한다.
  • on(eventName, eventHandler) : 이벤트를 연결한다.
  • setMaxListeners(limit) : 이벤트 연결 개수를 조절한다.
  • removeListener(eventName, handler) : 특정 이벤트의 이벤트 리스너를 제거한다.
  • removeAllListeners([eventName]) : 모든 이벤트 리스너를 제거한다.
  • once(eventName, eventHandler) : 이벤트를 한 번만 연결한다.


[ 코드 - EventEmiiter 객체 생성 ]

//EventEmitter 객체를 생성한다.

var custom = new process.EventEmitter();


[ 코드 - EventEmitter 객체의 메서드 ]

//EventEmitter 객체를 생성한다.

var custom = new process.EventEmitter();


//이벤트를 연결한다.

custom.on('tick', function() {

console.log('이벤트를 실행합니다. ^_^');

});


//이벤트를 강제로 발생시킨다.

custom.emit('tick');

  • 이벤트를 연결하고 이벤트를 강제로 실행한다.


[ 실행 - EventEmitter 객체의 메서드 ]



§ 이벤트를 생성하는 부분과 연결하는 부분을 모듈로 분리해 사용해보자.

  • rint.js 파일과 app.js 파일을 생성한다. app.js파일은 프로그램 본체가 될 부분이고, rint.js 파일은 이벤트를 생성할 모듈 파일이다.

[ 코드 - rint.js ]

//EventEmitter 객체를 생성한다.

exports.timer = new process.EventEmitter();


//이벤트를 강제로 발생시킨다.

setInterval(function() {

exports.timer.emit('tick');

}, 1000);

  • 모듈을 추출하고 tick 이벤트를 연결한다.

[ 코드 -  app.js ]

//모듈을 추출한다.

var rint = require('./rint');


//이벤트를 연결한다.

rint.timer.on('tick', function() {

console.log('이벤트를 실행한다. ^_^');

});

  • rint.js 파일에서 setInterval() 함수를 실행하여 이벤트를 강제 발생시키므로 app.js 파일에서 연결한 이벤트 리스너를 실행하는 것이다.

[ 실행 ]


'Node.js' 카테고리의 다른 글

Node.js 외부 모듈  (0) 2014.11.12
Node.js http 모듈  (0) 2014.11.05
Node.js 기본 내장 모듈  (2) 2014.06.29
Node.js 전역 객체  (0) 2014.06.25
맥에서 Node.js 설치하기  (0) 2014.06.23