WIL 10주차

김동현·2023년 1월 15일
0

WIL

목록 보기
10/20

오디오 solo 재생에 대해 검색을 하던 도중 Emitter에 대해 조금 공부를 해보았습니다!

Nodejs EventEmitter는 nodejs 애플리케이션을 만들다 보면 많이 사용하는 라이브러리 입니다.

EventEmitter와 EventLoop 사이엔 아무런 관계가 없다

EventLoop

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

EventEmitter

  • 특정 이벤트에 리스너 함수를 달아, 이벤트가 발생했을 때 이를 캐치할 수 있도록 만들어진 api입니다.
  • EventEmitter의 인스턴스는 EventEmitter인스턴스 자체 내에서 이벤트와 연결된 모든 이벤트와 리스너를 추적합니다!
  • EventLoop의 큐를 사용하는 것이 아닙니다.
  • 이벤트 이름이 있는 이벤트 객체 / 그 값은 이벤트 리스너 함수들이 들어가 있는 배열일 뿐

EX)

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.on('myevent', () => console.log('handler1: myevent was fired!'));
myEmitter.on('myevent', () => console.log('handler2: myevent was fired!'));
myEmitter.on('myevent', () => console.log('handler3: myevent was fired!'));

myEmitter.emit('myevent');
console.log('I am the last log line');

// 출력

handler1: myevent was fired!
handler2: myevent was fired!
handler3: myevent was fired!
I am the last log line

EventEmitter는 동기적으로 모든 이벤트 핸들러를 호출하므로 I am the last log line은 모든 리스너 함수가 실행되기 전까지 출력되지 않습니다!

Node.js가 비동기적으로 작동하는 것은 그 내부에 비동기 이벤트를 소화하기 위한 라이브러리(libuv)를 지니고 있기 때문입니다. Node.js의 이벤트 루프는 libuv를 이용해 구현되었으며, 크게 여섯 단계의 페이즈를 순환하고 있습니다. 각 페이즈는 libuv를 통해 커널 혹은 쓰레드 풀에 인계했던 콜백 작업을 실행합니다.

setTimeout, setInterval 등 타이머 작업 혹은 DB 연결, 파일 읽기/쓰기, HTTP 요청 등 모든 비동기 작업들은 libuv를 통해 스케줄링 되었다가 이벤트 루프의 순환 주기에 따라 호출됩니다.

Event

  • 이벤트란 "어플리케이션 내에서 발생한 응답 가능한 사건" 이라고 표현합니다
  • Node에서는 특히 아키텍쳐의 근간을 이루는 개념이기에 중요하게 다뤄야합니다!

events 객체의 메소드

emitter.addListener(event, listener)
- on() 메소드와 같습니다. 이벤트를 생성하는 메소드입니다.
emitter.on(event, listener)
- addListener()과 동일합니다. 이벤트를 생성하는 메소드입니다.
emitter.once(event, listener)
- 이벤트를 한 번만 연결한 후 제거합니다.
emitter.removelistener(event, listener)
- 특정 이벤트의 특정 이벤트 핸들러를 제거합니다.
- 이 메소드를 이용해 리스너를 삭제하면 리스너 
  배열의 인덱스가 갱신되니 주의해야 합니다.
emitter.removeAllListeners([event])
- 모든 이벤트 핸들러를 제거합니다.
emitter.setMaxListeners(n)
- n으로 한 이벤트에 최대허용 개수를 지정합니다.
- node.js는 기본값으로 한 이벤트에 10개의 이벤트 핸들러를 작성할 수 있는데,
  11개 이상을 사용하고 싶다면 n값을 넘겨주면 됩니다.
- n값으로 0을 넘겨주면 연결 개수 제한이 사라집니다.
emitter.emit(eventName[, ...args])
- 이벤트를 발생시킵니다.!
profile
꺽이지 않는 마음

0개의 댓글