이벤트
Node.js 의 큰 특징 중 하나는 이벤트 기반 비동기 프로그래밍이 가능하다는 점이다. 자바스크립트는 다른 프로그래밍 언어와 비교했을 때 함수 생성과 이벤트 연결이 굉장히 쉬우므로 이벤트 기반 프로그래밍을 하기 좋다.
큰 개념
on(eventName, eventHandler) - 이벤트를 연결하는 메서드.
emit() - 이벤트를 실행할 때 사용.
EventEmitter 객체 – 이벤트를 연결할 수 있는 모든 객체의 어머니.
기존의 자바스크립트 이벤트연결
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
// window 객체에 load 이벤트를 연결합니다.
window.addEventListener('load', function () {
});
</script>
</head>
<body>
</body>
</html>
load를 이벤트 이름 또는 이벤트 타입 이라고 한다. 또한 매개변수로 입력한 함수를 이벤트 리스너 또는 이벤트 핸들러라고 한다.
node.js에서 이벤트 연결
// process 객체에 exit 이벤트를 연결합니다.
process.on('exit', function (code) {
});
예외를 발생시키는 이벤트 예)
// process 객체에 exit 이벤트를 연결합니다.
process.on('exit', function (code) {
console.log('안녕');
});
// process 객체에 uncaughtException 이벤트를 연결합니다.
process.on('uncaughtException', function (error) {
console.log('예외가 발생');
});
// 2초 간격으로 3번 예외를 발생시킵니다.
var count = 0;
var test = function () {
// 탈출 코드
count = count + 1;
if (count > 3) { return }
// 예외를 강제로 발생시킵니다.
setTimeout(test, 2000);
error.error.error();
};
setTimeout(test, 2000);
결과
예외가 발생
예외가 발생
예외가 발생
안녕
이벤트 연결 개수 제한
한 이벤트에 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 () { });
결과
(node:5276) Warning: Possible EventEmitter memory leak detected. 11 exit listeners added. Use emitter.setMaxListeners() to increase limit
해결방법
이벤트 연결 개수 제한 메서드 사용
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 () { });
이벤트 제거
이벤트 제거 메서드
removeListner(eventName, handler) - 특정 이벤트의 이벤트 리스너를 제거한다.
removeAllListners(eventName) - 모든 이벤트 리스너를 제거한다.
이벤트 연결 예)
// 변수를 선언합니다.
var onUncaughtException = function (error) {
console.log('예외 발생');
};
// process 객체에 uncaughtException 이벤트를 연결합니다.
process.on('uncaughtException', onUncaughtException);
// 2초 간격으로 예외를 발생시킵니다.
var test = function () {
setTimeout(test, 2000);
error.error.error();
};
setTimeout(test, 2000);
이벤트제거 예)
// 변수를 선언합니다.
var onUncaughtException = function (error) {
// 출력합니다.
console.log('예외 발생);
// 이벤트를 제거합니다.
process.removeListener('uncaughtException', onUncaughtException);
};
// process 객체에 uncaughtException 이벤트를 연결합니다.
process.on('uncaughtException', onUncaughtException);
// 2초 간격으로 예외를 발생시킵니다.
var test = function () {
setTimeout(test, 2000);
error.error.error();
};
setTimeout(test, 2000);
이벤트를 한번만 연결하고 싶을 때
once(eventName,eventHandler) - 이벤트 리스너를 한 번만 연결한다.
예)
// process 객체에 uncaughtException 이벤트를 연결합니다.
process.once('uncaughtException', function (error) {
console.log('예외 발생');
});
// 2초 간격으로 예외를 발생시킵니다.
var test = function () {
setTimeout(test, 2000);
error.error.error();
};
setTimeout(test, 2000);
이벤트 강제 발생
emit(eventName[,arg1][,arg2]) - 이벤트를 실행한다.
예)
// exit 이벤트를 연결합니다.
process.on('exit', function (code) {
console.log('안녕히 계세요 .. !');
});
// 이벤트를 강제로 발생시킵니다.
process.emit('exit');
process.emit('exit');
process.emit('exit');
process.emit('exit');
// 프로그램 실행 중
console.log('프로그램 실행 중');
<참고>
프로그램을 강제 종료하고 싶을 때
process.emit();
이벤트 생성
Node.js에서 이벤트를 연결할 수 있는 모든 객체는 EventEmitter 객체의 상속을 받는다.
process 객체도 EventEmitter 객체의 상속을 받기 때문에 이벤트를 연결할 수 있는 것이다.
EventEmitter 객체는 process 객체 안에 있는 생성자 함수로 생성할 수 있는 객체다.
EventEmitter 객체의 메서드
addListner(eventName,eventHandler) - 이벤트를 연결 한다.
on(eventName, eventHandler) - 이벤트를 연결한다.
setMaxListeners(limit) - 이벤트 연결 개수를 조절한다.
removeListener(eventName,handler) - 특정 이벤트 리스너 제거
removeAllListeners([eventName]) - 모든 이벤트 리스너 제거
once(eventName, eventHandler) - 이벤트를 한 번만 연결한다.
EventEmitter객체 생성
예)
// EventEmitter 객체를 생성합니다.
var custom = new process.EventEmitter();
EventEmitter 객체의 메서드 예)
// EventEmitter 객체를 생성합니다.
var custom = new process.EventEmitter();
// 이벤트를 연결합니다.
custom.on('tick', function (code) {
console.log('이벤트를 실행합니다. ^_^');
});
// 이벤트를 강제로 발생시킵니다.
custom.emit('tick');
이벤트를 어떻게 사용하나?
일반적으로 이벤트를 생성하는 부분과 연결하는 부분을 모듈로 분리해 사용한다.
exam.js 파일
// EventEmitter 객체를 생성합니다.
exports.timer = new process.EventEmitter();
// 이벤트를 강제로 발생시킵니다.
setInterval(function () {
exports.timer.emit('tick');
}, 1000);
module.js파일
// 모듈을 추출합니다.
var rint = require('./exam.js');
// 이벤트를 연결합니다.
rint.timer.on('tick', function (code) {
console.log('이벤트를 실행1');
});
exam.js 파일에서 setInterval() 함수를 실행해 이벤트를 강제 발생시키므로 module.js 파일에서 연결한 이벤트 리스너를 실행한다.
'매일코딩 > Node.js ' 카테고리의 다른 글
[node.js] express 모듈 1 (4) | 2017.03.12 |
---|---|
[node.js] 외부모듈 (2) | 2017.03.11 |
[node.js] HTTP (0) | 2017.03.10 |
[node.js] 기본 내장모듈 (2) | 2017.03.08 |
[node.js] 입문 (4) | 2017.03.07 |
댓글