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
반응형
728x90
반응형
@nestjs/typeorm NestJS에서 TypeOrm을 사용하기 위해 연동시켜주는 모듈
typeorm TypeORM 모듈
pg Postgres 모듈

 

설치방법(npm패키지매니저 기준)

터미널에 npm install pg typeorm @nestjs/tyeorm --save 입력

 

nest.js에서 TypeORM을 사용해서 데이터베이스를 컨트롤 하는 방법이 나와있는 다큐멘테이션 주소입니다
참조하세요
https://docs.nestjs.com/techniques/database

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com


 

728x90
반응형
728x90
반응형

 

728x90
반응형
728x90
반응형

쓸모있어보이는것만 추린

전체는https://www.typescriptlang.org/tsconfig 에서 구경가능

 

{
 "compilerOptions": {

  "target": "es5", // 'es3', 'es5', 'es2015', 'es2016', 'es2017','es2018', 'esnext' 가능
  "module": "commonjs", //무슨 import 문법 쓸건지 'commonjs', 'amd', 'es2015', 'esnext'
  "allowJs": true, // js 파일들 ts에서 import해서 쓸 수 있는지 
  "checkJs": true, // 일반 js 파일에서도 에러체크 여부 
  "jsx": "preserve", // tsx 파일을 jsx로 어떻게 컴파일할 것인지 'preserve', 'react-native', 'react'
  "declaration": true, //컴파일시 .d.ts 파일도 자동으로 함께생성 (현재쓰는 모든 타입이 정의된 파일)
  "outFile": "./", //모든 ts파일을 js파일 하나로 컴파일해줌 (module이 none, amd, system일 때만 가능)
  "outDir": "./", //js파일 아웃풋 경로바꾸기
  "rootDir": "./", //루트경로 바꾸기 (js 파일 아웃풋 경로에 영향줌)
  "removeComments": true, //컴파일시 주석제거 

  "strict": true, //strict 관련, noimplicit 어쩌구 관련 모드 전부 켜기
  "noImplicitAny": true, //any타입 금지 여부
  "strictNullChecks": true, //null, undefined 타입에 이상한 짓 할시 에러내기 
  "strictFunctionTypes": true, //함수파라미터 타입체크 강하게 
  "strictPropertyInitialization": true, //class constructor 작성시 타입체크 강하게
  "noImplicitThis": true, //this 키워드가 any 타입일 경우 에러내기
  "alwaysStrict": true, //자바스크립트 "use strict" 모드 켜기

  "noUnusedLocals": true, //쓰지않는 지역변수 있으면 에러내기
  "noUnusedParameters": true, //쓰지않는 파라미터 있으면 에러내기
  "noImplicitReturns": true, //함수에서 return 빼먹으면 에러내기 
  "noFallthroughCasesInSwitch": true, //switch문 이상하면 에러내기 
 }
}
728x90
반응형

+ Recent posts