2장 (3/3): Node.js의 Observer Pattern

이 글은 Node.js에서 자주 사용되는 Observer Pattern에 대해 소개한다. 리액터 패턴, CPS 패턴에 대한 지식을 전제로 작성했으니 참고바란다.


1. Observer Pattern의 정의

Node.js에서 이벤트는 핵심 중 하나라고 한다.

Node.js 코어 모듈과 오픈 소스를 사용하는데도 필수적인 조건이라고 한다.

Observer Pattern은 Subject와 Listener 라는 역할로 한 쪽은 등록을, 한 쪽은 통지를 하는 관계이다.

  • Subject는 이벤트를 발생시키는 주체로, 스스로 무슨 행위를 할 때, Listener에게 통지를 해야 한다.

  • Listener는 특정 Subject 객체에 본인의 참조를 등록한다. subject.addListener(this)와 같이 수행한다.

  • foreach (listener : listeners) listener.notify(); 와 같이 Listener에게 이벤트 발생을 알린다.

  • 옵서버 패턴 | Wiki 백과 참고.

Observer Pattern이 Callback 보다 나은 점이 뭘까?

기능 Observer Pattern Continuous Passing Style
다중 리스너 지원 Yes No
핸들러 사용 횟수 여러 번(or 주기적으로) 발생하는 경우 한 번 발생하는 경우
핸들러 함수 제약 없음. onError, onSuccess 로 관심사 분리하므로. 한 함수 (err, data)=> { /* ... */ }로 두 상태 모두 처리
핸들러 등록 시점 아무 때나 함수 실행 시점에 매개변수로 전달

2. Event Emitter

Node.js는 Event Emitter라는 미리 구현된 객체를 코어 모듈(events)로 포함하고 있다. 이 객체는 emit, on, once, removeListener 로 구성된 총 4개의 메소드를 갖고 있다. 아래는 각 메소드의 사용 예시이다.

CodeSandBox가 Node.js를 Beta로 지원하고 있으므로 출력이 정상적이지 않을 수 있습니다. 왼쪽의 탭을 드래그해 코드를 확인해주세요.

아래는 File을 읽는 예제이다.

3. Event Emitter 에서의 예외 처리

Event Emitter에서도 비동기 이벤트의 경우, CPS와 마찬가지로 예외가 발생하는 경우 기존 스택을 잃기 때문에 (리액터 패턴 참고) try-catch로 무조건 예외를 처리하여야 한다. 이후 error 이벤트를 발생시켜 리스너들에게 전달함이 일반적이다.

4. Event Emitter 상속하기

아래와 같이 EventEmitter를 상속하여 인스턴스에 대해 .on을 붙이는 등의 작업을 할 수도 있다. 책에서는 일반적인 패턴이라고 하지만, emit 메소드까지 의도치 않게 Public API가 되기 때문에 추천하는 방식은 아니다. 위임으로 on, once, removeListener를 따로 API로 내보내는 게 맞다고 생각한다.

1
2
3
4
5
6
class FindPattern extends EventEmitter {
//...
}

const findPattern = new FindPattern(/hello \w+/g);
findPattern.on(/* ... */);

5. 동기, 비동기 이벤트 별 리스너 등록 시점

이벤트를 동기적으로 발생시키려면, 리스너 등록을 이벤트 발생 이전 시점에 완료하여야 한다.

이벤트를 비동기적으로 발생시키는 경우, 리스너를 동기적으로만 등록한다면 시점이 자유롭다. (리액터 패턴 참고.)

2장 (3/3): Node.js의 Observer Pattern

https://jsqna.com/ndp-2-event-emitter/

Author

Seongbin Kim

Posted on

21-01-08

Updated on

21-01-19

Licensed under

댓글