브라우저에서 JavaScript로 작업한 경우 마우스 클릭, 키보드 버튼 누르기, 마우스 움직임에 대한 반응 등 과 같은 이벤트를 통해 사용자 상호 작용이 얼마나 처리되는지 알 수 있습니다.

이러한 것 처럼 백엔드 측에서 Node.js도 event-driven 시스템을 이용해서 작동 됩니다.

Untitled

Observer Design Pattern

event-driven 시스템을 이용하는 것을 Observer Design Pattern 이라고도 부릅니다.

Untitled

이 패턴에는 특정 Subject를 관찰하는 많은 Observer가 있습니다. 관찰자는 기본적으로 Subject에 관심이 있고 해당 주제 내부에 변경 사항이 있을 때 알림을 받기를 원합니다. 그래서 그들은 그 주제에 스스로를 등록(Register)합니다. 주제에 대한 관심을 잃으면 단순히 해당 주제에서 등록을 취소합니다. 때때로 이 모델은 게시자-구독자(Publisher-Subscriber) 모델이라고도 합니다.

예를 들어, 트위터 팔로워가 많은 유명인을 생각할 수 있습니다. 이 팔로워들 각각은 자신이 좋아하는 유명인의 최신 업데이트를 모두 받고 싶어 합니다. 따라서 관심이 지속되는 한 유명인을 팔로우할 수 있습니다. 그가 흥미를 잃으면 그는 단순히 그 유명인을 따르는 것을 중단합니다. 여기서 우리는 추종자를 관찰자(Observer)로, 유명인을 주체(Subject)로 생각할 수 있습니다.

Event Emitter 클래스

Node.js도 Event 모듈을 사용하여 유사한 시스템을 구축할 수 있는 옵션을 제공합니다.

특히 이 모듈은 이벤트를 처리하는 데 사용할 EventEmitter 클래스를 제공합니다.

const EventEmitter = require("events");

const celebrity = new EventEmitter(); // 이 객체는 on 및 emit 메서드를 노출합니다.

// Observer1dl celebrity를 구독중
// update post event가 발생하면 console을 출력하게 listener를 등록함.
celebrity.on("update post", () => {
  console.log("This post is so awesome!"); // on은 event가 trigger될 때 실행될 콜백 함수를 추가하는데 사용
});

// Observer2가 celebrity를 구독중
celebrity.on("update post", () => {
  console.log("I like this post!");
});

// celebrity가 update post event를 발생(emit)시킴.
celebrity.emit("update post"); // emit은 event를 trigger하는데 사용됨.

// This post is so awesome!
// I like this post!

emit()에 추가 인수로 전달하여 이벤트 핸들러에 인수를 전달할 수 있습니다.

celebrity.on("update post", (type) => {
  console.log(`I like this ${type} post!`);
});

// celebrity가 update post 이벤트를 발생(emit) 시킴
celebrity.emit("update post", "image");

// I like this image post!

process module

Untitled