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
반응형
'TypeScript' 카테고리의 다른 글
PostgresDB/TypeORM을 사용하기 위해서 설치해야하는 모듈들 (1) | 2024.10.28 |
---|---|
Nest.js의 기본 구조 정리 (0) | 2024.10.23 |
TypeScript 컴파일 세부설정(tsconfig.json) 추가 할만한 것들 (0) | 2024.10.18 |