@nestjs/bull을 사용하여 쉽게 통합할 수 있다. 1) Bull Queue 관련 패키지 설치
npm install @nestjs/bull bull
@nestjs/bull: NestJS에서 Bull Queue를 쉽게 사용할 수 있도록 해주는 모듈 bull: Bull Queue의 핵심 라이브러리 2) Redis 설치 및 실행
redis-serverdocker run --name redis -p 6379:6379 -d redis3) Bull Queue 등록 (AuthModule 및 UsersModule 수정)
auth.module.ts 수정 import { BullModule } from '@nestjs/bull';
@Module({
imports: [
BullModule.registerQueue({
name: 'email-queue',
redis: {
host: 'localhost',
port: 6379,
},
}),
],
})
users.module.ts 수정 import { BullModule } from '@nestjs/bull';
@Module({
imports: [
BullModule.registerQueue({
name: 'email-queue',
}),
],
exports: [BullModule],
})
4) AuthService에서 이메일 전송을 Bull Queue로 변경
sendVerificationEmail에서 직접 이메일을 전송하는 것이 아니라, Bull Queue에 추가하는 방식으로 변경 import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';
@Injectable()
export class AuthService {
constructor(@InjectQueue('email-queue') private emailQueue: Queue) {}
async sendVerificationEmail(email: string, verifyCode: string) {
await this.emailQueue.add('sendEmail', {
email,
verifyCode,
});
}
}
5) 이메일을 처리하는 Processor 추가 (email.processor.ts)
import { Process, Processor } from '@nestjs/bull';
import { Job } from 'bull';
import nodemailer from 'nodemailer';
@Processor('email-queue')
export class EmailProcessor {
@Process('sendEmail')
async handleSendEmail(job: Job) {
const { email, verifyCode } = job.data;
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS,
},
});
const mailOptions = {
from: process.env.EMAIL_USER,
to: email,
subject: '이메일 인증 코드',
text: `인증 코드: ${verifyCode}`,
};
try {
await transporter.sendMail(mailOptions);
} catch (error) {
console.error('이메일 발송 실패:', error);
}
}
}
sendEmail이라는 작업이 큐에 추가되면, email.processor.ts에서 이를 감지하고 실제로 이메일을 전송한다. npm run start로 서버를 실행한다. 이번 작업을 통해 Bull Queue를 활용한 비동기 이메일 전송 시스템을 적용하였고, 이를 통해 서버의 응답 속도를 개선하고 부하를 줄일 수 있었다.