4주 프로젝트에서 GraphQL을 사용해서 인지 REST API 서버에 대한 개념이 모호해진 것 같아서
작은 사이즈의 프로젝트로 게시판 기능을 만들어 보려고 한다.
오늘 만든 기능은 이메일 인증 기능으로 개.고.수 프로젝트에서 사용했던 기능인데
그 땐 sendgrid
서비스를 이용했지만 이번엔 Gmail
서비스를 이용해보았다.
export const generateNumber = () => {
const randNum = Math.floor(Math.random() * 10000);
return randNum;
};
먼저 랜덤한 숫자를 만들어내는 함수를 만들어준다.
import nodeMailer from "nodemailer";
const { GMAIL, MAILPASS } = process.env;
const transport = {
service: "gmail",
auth: {
user: GMAIL,
pass: MAILPASS
}
};
export const sendMail = (email, randNum) => {
const mailtransport = nodeMailer.createTransport(transport);
const options = {
from: "jake@gmail.com",
to: email,
subject: "email Auth",
html: `signUp email number ${randNum}`
};
return new Promise((resolve, reject) => {
mailtransport.sendMail(options, (err, _) => {
if (err) {
reject(err);
} else {
resolve(true);
}
});
});
};
그 후에 nodemailer 모듈을 이용하여 transport와 options를 설정하여 입력 받은 이메일로
랜덤 숫자를 보내주는 함수를 만들어 준다.
//userController 파일
export const emailSend = async (req, res) => {
const { email } = req.body;
try {
const user = await User.findOne({ where: { email } });
if (user) {
res.status(400);
res.send(false);
}
};
body
로 들어온 email
을 User
테이블에서 찾은 뒤 데이터가 있다면
이미 가입한 이메일이기에 더 이상 회원가입을 못하게 막아준다.
else {
const randNum = generateNumber();
const result = await sendMail(email, randNum);
if (result) {
emailStorage[email] = randNum;
res.status(200);
res.send(true);
}
}
} catch (err) {
res.status(500);
res.send(err);
}
하지만 User
테이블에 이메일이 없다면 generateNumber()
함수와 sendMail()
함수를 이용하여 이메일을 보내준다.
그리고 emailStorage
라는 객체를 하나 만들고 그 곳에 email
과 randNum
을 저장해둔다.
개.고.수 프로젝트에는 db에 email을 저장하고 인증이 될 때마다 db에 있는 데이터를 삭제하고 이메일을 보내줄 때에는 저장하는 방식을 이용했는데 굳이 db를 이용하지 않아도 될 것 같았기에 방법을 조금 바꿔봤다.
export const emailAuth = (req, res) => {
const { email, number } = req.body;
if (emailStorage[email] === Number(number)) {
delete emailStorage[email];
res.status(200);
res.send(true);
} else {
res.status(400);
res.send(false);
}
};
emailStorage
객체에 저장되어있는 숫자와 비교해서 결과를 반환한다.