Node.js는 완벽한 이벤트 기반 어플리케이션이다.
컴퓨터 안에서 일어나는 모든 행동을 “이벤트”라고 부른다. Node.js 안의 모든 객체는 이벤트를 발생시킬 수 있다.
Node.js 기반으로 만들어진 서버가 가동되면, 변수들을 초기화하고, 메소드들을 선언하고 이벤트가 일어날때까지 기다린다. 이벤트 기반 어플리케이션에서는, 이벤트를 대기하는 메인 루프가 존재한다. 그리고 이벤트가 감지되었을 때, Callback 메소드(이벤트 핸들러)를 호출한다.
모든 객체는 이벤트를 가지고 있다
아래는 이벤트에 대한 간단한 예제이다.
var fs = require('fs'); // 파일 시스템 모듈 추가
var rs = fs.createReadStream('./demofile.txt'); // 파일 스트림을 열음
rs.on('open', function () { // 'open' 이라는 이벤트가 발생했을 때 작동되는 메소드
console.log('The file is open');
});
rs(ReadStream) 객체는 그저 파일 시스템 객체일 뿐이지만, 모든 객체는 이벤트를 발생시키고, 이를 감지할 수 있기에, rs.on() 메소드의 사용이 가능하다. rs.on() 메소드는 객체 내에서 파라미터 값 대로 이벤트가 발생했을때, 해당 이벤트 핸들러(메소드)를 실행시킨다.
이벤트 모듈
Node.js는 빌트인 모듈로 이벤트를 Create, Fire, Listen For 할 수 있는 “이벤트 모듈”을 가지고 있다. 이벤트 모듈을 사용하기 위해선, reuiqre() 메소드를 통해 events 모듈을 추가하고, EventEmitter 객체를 생성해야 한다.
var events = require('events');
var eventEmitter = new events.EventEmitter();
EventEmiiter 객체
EventEmitter 객체의 메소드는 크게 두 가지로 나뉘어 진다.
- eventEmitter.emit(“eventName”) : 이벤트를 발생시키는 메소드, “eventName” 이라는 메소드를 발생시키게 된다.
- eventEmitter.on(“eventName”, function{…}) : “eventName” 이라는 메소드가 발생될 때, 이를 처리할 이벤트 핸들러(메소드)를 매핑하주는 역할을 한다.
아래의 소스 코드를 보면, 이 메소드들에 대해 좀 더 명확하게 이해할 수 있을 것이다.
var events = require('events'); // 이벤트 모듈 추가
var eventEmitter = new events.EventEmitter(); // EventEmitter 객체 생성
//이벤트 핸들러 생성:
var myEventHandler = function () {
console.log('I hear a scream!');
}
//이벤트와 이벤트 핸들러를 매핑 시킴:
eventEmitter.on('scream', myEventHandler);
//'scream' 이벤트를 Fire 함:
eventEmitter.emit('scream');