โ โ์ฝ๋ฉโ์ด๋ ์ฌํ์ง์ ์์ โ๋๊ตดโ๋ณด๋ค๋ ์์ด๋ฉด์, โ๊ด๋ฆฌโ์ ๋ฐ๋ก ๋ฐ ์ด๋์๊ฐ ์์นํ๋ ์ง์ ์ด๋ค. โ
- Gerald Weinberg
์ปดํจํฐ ๊ณผํ์, ์ํํธ์จ์ด ๊ฐ๋ฐ๊ด๋ จ ์ธ๋ฅํ ๋ฐ ์ฌ๋ฆฌํ ๊ต์

Event ๋ชจ๋
Node.js ์์ Event๋ฅผ ๋งค์ฐ ๋ง์ด ์ฌ์ฉํ๊ณ , ์ด ๋๋ฌธ์ ๋ค๋ฅธ ๋น์ทํ ๊ธฐ์ ๋ค๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์๋๋ฅผ ์๋ํฉ๋๋ค.
Node.js ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ์๋ฒ๊ฐ ๊ฐ๋๋๋ฉด, ๋ณ์๋ค์ initialize ํ๊ณ , ํจ์๋ฅผ ์ ์ธํ๊ณ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
์ด๋ฒคํธ ์์ฃผ (Event-Driven) ์ดํ๋ฆฌ์ผ์ด์
์์๋, ์ด๋ฒคํธ๋ฅผ ๋๊ธฐํ๋ ๋ฉ์ธ ๋ฃจํ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ๊ฐ ๊ฐ์ง๋์์์ Callbackํจ์๋ฅผ ํธ์ถํฉ๋๋ค.

์ด๋ฒคํธ๊ฐ ์ฝ๋ฐฑ๊ณผ ๋น์ทํด ๋ณด์ผ ์ ๋ ์์ต๋๋ค.
์ฐจ์ด์ ์, ์ฝ๋ฐฑํจ์๋ ๋น๋๊ธฐ์ ํจ์์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๋ ํธ์ถ๋์ง๋ง,
์ด๋ฒคํธํธ๋ค๋ง์ ์ต์ ๋ฒ ํจํด์ ์ํด ์๋๋ฉ๋๋ค.
์ด๋ฒคํธ๋ฅผ ๋๊ธฐํ๋ (EventListeners) ํจ์๋ค์ด ์ต์ ๋ฒ ์ญํ ์ ํฉ๋๋ค.
์ต์ ๋ฒ๋ค์ด ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ, ์ด๋ฒคํธ๊ฐ ์คํ๋๋ฉด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
Node.js์์๋ ์ด๋ฒคํธ ๋ชจ๋๊ณผ EventEmitter ํด๋์ค๊ฐ ๋ด์ฅ๋์ด ์๋๋ฐ, ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฐ๋์ํฌ ์ ์์ต๋๋ค.
์ด๋ฒคํธ ๋ชจ๋์ ์ฌ์ฉํ๋ ค๋ฉด require() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ก๋ํ๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ ํตํด EventEmitter ํด๋์ค๋ฅผ ๋ก๋ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
// events ๋ชจ๋ ์ฌ์ฉ
var events = require('events');
// EventEmitter ๊ฐ์ฒด ์์ฑ
var eventEmitter = new events.EventEmitter();
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ด๋ฒคํธ๋ฅผ ์ฐ๋์ํค๋๊ฑด ๋ค์๊ณผ ๊ฐ์ต๋๋ค
// event์ EventHandler ๋ฅผ ์ฐ๋(bind)
// eventName ์ ์์๋ก ์ค์ ๊ฐ๋ฅ
eventEmitter.on('eventName', eventHandler);
ํ๋ก๊ทธ๋จ์์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ๋ ๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค
eventEmitter.emit('eventName');
events ๊ฐ์ฒด์ ๋ฉ์๋
- addListener(event, listener) : on() ๋ฉ์๋์ ๊ฐ์ต๋๋ค. ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ ๋ฉ์๋์ ๋๋ค.
- .on(event, listener) : addListener()๊ณผ ๋์ผํฉ๋๋ค. ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ ๋ฉ์๋์ ๋๋ค.
- once(event, listener) : ์ด๋ฒคํธ๋ฅผ ํ ๋ฒ๋ง ์ฐ๊ฒฐํ ํ ์ ๊ฑฐํฉ๋๋ค.
- removeListener(event, listener) : ํน์ ์ด๋ฒคํธ์ ํน์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์ด ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ฆฌ์ค๋๋ฅผ ์ญ์ ํ๋ฉด ๋ฆฌ์ค๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๊ฐ ๊ฐฑ์ ๋๋ ์ฃผ์ํด์ผ ํฉ๋๋ค.
- .removeAllListeners([event]) : ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- .off([event]) : removeListener์ ๊ธฐ๋ฅ์ด ๊ฐ์ต๋๋ค.
- .setMaxListeners(n) : n์ผ๋ก ํ ์ด๋ฒคํธ์ ์ต๋ํ์ฉ ๊ฐ์๋ฅผ ์ ํด์ค๋๋ค. node.js๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํ ์ด๋ฒคํธ์ 10๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ ์ ์๋๋ฐ, 11๊ฐ ์ด์์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด n๊ฐ์ ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค. n๊ฐ์ผ๋ก 0์ ๋๊ฒจ ์ฃผ๋ฉด ์ฐ๊ฒฐ ๊ฐ์ ์ ํ์ด ์ฌ๋ผ์ง๋๋ค.
- .emit(eventName[, ...args]) : ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํต๋๋ค.
- .listenerCount(์ด๋ฒคํธ๋ช ) : ํ์ฌ ๋ฆฌ์ค๋๊ฐ ๋ช๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธ
์ด๋ฒคํธ ์์ฑ(์ด๋ฒคํธ ํธ๋ค๋ฌ ์ฐ๊ฒฐ)
์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด, emitter์ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ ๊ฐ์ฒด, event์ ์ด๋ฒคํธ ์ด๋ฆ, listener์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
addlistener() ๋ฉ์๋์ on() ๋ฉ์๋๋ ์๋ก ๊ฐ์ผ๋ ๋ ์ค ์ต์ํ ๊ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
var EventEmitter = require('events'); // ๋ชจ๋ ์ฌ์ฉ
var custom_event = new EventEmitter(); // ๊ฐ์ฒด ์์ฑ
custom_event.on('call', function() { // ์ด๋ฒคํธ ๋ฑ๋ก
console.log('์ด๋ฒคํธ ์ฝ');
});
custom_event.emit('call'); // ์ด๋ฒคํธ ๊ฐ์ ๋ฐ์
์ด๋ฒคํธ ์ ๊ฑฐ
addlistener() ๋ฉ์๋๋ on() ๋ฉ์๋๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
removeListener()๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ ์ ์๊ณ , removeAllListeners() ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
var EventEmitter = require('events');
var custom_event = new EventEmitter();
custom_event.on('call', function() {
console.log('์ด๋ฒคํธ ์ฝ');
});
custom_event.removeAllListeners();
custom_event.emit('call');
call ์ด๋ฒคํธ๋ฅผ ๋ถ๋ฅด๊ธฐ ์ ๋ฆฌ์ค๋๋ฅผ ์ญ์ ํ๊ธฐ ๋๋ฌธ์ ์คํํ๋ฉด ์ฝ์์ ์๋ฌด๊ฒ๋ ์ฐํ์ง ์์ต๋๋ค.
// events ๋ชจ๋ ์ฌ์ฉ
var events = require('events');
// EventEmitter ๊ฐ์ฒด ์์ฑ
var eventEmitter = new events.EventEmitter();
// EventHandler ํจ์ ์์ฑ
var connectHandler = function connected(){
console.log("Connection Successful");
// data_recevied ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ธฐ
eventEmitter.emit("data_received");
}
// connection ์ด๋ฒคํธ์ connectHandler ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฐ๋
eventEmitter.on('connection', connectHandler);
// data_received ์ด๋ฒคํธ์ ์ต๋ช
ํจ์์ ์ฐ๋
// ํจ์๋ฅผ ๋ณ์์์ ๋ด๋ ๋์ ์, .on() ๋ฉ์๋์ ์ธ์๋ก ์ง์ ํจ์๋ฅผ ์ ๋ฌ
eventEmitter.on('data_received', function(){
console.log("Data Received");
});
// connection ์ด๋ฒคํธ ๋ฐ์์ํค๊ธฐ
eventEmitter.emit('connection');
console.log("Program has ended");
$ node main.js
Connection Successful
Data Received
Program has ended
Reference
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.