[NodeJS] Event 활용 - 연결 및 제거

2017. 11. 10. 15:46JavaScript/NodeJS

Event는 기본적으로 리스너(Listener)에 이벤트를 등록하고 Emitter를 통하여 해당 Listener를 호출 하는 실행 된다.


책을 읽으려 하니 나는 책이 이해가 잘 가지않는...다...


에혀...ㅋㅋ 내가 많이 부족한가 보다...


모 여튼.. 그러하더라도 책에는 Event 를 3가지로 구분하고 있다.


1. 표준 콜백 패턴


함수가 작업을 마친 후 콜백 함수를 호출함으로써 프로그램을 이어가는 방식이다.


var fs = require("fs");

fs.readFile("/etc/passwd", function(err, fileContent) {

if( err ) throw err;

console.log("파일 내용 : " + fileContent);

});



2. 이벤트 이미터 패턴


콜백 패턴은 하나의 함수 실행 후 하나의 이벤트에 대한 처리에는 적합하지만, 함수 실행 후 다수의 이벤트에 대한 처리는 어렵다.


이런 경우 사용하는 패턴이 이벤트 이미터 패턴이다.



var http = require("http");

var options = {

host: "localhost",

port: "8081",

path: "/index.html"

};


var req = http.request(options, function(response) {

response.on("data", (data) => {

console.log("수신된 데이터 : " + data);

});


response.on("end", () => {

console.log( "응답종료" );

});

});

req.end();


위의 예제는 서버의 index파일을 읽어 들여 출력하는 것이다.

위와 같이 함수가 실행된 후 이벤트가 여러번(시작, 전송, 종료 등) 필요할 때 사용되는 패턴이다.



3. 이벤트 타입


내가 이해한것이 맞다면 이것은 사용자가 직접 이벤트를 작성하고 등록하는 형태이다.


작성법은


//events 모듈 로드

var events = require("events");


//EventEmitter 객체 생성

var emitter = new events.EventEmitter();


//event와 EventHandler을 연동(Listener에 등록)

emitter.on("eventName", eventHandler);


//연동되어 있는(Listener에 등록되어 있는) event 실행

emitter.emit("eventName");


다음은 예제이다.


var emitter = new (require('events')).EventEmitter();


emitter.on("event", () => {

console.log("event 실행...");

});


emitter.emit("event");



4. 이벤트 연결(등록)


emitter.addListener(event, listener);

emitter.on(event, listener);

emitter.once(event, listener);


addListener과 on은 동일한 것이다.

이 두가지는 이벤트를 지속하여 연결하고 잇는 것이지만 once 는 한 번 연결 후 제거 된다.


process 객체를 예를 들면 다음과 같다.



process.addListener("exit", () => {

console.log("Exit Event");

});


process.on("exit", (data) => {

console.log("종료코드 : " + data );

});


process.once("uncaughtException", (err) => {

console.log( "exception listener count[2nd] : " + process.listenerCount("uncaughtException") );

console.log( "exit listener count[2nd] : " + process.listenerCount("exit") );

console.log("----------------------------------------------------");

});


console.log( "exception listener count[1st] : " + process.listenerCount("uncaughtException") );

console.log( "exit listener count[1st] : " + process.listenerCount("exit") );

console.log("----------------------------------------------------");


noneistenFunc();

console.log("예외가 발생으로 실행 되지 않음.");


위의 소스를 실행하면 다음과 같다.


exception listner count[1st] : 1

exit listner count[1st] : 2

----------------------------------------------------

exception listner count[2nd] : 0

exit listner count[2nd] : 2

----------------------------------------------------

Exit Event

종료코드 : 0


보는 바와 같이 exit 이벤트는 2개가 계속 유지 되지만 once 를 사용한 uncaughtException는 한번 실행 후  count가 0임을 확인할 수 있다.

위의 소스의 특이점은 exit 이벤트가 두번 등록이 되어 있는 것을 확인할 수 있을 것이다.
이벤트는 다수의 명칭으로 등록할 수 있으며 해당 이벤트를 실행 시 등록 순서대로 해당 Listener를 호출하게 된다.

주의 할 점은 이벤트 리스너가 실행 되는 도중 Exception이 발생할 경우 다른 이벤트 리스너가 실행 되지 않을 수 있다.

process.addListener("exit", () => {
throw new Error("오류가 발생하였습니다.");
});

process.on("exit", (data) => {
console.log("종료코드 : " + data );
});

위의 결과는 

D:\Develop\Workspace\Neon\NodeJs\event2.js:5
throw new Error("오류가 발생하였습니다.");
^

Error: 오류가 발생하였습니다.
    at process.addListener (D:\Develop\Workspace\Neon\NodeJs\event2.js:5:8)
    at emitOne (events.js:121:20)
    at process.emit (events.js:211:7)

이와 같이 종료코드 : 0 이 출력되지 않고 실행이 되지 않은것을 확인 할 수 있다.



5. 이벤트 제거


emitter.removeListener(event, listener);

emitter.removeAllListener([event]);


등록되어 있는 이벤트를 제거하기 위해 사용된다.


var exitListener = function() {

    console.log('프로그램 종료[1st]');

};


// 이벤트 연결

process.on('exit', exitListener);


process.on('exit', ()=> {

console.log("프로그램 종료[2nd]")

});


// 이벤트 제거

process.removeListener('exit',exitListener);


결과 : 


프로그램 종료[2nd]







'JavaScript > NodeJS' 카테고리의 다른 글

[NodeJS] File System  (0) 2017.11.16
[NodeJS] Path  (0) 2017.11.13
[NodeJS] 모듈, 캐싱 그리고 exports  (0) 2017.11.08
[NodeJS] Callback Function, Blocking Code, Non-Blocking Code  (0) 2017.11.07
[NodeJS] 내장모듈 사용  (0) 2017.11.07