[ TIL 221205 ] Node Event module

ponyo·2022년 12월 5일
0

Node

목록 보기
4/7

Node에서의 event

1️⃣ 이벤트 핸들러 정의하기

process.on('이벤트이름', function(파라미터1, 파라미터2, ... 파라미터n) {
  ... 이벤트가 발생한 경우 실행될 기능을 구현 ...
});

2️⃣ 이벤트 핸들러 호출하기

process.emit('이벤트이름', 파라미터1, 파라미터2, ... 파라미터n);

Event 모듈

Node.js 기반으로 만들어진 서버가 가동되면, 변수들을 initialize 하고, 함수를 선언하고 이벤트가 일어날때까지 기다립니다.

이벤트 위주 (Event-Driven) 어플리케이션에서는, 이벤트를 대기하는 메인 루프가 있습니다.
그리고 이벤트가 감지되었을시 Callback함수를 호출합니다.

이벤트 핸들링은 옵저버 패턴에 의해 작동

이벤트를 대기하는 (EventListeners) 함수들이 옵저버 역할을 합니다.

옵저버들이 이벤트를 기다리다가, 이벤트가 실행되면 이벤트를 처리하는 함수가 실행됩니다.

events 모듈 사용

// events 모듈 사용
let events = require('events');

// EventEmitter 객체 생성
let eventEmitter = new events.EventEmitter();

이벤트 핸들러와 이벤트를 연동

// event와 EventHandler를 연동 (bind)
// eventName 은 임의로 설정 가능
eventEmiiter.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(이벤트명) : 현재 리스너가 몇개 연결되어 있는지 확인

🚀 Practice

# EventEmiter를 사용하여 직접 정의한 객체가 이벤트를 갖도록 구현하기

(1) 모듈 가져오기

const { EventEmitter } = require('events');

(2) 클래스 정의하기

const Radio extends EventEmitter {
  constructor() {
    // 클래스의 상속이 이루어졌으므로
    // 생성자에서 상위 클래스의 생성자를 호출하도록 지정. ---> 상속 구현
    // new 키워드에 의해서 호출되기 전까지 생성자는 실행되지 않는다.
    super();
  }
}

(3) 직접 정의한 클래스에 대한 객체

const radio = new Radio();

(4) 이벤트 수 설정하기

radio.setMaxListeners(5);

(5) 이벤트 리스너에 이벤트 핸들러 연결하기

이벤트 이름은 사용자가 직접 정의

const onTurnOn = (channel) => console.debug('라디오가 켜졌습니다. 채널번호=' + channel);
radio.on('turnon', onTurnOn);
radio.on('turnon', (channel) => console.log('Hello Radio' + channel));
radio.addListener('changechannel', (channel) => console.log('채널이 %d 번으로 변경되었습니다.', channel));

(6) 1회용 이벤트

radio.once('turnoff', (channel) => console.log('라디오가 꺼졌습니다. 채널번호=' + channel));

(7) 이벤트 발생시키기

for (let i = 0; i < 2; i++) {
  console.group('%d번째 실행중...', i + 1);
  radio.emit('turnon', i);
  radio.emit('changechannel', i);
  // once로 이벤트가 정의되었으므로 한번만 실행된다.
  radio.emit('turnoff', i);
  console.debug();
  console.groupEnd();
}

(8) 이벤트 제거하기

radio.removeListener('turnon', onTurnOn);
radio.emit('turnon', 1000);

📖 도움 받은 글 : https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-require-%EB%AA%A8%EB%93%88

profile
😁

0개의 댓글