티스토리 뷰

Node.js

[node.js]이벤트 이해하기

감자형 2017. 9. 17. 21:06
  • 이벤트 이해 하기
1. Node.js => 비동기 방식으로 처리

2. Node  에서 이벤트 처리 하는 EventEmitter 라는것이 만들어 져있음.

3. 다른쪽에서 이벤트를 받고 싶다면 이벤트 리스너 등록

  • 이벤트 보내고 받기
노드의 객체는 EventEmitter를 상속 받을 수 있으며, 상속 반은 후에는 EventEmitter 객체의 on() 과 emit() 메소드 사용 가능

on() 메소드 = 이벤트가 전달될 객체에 이벤트 리스너를 설정하는 역할. 보통은 노드 내부에서 미리 만들어 제공하는 이벤트를 받아 처리하지만,필요할 때는 직접 이벤트를 만들어 전달 할 수도 있다.

once() 메소드 = 이벤트 리스너 함수가 한번이라도 실행하고 나면 자동으로 제거 되므로 이벤트를 딱 한번만 받아서 처리 할 수 있음.

emit() 메소드 = 이벤트를 다른쪽으로 전달하고 싶을 경우
  • 이벤트를 처리하는 EventEmitter의 주요 메소드

메소드 이름 

 설명

on(event,listener)

지정한 이벤트의 리스너를 추가합니다. 

 once(event,listener)

지정한 이벤트의 리스너를 추가하지만 한번 실행이후 자동 제거 

 removeListener(event,listener)

지정한 이벤트에 대한 리스너를 제거 한다. 



Example) 이벤트 예제
//이벤트 예제

process.on('exit',function(){
    console.log('exit 이벤트 발생함');
});
// process 객체는 노드에서 언제든지 사용할 수 있는 객체, 이미 내부적으로 EventEmitter 를 상속받도록 만들어져 있어 on() emit()메소드 바로 사용 가능 
setTimeout(function(){
    console.log('2초 후에 시스템 종료 시도함');
    process.exit();
    
},2000);
// 2초후 process.exit,  2000은 단위 밀리세컨드를 나타내므로 2초후 종료한다.


Example2) 이벤트 전달 예제

// 우리가 직접 만든 이벤트 전달 처리

process.on('tick',function(count){
    console.log('tick Event Occur : %s',count);
});
// tick Event 생성하고 process.on 메소드를 이용하여 이벤트를 등록하면 이 메소드를 호출하면서 파라미터로 전달한 tick 이벤트가 발생했을 때 그다음에 나오는 콜백 함수가 실행 된다. 
setTimeout(function(){
    console.log('2초 후에 tick 이벤트 전달을 시도함');
    process.emit('tick','2');
},2000);
// setTimeout 메소드를 통해 process.emit() 메소드를 호출하면서 tick 이벤트를 process 객체에 전달 함.
  • 계산기 객체를 모듈로 만들어 보기


var util = require('util');
var EventEmitter = require('events').EventEmitter;
// EventEmitter 는 Events 모듈 안에 정의 되어 있고, require() 메소드를 호출하여 events 모듈을 불러들인후 그 안에 속성으로 들어있는 EventEmitter참조
var Calc = function(){
    var self = this;    // this 키워드를 이용해 자기 자신을 가리킬수 있다. 그 안에 정의된 속성에 접근 가능
    
    this.on('stop',function(){
        console.log('calc to stop Event Pass');
    });
//stop 이벤트를 처리하기 위해 Calc 객체 안에서 one 메소드를 호출한다.
    
};

// Calc 객체는 계산기 객체로서, function 키워드를 사용해 프로토 타입 객체를 만든다.  - 계산을 할때마다 공용으로 써야하므로 프로토타입 객체로 만든다.

util.inherits(Calc,EventEmitter);       // Calc 객체가 이벤트 처리를 할 수 있도록 EventEmitter 상속을 하는데, 이때 util 모듈에 있는 inherits()메소드를 사용하면 쉽게 정의 가능. (이미 위에서 utill 모듈을 require 하였으므로 오류 발생 X) 

Calc.prototype.add = function(a,b){
    return a+b;
    
}
// Calc 객체 안에 들어 있는 prototype 객체의 속성으로 add 함수를 추가 하면 new 연산자를 이용해 Calc 객체의 인스턴스 객체를 만들었을 때 add() 함수를 사용할 수 있다.(why? 프로토 타입은 공용의 메모리 공간에서 사용할 수 있는 변수나 함수를 저장한다고 생각을 하면 쉽다. 따라서, new 연산자를 이용해서 객체의 인스턴스 객체를 만들 었을 때 접근이 가능해 진다.)

module.exports = Calc;           // calc3.js 파일에 정의한 모듈을 불러들이는 쪽에서 Calc 객체를 참조 할 수 있도록 module.exports 에 Calc 객체저장
module.exports.title = 'calculator';         // title 속성의 값으로 calculator 라는 이름 설정.

<module VS module.export 차이점 Link>
! Click !


2초 후에 시스템 종료 시도함
exit 이벤트 발생함




  • 이제 위의 app.js(calc) 모듈을 가져오는 연습을 해보겠습니다.
var Calc = require('./app');         // app.js 파일을 참조 한다 아까 module.exports 를 하였으므로

var calc = new Calc();
calc.emit('stop');

console.log(Calc.title + "에 stop 이벤트 전달함.")


calc to stop Event Pass
calculator에 stop 이벤트 전달함.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함