개요
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를 통해 대기열을 생성하고 해당 대기열에서 작업의 논리를 처리한 후
고객 응대에 사용했습니다
또 다른 용도는 상태 변경이 발생할 때 상태 변경에 응답해야 하는 여러 참가자가 있는 경우입니다.
즉, 단일 상황에 대해 여러 작업을 수행하는 데 사용됩니다.
어쨌든 사용하고 싶은데 적당한 용도가 생각이 안나네요.
그래도 총을 얻은 기분이니 다시 사용할 수 있는 날을 기다려야겠죠.