[Node.js] EventEmitter

Hoplin·2023년 6월 17일
1

EventEmitter

Node.js에는 EventEmitter라는것이 존재한다. EventLoop는 Node.js의 비동기, Non-Blocking Stream을 처리하는 핵심 부분이 된다. EventEmitter를 사용하기 위해서는 events 모듈을 사용하면 된다. 기본적으로 EventEmitter인스턴스를 만든 후 이벤트 관리 메소드를 사용한다.

import * as event from 'events'

const new_event = new event.EventEmitter();

이 인스턴스는 이벤트를 관리하기 위한 메소드를 가지고 있다. 메소드들의 목록을 살펴보자.

메소드기능
on(이벤트명, 콜백)이벤트 이름과 이벤트 발생시의 콜백을 연결한다. 이렇게 연결하는 동작을 이벤트 리스닝이라고 한다.
emit(이벤트명)이벤트를 호출하는 메소드이다. 이벤트 이름을 인수로 넣으면 미리 등록한 이벤트 콜백이 실행된다
once(이벤트명, 콜백)한번만 실행되는 이벤트이다. 한번 이상 호출해도 콜백 호출이 이루어지지 않는다.
removeAllListeners(이벤트명)이벤트에 연결된 모든 이벤트 리스너를 제거한다.
removeListener(이벤트명,리스너)이벤트에 연결된 리스너를 하나씩 제거한다. 리스너를 꼭 같이 넣어주어야 한다
listenerCount(이벤트명)현재 리스너가 몇개 연결되어있는지 확인한다.

on() & emit()

new_event.on('event1', () => {
  console.log('event1 called')
})

new_event.on('event2', () => {
  console.log('event2 called')
})

new_event.emit('event1');
new_event.emit('event2');
/*
event1 called
event2 called
*/

on()을 통해 이벤트를 등록한다. 위 예시에 있듯이 두번째 매개변수로는 등록한 이벤트 발생시 실행할 콜백함수를 넘겨준다.

emit()을 사용해서 등록된 이벤트를 발생시킨다. 위 예시에서 event1event2를 매개변수로 넘겨줘 이벤트를 발생시키는것을 볼 수 있다.

만약에 콜백에 매개변수를 넘겨주어야한다고 가정해보자. 그런 경우에는 emit()메소드의 첫번째 매개변수에는 이벤트의 이름을, 두번째 매개변수부터 콜백함수의 매개변수들을 넘겨주면 된다.

new_event.on('event3', (param1: number, param2: number) => {
  console.log(`${param1} + ${param2} = ${param1 + param2}`)
})

new_event.emit('event3', 10, 20)

//10 + 20 = 30

once()

new_event.once('event_once', () => {
  console.log('only call once')
})

new_event.emit('event_once')
new_event.emit('event_once')

//only call once

once() 메소드로 이벤트와 해당 콜백을 정의한 후 여러번 emit() 메소드를 호출하더라도 한번만 호출되는것을 볼 수 있다.

removeAllListeners() & listenerCount()

console.log(`Before remove : ${new_event.listenerCount('event1')}`)
new_event.removeAllListeners()
console.log(`After remove : ${new_event.listenerCount('event1')}`)
new_event.emit('event1');
new_event.emit('event2');
new_event.emit('event3', 10, 20);
new_event.listenerCount('event1')

우선 removeAllListeners()를 호출하기 전 후에 event1에 연결된 이벤트들의 개수를 출력하는 코드를 작성한다.

removeAllListeners()메소드를 호출하여 EventEmitter객체에 연결된 모든 이벤트들을 해제한다. 그 후 위에서 정의한 이벤트들을 emit()메소드를 통해 이벤트를 발생시켜도 아무런 반응을 하지 않는것을 볼 수 있다.

하나의 이벤트에 여러개 콜백 등록하기

listenerCount()메소드를 보면 특정 이벤트에 대해 등록된 콜백의 개수를 확인할 수 있는것을 볼 수 있다.이 말은 즉, 하나의 이벤트에는 여러개의 콜백을 등록할 수 있다는 소리이며, 해당 이벤트 이름으로 이벤트를 발생시키면, 해당 이벤트에 등록된 콜백이 모두 실행되게 된다. 매개변수가 있는 콜백이 있다면 다른 매개변수가 없는 콜백 상관 없이 넘겨줄 수 있다.

new_event.on('event4', () => {
  console.log("event4's event1")
})

new_event.on('event4', (a, b) => {
  console.log("event4's event2")
  console.log("a, b : ", a, b)
})

new_event.on('event4', () => {
  console.log("event4's event3")
})

new_event.emit('event4', 10, 20)

console.log("Event4's event count : ", new_event.listenerCount('event4')) 

/*
event4's event1
event4's event2
a, b :  10 20
event4's event3
Event4's event count :  3
*/
profile
더 나은 내일을 위해 오늘의 중괄호를 엽니다

0개의 댓글