3월9일 –

개요

Node.js 이벤트 이미터는 특정 이벤트에 리스너 함수를 연결합니다.

이벤트가 발생할 때 가로채도록 설계된 API입니다.

오늘은 Nest.js에서 Event Emitter를 사용하는 방법을 배웁니다.

기본적으로 공식 웹 사이트의 지침을 따랐습니다.

https://docs.nestjs.com/techniques/events

설명서 | NestJS – 진보적인 Node.js 프레임워크

Nest는 효율적이고 확장 가능한 서버 측 Node.js 애플리케이션을 구축하기 위한 프레임워크입니다.

프로그레시브 JavaScript를 사용하고 TypeScript로 구축되었으며 OOP(Object Oriented Programming), FP(Functional Programming) 및 FRP(Functional Reac)의 요소를 결합합니다.

docs.nestjs.com

설치

npm i @nestjs/event-emitter

사용하는 방법

공식 웹사이트에 같은 사용법을 쓰는 것은 의미가 없습니다.

제가 사용한 방법을 기록해두면 좋을 것 같습니다.

import { EventEmitter2 } from '@nestjs/event-emitter';

@Injectable()
export class Service {
  constructor(
    private eventEmitter: EventEmitter2
  ) {}

특이점은 EventEmitter2를 사용한다는 것입니다.

저스트와 2의 차이점이 뭔지는 모르겠지만 그렇게 사용하는 방법에 대한 가이드가 있으니 들어보자.

서비스

  private waitFinish(eventName: string, sec: number) {
    return new Promise((resolve, reject) => {
      const wait = setTimeout(() => {
        this.eventEmitter.removeAllListeners(eventName);
        resolve({ 
          message: '다시 시도해주세요.',
        });
      }, sec * 1000);
      const listenFn = ({ success, exception }: { success: boolean, exception?: HttpException }) => {
        clearTimeout(wait)
        this.eventEmitter.removeAllListeners(eventName);
        success ? 
          resolve({ message: '참여 성공' }) : 
          reject(exception);
      };
      this.eventEmitter.addListener(eventName, listenFn);
    });
  }

  async addJoin(meetupId: number, userId: number, eventName: string) {
    try {
      const join = await this.getJoin(meetupId, userId);
      if (!
_.isNil(join)) { throw new ConflictException(`이미 참여하고 있는 유저입니다.

`); } const meetup = await this.getMeetup(meetupId); if (meetup.headcount <= meetup.joins.length) { throw new ForbiddenException('정원이 다 찼습니다.

'); } await this.joinRepository.insert({ meetupId, userId }); return this.eventEmitter.emit(eventName, { success: true }); } catch (err) { return this.eventEmitter.emit(eventName, { success: false, exception: err }); } }

waitFinish() 함수가 실행되면 wait와 함께 2초를 기다립니다.

addJoin() 함수는 공유 불 큐에 의해 실행되고 eventEmitter.emit이 실행됩니다.

이것은 eventEmitter.addListener() 에서 waitFinish() 에 의해 포착되고 설정된 함수를 실행하는 코드입니다.

Bull Queue를 통해 대기열을 생성하고 해당 대기열에서 작업의 논리를 처리한 후

고객 응대에 사용했습니다

또 다른 용도는 상태 변경이 발생할 때 상태 변경에 응답해야 하는 여러 참가자가 있는 경우입니다.

즉, 단일 상황에 대해 여러 작업을 수행하는 데 사용됩니다.

어쨌든 사용하고 싶은데 적당한 용도가 생각이 안나네요.

그래도 총을 얻은 기분이니 다시 사용할 수 있는 날을 기다려야겠죠.