[NestJS] EventEmitter

문지은·2024년 6월 16일

NestJS

목록 보기
3/5
post-thumbnail

Event Emitter

  • NestJS의 Event Emitter (@nestjs/event-emitter)는 애플리케이션에서 발생하는 다양한 이벤트를 구독하고 들을 수 있는 간단한 옵저버 구현을 제공
  • 이벤트는 애플리케이션의 여러 측면을 분리하는 훌륭한 방법으로, 단일 이벤트에 여러 리스너가 존재할 수 있으며 서로 의존하지 않는다.
  • EventEmitterModule은 내부적으로 eventemitter2 패키지를 사용
  • 패키지 설치
$ npm i --save @nestjs/event-emitter
  • AppModule에 추가
import { Module } from '@nestjs/common';
import { EventEmitterModule } from '@nestjs/event-emitter';

@Module({
  imports: [
    EventEmitterModule.forRoot()
  ],
})
export class AppModule {}
EventEmitterModule.forRoot({
  // 와일드카드를 사용하려면 `true`로 설정
  wildcard: false,
  // 네임스페이스를 구분하는 데 사용되는 구분자
  delimiter: '.',
  // newListener 이벤트를 방출하려면 `true`로 설정
  newListener: false,
  // removeListener 이벤트를 방출하려면 `true`로 설정
  removeListener: false,
  // 이벤트에 할당할 수 있는 최대 리스너 수
  maxListeners: 10,
  // 최대 리스너 수를 초과할 때 메모리 누수 메시지에 이벤트 이름 표시
  verboseMemoryLeak: false,
  // 오류 이벤트가 방출되고 리스너가 없을 때 uncaughtException을 비활성화
  ignoreErrors: false,
});

이벤트 발송하기

  • EventEmitter2를 constructor에 주입
constructor(private eventEmitter: EventEmitter2) {}
  • 이벤트 발송
this.eventEmitter.emit(
  'order.created',
  new OrderCreatedEvent({
    orderId: 1,
    payload: {},
  }),
);

이벤트 구독하기

  • @OnEvent() 데코레이터를 메서드 정의 앞에 추가하여 이벤트 리스너 선언
import { OnEvent } from '@nestjs/event-emitter';
@OnEvent('order.created')
handleOrderCreatedEvent(payload: OrderCreatedEvent) {
  // "OrderCreatedEvent" 이벤트를 처리 및 처리
  console.log('order.created 이벤트 발생!')
}
  • EventEmitterModule.forRoot() 메서드에 와일드 카드 옵션을 전달하면, 네입스페이스/와일드 카드를 사용할 수 있다.
EventEmitterModule.forRoot({
  // 와일드카드를 사용하려면 `true`로 설정
  wildcard: true,
});
// order. 로 시작하는 이벤트를 수집
@OnEvent('order.*')
handleOrderEvents(payload: OrderCreatedEvent | OrderRemovedEvent | OrderUpdatedEvent) {
  // 이벤트를 처리 및 처리
}

// 모든 이벤트를 수집
@OnEvent('**')
handleEverything(payload: any) {
  // 이벤트를 처리 및 처리
}

References
Documentation | NestJS - A progressive Node.js framework

profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글