개발 이야기/Node

이벤트 구독 패턴 EventEmitter - 4

석구석구 2022. 1. 10. 22:29

콜백 패턴

 

자바스크립트를 사용하다보면 콜백 패턴을 이용하게 된다.

async/await 구문의 등장으로 과거보다 콜백 사용이 많이 줄었지만 여전히 콜백은 즐겨 사용되고 있다.

우리가 콜백을 사용할 때의 상황을 단순화 하면 다음과 같다.

특정 시점에, 콜백이 실행되기를 기대한다.

이것이 콜백의 핵심이자 전부다.

 

이벤트 구독 패턴

 

이벤트 구독 패턴은 콜백 패턴과는 다른 방식으로 콜백과 같은 핵심에 접근한다.

1. 특정 시점에 실행 되길 바라는 함수들은 이벤트를 구독한다.

2. 특정 시점이 되면 이벤트를 발생시킨다.

이렇게 두가지 레이어가 이벤트 구독 패턴에서는 명확하게 구분된다.

 

Node에서는 기본적으로 이벤트 구독 패턴을 쉽게 사용할 수 있도록 EventEmitter 클래스를 제공한다.

let em = new events.EventEmitter()

em.on('fire', function(){console.log('소방관 출동')})
em.on('fire', function(){console.log('응급차 출동')})
em.on('fire', function(){console.log('주민 대피 발동')})

em.emit('fire')

언제나 우리를 지켜주시는 소방관 분들의 시나리오로 학습해 보자.

불이나면 소방관이 출동하고, 응급차도 출동해야 하며, 주민 대피 시나리오가 발동되어야 한다. 이런 것들은 미리 '화재' 이벤트를 구독하고 있어야 하고, 언젠가 '화재'가 나면 실행된다.

let em = new events.EventEmitter()

em.on('fire', function(){throw 'error'})
em.on('fire', function(){console.log('소방관 출동')})
em.on('fire', function(){console.log('응급차 출동')})
em.on('fire', function(){console.log('주민 대피 발동')})

em.emit('fire')

 이벤트를 구독한 순서대로 실행되므로, 앞선의 이벤트에서 에러가 발생하면 이후의 이벤트는 실행되지 않을 수 있다.

let em = new events.EventEmitter()

em.once('snow', function(){console.log('첫눈이 옵니다.')})
em.on('snow', function(){console.log('눈이 옵니다.')})

em.emit('snow') // ??
em.emit('snow') // ??

em.removeAllListeners('snow')
em.emit('snow') // ??

단 한번만 실행되도록 once 메서드를 이용할 수 있으며, 모든 이벤트 리스너를 삭제할 수도 있다.

 

이벤트 이미터 패턴을 잘 활용하면, 특정 시점의 발생과 콜백을 분리 할 수 있으며, 이로 인해 중간 과정을 스킵할 수 있다.

'개발 이야기 > Node' 카테고리의 다른 글

버퍼 Buffer - 3  (0) 2022.01.10
모듈 Module - 2  (0) 2022.01.10
노드 NodeJS - 1  (0) 2022.01.09
NodeJS + Typescript + Mongoose  (0) 2020.02.25