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 객체에 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개가 넘는 이벤트 리스너를 연결할 경우 개발자 실수로 간주한다.
//이벤트를 연결한다.
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 |