NodeJS 이벤트 처리
Node는 입출력을 처리할 때 이벤트를 기반으로 하는 비동기 방식으로 처리합니다.
이벤트란 어떠한 사건이 발생한 것입니다. 예를들어 프로그램에 대한 이벤트로는 프로그램 시작 이라는 이벤트와 프로그램 종료 라는 이벤트가 있을것입니다. 혹은 게임을 예로 들자면 캐릭터가 죽었다라거나 캐릭터가 레벨업을 했다 캐릭터가 이전 좌표를 기준으로 움직였다 라는 이벤트가 있을 수 있습니다.
이러한 각각의 이벤트에는 이벤트리스너라는것이 등록되어 있는데 쉽게 말해서 해당 이벤트가 발생했을때 호출되는 함수나 메서드라고 생각하면 쉽습니다. 캐릭터 레벨업이라는 이벤트에는 캐릭터의 체력과 공격력을 증가시켜주는 로직이 들어있는 이벤트리스너가 등록되어 있을 것입니다.

Node는 이벤트를 처리하기 위해서 EventEmitter 라는 클래스를 제공합니다.
보통은 기본적으로 제공되는 이벤트를 받아서 처리하지만 EventEmitter를 이용하면 직접 이벤트를 만들어 처리할 수 있습니다.
이벤트를 처리하는 방법은 EventEmitter를 상속받은 객체를 만들어 EventEmitter의 메서드를 사용하여 처리하는 방법입니다.
EventEmitter에는 다음과 같은 메서드가 정의되어 있습니다.

메서드
설명
on(event, listener) 지정한 event에 대한 listener를 추가합니다.
once(event, listener) 지정한 event에 대한 listener를 추가합니다. 다만 이 리스너는 최초 한번만 실행 된 후 제거됩니다.
removeListener(event, listener) 지정한 event에 대한 listener를 제거합니다.


이벤트리스너 등록
process객체는 Node의 기본 내장객체로서 어디서든 사용 가능하며 현재 실행중인 Node 프로그램에 대한 정보를 담고있는 객체입니다.
이 process객체는 기본적으로 EventEmitter를 상속하고 있으므로 이를 이용해 process에 대한 이벤트를 다룰 수 있습니다.

다음의 소스를 보면 process.on() 메서드를 통해 'exit' 이벤트에 대한 이벤트리스너로 프로세스가 종료됨을 알려주는 로그를 출력하도록 등록했습니다. 

exit 이벤트는 현재 실행중인 Node 프로그램이 종료될 때 발생되는 이벤트입니다. 이말은 곧 현재 프로그램이 종료 될 때 지금 등록한 이벤트리스너가 실행된다는 뜻입니다. 이 프로그램은 '이 로그를 출력 한 후 프로그램이 종료됨.' 이라는 로그를 출력한 후 바로 종료되며 exit 이벤트에 등록해 두었던 리스너가 실행되어 '프로세스를 종료합니다!!.' 라는 로그를 출력합니다.
process.on('exit', function() {
    console.log('프로세스를 종료합니다!!.');
});

console.log('이 로그를 출력 한 후 프로그램이 종료됨.');
이 로그를 출력 한 후 프로그램이 종료됨.
프로세스를 종료합니다!!.


직접 이벤트 만들고 발생시키기
이번에는 이벤트를 직접 만들어보겠습니다. 다음의 소스에는 직접 customEvent라는 이벤트를 직접 만들어 그에 대한 이벤트리스너를 등록했습니다. 그리고 process.emit() 메서드를 통해 직접 내가 만든 customEvent를 발생시켰습니다. 그리고 이벤트가 발생하면서 등록해 두었던 이벤트리스너가 실행됩니다.
process.on('customEvent', function() {
    console.log('내가 만든 이벤트가 발생함.');
});

console.log('이벤트를 직접 발생시킴');
process.emit('customEvent');
이벤트를 직접 발생시킴
내가 만든 이벤트가 발생.


EventEmitter 직접 상속받아 이벤트 처리
EventEmitter를 직접 이용하고 싶다면 다음과 같이 require()를 통해서 얻을 수 있습니다.
var EventEmitter = require('events').EventEmitter;

또한 직접 정의한 객체에 EventEmitter를 상속받아 사용하는 경우 util 모듈을 이용하여 간단하게 상속 후 사용 가능합니다.
var util = require('util');
var EventEmitter = require('events').EventEmitter;

var MyObj = function() {
    this.on('customEvent', function() {
        console.log('MyObj customEvent 발생');
    });
};

//EventEmitter 상속
util.inherits(MyObj, EventEmitter);

var myObj = new MyObj();

//customEvent 발생
myObj.emit('customEvent');
MyObj customEvent 발생


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!