728x90
반응형

1. Nodemailer 설치하기

먼저 Nodemailer를 설치합니다.

npm install nodemailer

 

 


Nodemailer의 주요 구성 요소

  • Transporter: 실제로 이메일을 전송하는 우체부의 역할입니다. 이를 설정하면 "어떤 우체국 서버(Gmail, Outlook, 또는 다른 SMTP 서버)를 사용할지" 정해줍니다.
  • Mail Options: 발송할 편지의 내용입니다. 이메일 발신자, 수신자, 제목, 본문 등의 정보를 포함합니다.
  • sendMail() 메서드: 우체부가 우체국에 가서 편지를 보내는 동작에 해당합니다. sendMail() 메서드에 Mail Options를 전달하면 이메일이 발송됩니다.

NestJS에서 Nodemailer 사용 예제

이제 NestJS에서 Nodemailer를 통해 이메일을 보내는 방법을 알아보겠습니다. 이 과정에서는 Nodemailer를 MailService라는 서비스로 구현해 보겠습니다.

MailService 코드

인증번호가 포함된 이메일을 발송하기 위한 MailService를 작성합니다.

import { Injectable } from '@nestjs/common';
import * as nodemailer from 'nodemailer';

@Injectable()
export class MailService {
  private transporter: nodemailer.Transporter;

  constructor() {
    this.transporter = nodemailer.createTransport({
      service: 'Gmail',
      auth: {
        user: 'your-email@gmail.com',
        pass: 'your-email-password',
      },
    });
  }

  async sendVerificationCode(email: string, code: string) {
    const mailOptions = {
      from: 'your-email@gmail.com',
      to: email,
      subject: 'Your Verification Code',
      text: `Your verification code is: ${code}`,
    };

    await this.transporter.sendMail(mailOptions);
  }
}

 

2. AuthService 코드

AuthService는 인증번호 생성, 저장, 검증을 담당합니다. 간단한 메모리 객체에 인증번호를 저장해 보겠습니다. (실제 프로젝트에서는 Redis 같은 캐시 DB를 추천합니다.)

 

import { Injectable, BadRequestException } from '@nestjs/common';
import { MailService } from './mail.service';

@Injectable()
export class AuthService {
  private verificationCodes = new Map<string, string>(); // 이메일-인증번호 매핑 저장

  constructor(private readonly mailService: MailService) {}

  // 인증번호 생성 및 이메일 발송
  async sendVerificationCode(email: string) {
    const code = Math.floor(100000 + Math.random() * 900000).toString(); // 6자리 랜덤 코드 생성
    this.verificationCodes.set(email, code);

    await this.mailService.sendVerificationCode(email, code);
    return { message: 'Verification code sent to your email' };
  }

  // 인증번호 검증
  verifyCode(email: string, code: string) {
    const savedCode = this.verificationCodes.get(email);
    if (savedCode !== code) {
      throw new BadRequestException('Invalid verification code');
    }

    this.verificationCodes.delete(email); // 검증 후 코드 삭제
    return { message: 'Email verified successfully' };
  }
}

3. UserController 코드

UserController에서 회원가입 요청을 처리하고, 인증번호 발송 및 검증 로직을 구현합니다.

import { Controller, Post, Body } from '@nestjs/common';
import { AuthService } from './auth.service';

@Controller('auth')
export class UserController {
  constructor(private readonly authService: AuthService) {}

  @Post('register')
  async register(@Body('email') email: string) {
    return this.authService.sendVerificationCode(email);
  }

  @Post('verify')
  async verifyEmail(
    @Body('email') email: string,
    @Body('code') code: string
  ) {
    return this.authService.verifyCode(email, code);
  }

  @Post('complete-signup')
  async completeSignup(
    @Body('email') email: string,
    @Body('code') code: string,
    @Body('password') password: string
  ) {
    const verification = this.authService.verifyCode(email, code);
    if (verification.message === 'Email verified successfully') {
      // 여기에서 실제 사용자 저장 로직 실행 (DB에 저장 등)
      return { message: 'User signed up successfully' };
    }
  }
}

 

사용 흐름

  • /auth/register: 회원가입 요청을 받고 이메일로 인증번호 발송.
  • /auth/verify: 사용자가 입력한 인증번호가 서버에 저장된 인증번호와 일치하는지 검증.
  • /auth/complete-signup: 인증번호가 일치하면 비밀번호 등 추가 정보를 받아 회원가입 완료.

 

728x90
반응형

+ Recent posts