Basic express-sse 모듈과 EventEmitter

황제낙엽 2020.09.20 05:48 조회 수 : 265

sitelink1 https://nodei.co/npm/express-sse 
sitelink2 https://blog.naver.com/jdub7138/221034236810 
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

* express-sse란? (출처는 sitelink1)

    expres-sse는 단순함을 유지한다는 의미를 가지고 있다. 

    많은 복잡도와 오류 없이 server-sent 이벤트를 보내야 할때를 위한 라이브러리이다.

    EventEmitter의 사용을 편리하게 해준다.

 

* 설치 :  npm install --save express-sse

 

* EventEmitter란?

    이벤트이미터는 사전적인 의미로 이벤트 발행자이다.

    node.js에 내장되어 있는 옵저버 패턴으로써 

    emit을 통해 이벤트를 발생시키고 on을 통해 해당 이벤트에 관한 콜백함수를 발동시키는 형식이다. 

    이는 node.js의 event driven programming이라는 개념에 해당하는 방법이다. 

    특정 이벤트가 발생되면 그 이벤트에 매핑 되어 있는 함수가 발동 된다.

 

* EventEmitter를 이해하기 위한 학습 (출처는 sitelink2)

 

System Event vs Custom Event

프로그래밍에서 이벤트란, 어플리케이션 안에서 발생한 어떤 사건으로서 respond 할 수 있는 것을 말합니다. 

NodeJS에서는 이벤트를 2가지로 구분할 수 있는데 하나는 System Event이고 다른 하나는 Custom Event입니다.

 

System Event는 외부에서 파일 가져오기 등과 같이 컴퓨터 시스템 단에서 처리하는 lower level, closer to the machine한 이벤트들을 말합니다. 

이러한 System Event들은 NodeJS의 libuv 라이브러리(C++로 작성)가 담당합니다.

 

NodeJS의 또다른 이벤트의 형태는 Custom Event, 즉, 임의의 이벤트를 말합니다. 

이 부분은 NodeJS의 EventEmitter가 담당하며 JavaScript로 작성되었습니다. 

사실 JavaScript에는 Event 개념이 없기 때문에, NodeJS가 제공하는 이 EventEmitter를 활용해서 Event처럼 꾸며주는 것입니다.

 

 

Custom Event Emitter 설계

위에서 언급하였듯이, JavaScript는 Event 개념이 없습니다. 

이에 JavaScript 환경에서 Event를 생성하고 다루기 위해서는 NodeJS가 제공하는 EventEmitter를 사용하게 됩니다. 

NodeJS의 EventEmitter를 활용하기 전에 이 EventEmitter가 어떻게 작동하는지 Custom Event Emitter를 만들어서 이해해보도록 하겠습니다. 

참고로 Event를 Emit(방출, 발산)한다는 것은 그냥 Event를 발생시킨다는 의미이며, Event Listener나 Handler는 이렇게 발생(Emit)한 Event를 인지하고 처리하는 역할을 하게 됩니다.

 

먼저 아래와 같이 emitter.js 파일을 만들고 그 안에 임의의 Emitter를 만들어줍니다. 

이 Emitter는 function constructor로서 event들을 저장해두는 object들을 찍어내는 역할을 합니다. 

이제 이 function constructor가 찍어낼 object들이 공유할 on 메서드와 emit 메서드를 만들어줍니다. 

on 메서드는 특정 이벤트가 발생하면 이를 인지하고 수행할 메서드들을 정의하는 역할을 합니다. 

Emitter의 event property object에 새로 'type' property를 Array로 만든 다음, 여기에 수행할 메서드들을 집어넣을 수 있게 합니다. 

그리고 emit 메서드는 'type' 이벤트를 발생시키는 역할을 하는 것으로서, on 메서드를 통해 생성된 'type' property Array 안의 메서드들을 실행시키게 됩니다.

 

// emitter.js
// Function Constructor
function EventEmitter() {
  this.event = {};
}
// Listener
EventEmitter.prototype.on = function (typelistener) {
  // Emitter will have a property 'event' that will have a property 'type'
  // 'type' is an array that stores functions that will occur when Event emits
  this.event[type] = this.event[type] || [];
  this.event[type].push(listener);
};
// Emitter
EventEmitter.prototype.emit = function (type) {
  this.event[type].forEach(function (item) {
      // when the Event emits, invoke all the functions in the 'type' Array
      item();
  })
};
module.exports = EventEmitter;

 

이제 이렇게 만든 Emitter를 아래처럼 app.js에서 불러와 활용해봅니다. 

on 메서드를 통해 greet라는 이벤트가 발생하면 호출할 함수를 event.greet(또는 event['greet']의 Array에 저장해둡니다. 

그리고 emit 메서드를 통해 greet 이벤트를 발생시킵니다. 

 

// app.js
var EventEmitter = require('./emitter.js');
var emitr = new EventEmitter();
// Make Listener for 'greet' event using the on method
emitr.on('greet'function () {
    console.log('greet event occurred');
});
// Make another Listner for 'greet' event
emitr.on('greet'function () {
    console.log('Nice to meet you!');
});
// Simulate an event and invoke the emit method
console.log('greet'); // 관상용(?) emitr.emit('greet');

 

 

NodeJS EventEmitter 활용

NodeJS의 events 라이브러리가 제공하는 EventEmitter는 위에서 살펴본 Custom Event Emitter와 거의 흡사합니다. 

사실 위에서 작성한 app.js에서 require가 가져오는 파일만 events.js로 바꿔만 주면 됩니다. 

이 events.js는 NodeJS의 라이브러리로서 EventEmitter가 담겨져 있습니다.

 

// app.js
var EventEmitter = require('events');
var emitr = new EventEmitter();
emitr.on('greet'function () {
    console.log('greet event occurred');
});
emitr.on('greet'function () {
    console.log('Nice to meet you!');
});
console.log('greet');
emitr.emit('greet');

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
36 no pooling 상태에서 beginTransaction 콜백을 이용한 Transaction 처리 황제낙엽 2021.01.16 15
35 mysql.escape()로 where 문 작성 황제낙엽 2021.01.16 47
34 req, res 객체 황제낙엽 2021.01.14 19
33 mysql basic (mysql 설치, 접속, 조회) 황제낙엽 2021.01.12 18
32 urlencode : request params의 한글 처리 황제낙엽 2020.12.06 99
31 express 4.16부터는 body-parser를 내장한다 황제낙엽 2020.12.06 268
30 [TDD/REST-7강] 코드 리팩토링 (express.Router, control) 황제낙엽 2020.12.04 46
29 [TDD/REST-6강] 사용자 API 개발 황제낙엽 2020.12.03 29
28 [TDD/REST-목차][T아카데미] Node.js 기반의 REST API 서버 개발 file 황제낙엽 2020.12.03 15
27 [TDD/REST-5강] TDD로 API 서버 개발 (작업절차, get users 테스트) 황제낙엽 2020.12.01 11
26 [TDD/REST-4강] TDD 이해 및 환경 구축 (Rest API, TDD, mocha, Should, SuperTest) 황제낙엽 2020.12.01 18
25 google oatuh passport file 황제낙엽 2020.11.12 18
24 google oauth 인증 (구글 로그인) file 황제낙엽 2020.11.12 84
» express-sse 모듈과 EventEmitter 황제낙엽 2020.09.20 265
22 [Node Package Manager] npm audit file 황제낙엽 2020.09.17 5
21 Node.js , NPM 관련 명령어 정리 황제낙엽 2020.09.10 141
20 [Deprecated] request / request 황제낙엽 2020.08.26 123
19 dotenv (Node.js 기반에서 환경변수 사용하기) 황제낙엽 2020.08.23 81
18 로깅툴 morgan (Logging) 황제낙엽 2020.08.19 12
17 nodemon 설치 및 활용 file 황제낙엽 2020.08.16 102