node EventEmitter

웅평·2023년 7월 19일
0

비동기 프로그래밍을 하는 또다른 방법으로 이벤트를 사용하는 방법이 있다.

Node.js에서의 Event가 중요한 이유

Node.js 에서의 이벤트란 어떤 일이 발생했음을 알리는 신호 이다

  • 대부분의 노드의 core API들은 이벤트 기반 구조 위에서 작성되었고, 그 구조에서는 특정 객체가 이벤트를 발생시키면, 해당 이벤트에 대한 call-back(listener)가 실행된다.

  • 서드파티 모듈이든 직접 만든 모듈이든 대부분의 모듈을 core 모듈을 사용하게 되는데, 이러한 core 모듈에서 제공되는 많은 객체들이 이벤트 기반으로 작동하게 되므로 이벤트에 대한 이해가 중요하다

  • Event를 발생시키는 모든 객체는 모두 EventEmitter 클래스의 객체이다. 매우 핵심적인 내용이다.

노드에서는 이벤트를 발생시키기 위해선 EventEmitter 객체를 사용하게 된다.
사용방법은 다음과 같다.

const EventEmitter = require('events');

events 모듈은 EventEmitter라는 class 하나를 공개하게 된다.
EventEmitter는 한국말로 이벤트 발생기 정도로 해석할 수 있는데, 해당 클래스의 객체가 있어야만 Event를 발생시킬 수 있게 된다.

const myEmitter = new EventEmitter();

위 코드처럼 myEmitter에 객체를 만들고 사용하게 된다.

Nodejs의 EventLoop는 Nodejs의 비동기, 논블로킹 I/O 매커니즘을 처리하는 핵심적인 부분이다. EventLoop는 다양한 유형의 비동기 이벤트를 특정 순서대로 처리한다.

Event Loop란 각종 콜백들의 실행 조건(특정 시간이 경과했는지 등)을 확인하고, 실제로 콜백을 실행하는 로직

EventEmitter 메소드

on 메소드

on 메소드는 이벤트 핸들러를 설정하는 메소드
on 메소드와 같은 용도를 가진 addListener라는 메소드도 있다.

const EventEmitter = require('events');

const myEmitter = new EventEmitter();

myEmitter.on('test', () => {
  console.log('Success!');
});

myEmitter.emit('test');

emit 메소드

emit 메소드는 인위적으로 이벤트를 발생시키기 위해 쓰는 메소드

once 메소드

once 메소드는 특정 이벤트에 대한 이벤트 핸들러를 등록하고 해당 이벤트에 대해서 딱 한 번만 반응해서 실행

const EventEmitter = require('events');

const myEmitter = new EventEmitter();

myEmitter.once('test', () => {
  console.log('Success!');
});

myEmitter.emit('test');
myEmitter.emit('test');

결과는 한번만 출력된다

listeners 메소드

특정 이벤트에 대한 여러 이벤트 핸들러들을 출력해주는 메소드

const EventEmitter = require('events');

const myEmitter = new EventEmitter();

myEmitter.once('test', () => {
  console.log('A');
});

myEmitter.once('test', () => {
  console.log('B');
});

myEmitter.once('test', () => {
  console.log('C');
});

console.log(myEmitter.listeners('test'));

이벤트 핸들러(함수, Function)들이 설정돼있다는 걸 알 수 있는 결과가 출력된다

off 메소드

이벤트 핸들러를 해제하는 메소드

잘못된 예시

const myEmitter = new EventEmitter();

myEmitter.on('test', () => { // --- (A)
  console.log('Success!');
});

myEmitter.off('test', () => { // --- (B)
  console.log('Success!');
});

myEmitter.emit('test');

off 메소드를 썼는데도 이렇게 이벤트에 반응한 이유는 (A) 이벤트 핸들러와 (B) 이벤트 핸들러는 똑같이 생겼지만 서로 다른 함수이기 때문에 결과가 출력된다

올바른 예시

const myEmitter = new EventEmitter();

const callback = () => {
  console.log('Success!');
};

myEmitter.on('test', callback);

myEmitter.off('test', callback);

myEmitter.emit('test');

참고
코드잇

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 잘 읽었습니다, 고맙습니다!

답글 달기