저번 포스팅에서 메시지 큐에 대해 알아보면서 메시지 큐가 어떤 경우에 쓰이는지 알아보던 중 메일을 보내는 로직에서 사용된다는 것을 알 수 있었다. 예전에 Hi Planner 프로젝트에서 회원 가입 시 입력한 이메일로 인증번호를 받아 본인 인증을 하는 로직을 구현했는데 복기한다는 생각과 동시에 포스팅을 해서 남겨놔야겠다는 마음이 들어서 이번 포스팅을 쓰게 되었다.
의존성 추가
Gradle
implementation 'org.springframework.boot:spring-boot-starter-mail'
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
가장 먼저 의존성을 추가해주도록 하자. 필자는 Gradle을 선호하는 편이기 때문에 Gradle을 사용하여 기능을 구현할 것이다. Gradle과 Maven 두 빌드 도구에 있는 의존성을 위에 첨부하였으니 사용하는 빌드 도구에 맞게 사용하면 될 것이다.
Google SMTP
좀 더 쉽게 구현하기 위해 Google SMTP를 사용할 것이다. 그래서 application.properties를 아래와 같이 설정해줄 것이다.
( Spring Boot에서 사용하면 JavaMailSender Bean을 생성할 필요없이 자동으로 생성된다고 한다. 그래서 properties에 설정만 해주면 된다고 한다. 블로그 주소 참조. )
spring.mail.host=smtp.gmail.com
spring.mail.port=465
spring.mail.username=[본인이 사용할 이메일]
spring.mail.password=[생성된 비밀번호]
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.starttls.enable=true
여기서 Google SMTP를 사용하기로 했으니 그에 맞게 smtp.gmail.com을 입력해준다.
Google SMTP는 465 또는 587 포트 번호를 사용할 수 있다고 한다. (필자는 587를 포트 번호로 입력했다.)
다음으로 본인의 Google 이메일을 입력해주면 된다.
그리고 다음 과정이 비밀번호를 입력하는 것인데 로그인할 때 사용하는 그 비밀번호를 입력하는 게 아니다.
아래의 과정을 따라하면 쉽게 비밀번호를 생성할 수 있을 것이다.
비밀번호 생성 과정
구글 계정에 로그인을 하고 google 계정 관리에 들어간다. 그러면 페이지가 이동되면서 사이드 바에 아래와 같이 나타날 것이다.
그럼 형광펜으로 칠해진 '보안'으로 이동하면 중간에 Google에 로그인이라는 칸이 있고 거기에 보면 '앱 비밀번호'를 클릭하면 된다.
다음 페이지로 이동하게 되는데 본인 인증을 위해 비밀번호를 입력해달라고 하니 정확하게 비밀번호를 입력해주자!
1) '앱 선택' → 메일
2) '기기 선택' → 본인이 사용할 기기를 선택 (필자는 Windows 컴퓨터를 선택)
3) ' 생성'을 누르면 앱 비밀번호 생성 중이라는 문구가 잠깐 뜬 뒤 생성된 비밀번호가 나타남.
4) 그 비밀번호를 복사해서 spirng.mail.password에 넣어주면 된다.
.gitignore
혹시 깃허브같은 원격 저장소에 코드를 Push할 일이 있다면 주의를 해야할 것이 있다. application.properties에는 Google 계정에 대한 정보가 들어있기 때문에 다른 사람에게 보여지는 게 좋은 일은 없다. 그래서 아래처럼 추가해주자.
src/main/resources/application.properties
Mail.html
간단하게 html로 View를 하나 만들었다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>메일 보내기</title>
</head>
<body>
<form method="post" action="/mail">
<input type="text" name="receiver" placeholder="받는 사람 입력"><br>
<input type="text" name="title" placeholder="제목"><br>
<textarea name= "content" cols="10" rows="10"></textarea><br>
<input type="submit" value="전송">
</form>
</body>
</html>
대단한 view를 만든 게 아니기 때문에 설명은 넘어가도록 하겠다. 그리고 입력받은 값을 저장할 VO 클래스를 만들었다.
MailVo.java
import lombok.Data;
@Data
public class MailVo {
private String receiver;
private String title;
private String content;
}
MailController.java
@Controller
@RequiredArgsConstructor
public class MailController {
private final MailService mailService;
@GetMapping("/")
public String MailPage(){
return "Mail";
}
@PostMapping("/mail")
public void MailSend(MailVo mailVo){
mailService.CreateMail(mailVo);
}
}
MailService.java
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender javaMailSender;
private static final String senderEmail= "gohwangbong@gmail.com";
public void CreateMail(MailVo mailVo){
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(mailVo.getReceiver());
message.setFrom(senderEmail);
message.setSubject(mailVo.getTitle());
message.setText(mailVo.getContent());
javaMailSender.send(message);
}
}
View를 통해서 Controller로 들어온 값을 가지고 Service 로직을 수행하면서 받는 사람에게 원하는 내용을 보낼 수 있게 되었다.
하지만 우리가 원하는 건 회원가입을 할 때처럼 인증번호가 오는 로직을 구현하려고 했기 때문에 좀 더 추가를 해서 원하는 기능을 완성하려고 한다.
View
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>이메일 인증 구현하기</title>
</head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
function sendNumber(){
$("#mail_number").css("display","block");
$.ajax({
url:"/mail",
type:"post",
dataType:"json",
data:{"mail" : $("#mail").val()},
success: function(data){
alert("인증번호 발송");
$("#Confirm").attr("value",data);
}
});
}
function confirmNumber(){
var number1 = $("#number").val();
var number2 = $("#Confirm").val();
if(number1 == number2){
alert("인증되었습니다.");
}else{
alert("번호가 다릅니다.");
}
}
</script>
<body>
<div id="mail_input" name="mail_input">
<input type="text" name="mail" id="mail" placeholder="이메일 입력">
<button type="button" id="sendBtn" name="sendBtn" onclick="sendNumber()">인증번호</button>
</div>
<br>
<div id="mail_number" name="mail_number" style="display: none">
<input type="text" name="number" id="number" placeholder="인증번호 입력">
<button type="button" name="confirmBtn" id="confirmBtn" onclick="confirmNumber()">이메일 인증</button>
</div>
<br>
<input type="text" id="Confirm" name="Confirm" style="display: none" value="">
</body>
</html>
MailController.java
package com.example.etc.Controller;
import com.example.etc.Service.MailService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequiredArgsConstructor
public class MailController {
private final MailService mailService;
@GetMapping("/")
public String MailPage(){
return "Main";
}
@ResponseBody
@PostMapping("/mail")
public String MailSend(String mail){
int number = mailService.sendMail(mail);
String num = "" + number;
return num;
}
}
MailService.java
package com.example.etc.Service;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender javaMailSender;
private static final String senderEmail= "gohwangbong@gmail.com";
private static int number;
public static void createNumber(){
number = (int)(Math.random() * (90000)) + 100000;// (int) Math.random() * (최댓값-최소값+1) + 최소값
}
public MimeMessage CreateMail(String mail){
createNumber();
MimeMessage message = javaMailSender.createMimeMessage();
try {
message.setFrom(senderEmail);
message.setRecipients(MimeMessage.RecipientType.TO, mail);
message.setSubject("이메일 인증");
String body = "";
body += "<h3>" + "요청하신 인증 번호입니다." + "</h3>";
body += "<h1>" + number + "</h1>";
body += "<h3>" + "감사합니다." + "</h3>";
message.setText(body,"UTF-8", "html");
} catch (MessagingException e) {
e.printStackTrace();
}
return message;
}
public int sendMail(String mail){
MimeMessage message = CreateMail(mail);
javaMailSender.send(message);
return number;
}
}
회원가입하는 것처럼 다양한 정보를 입력해야하는 복잡한 View 대신에 이메일만 입력할 수 있는 View를 만들었다.
이메일을 입력하고 인증번호 버튼을 클릭하면 인증번호를 입력하는 칸이 나타나도록 했다.
그리고 입력한 이메일을 들어가보면 아래와 같이 메일이 온 것을 확인할 수 있다.
기능을 구현해보려고 했기 때문에 예쁘게 꾸미는 것같은 쓸데없는 코드는 생략하고 필자가 필요한 코드만 넣어서 구현해보았다.
이 포스팅에 모든 코드를 올려놓았지만 그 외에 다른 코드가 필요한 분을 위해 아래에 깃허브 링크를 같이 올려놓겠다.
REFERENCE
'기타' 카테고리의 다른 글
[Linux] 리눅스 명령어와 친구가 되어보자! ( 관리 명령어편 ) (1) | 2022.11.01 |
---|---|
메시지 큐(Message Queue)에 대해 알아보자! (1) | 2022.09.14 |
동기와 비동기의 차이(+ 블로킹과 논블로킹) (0) | 2022.07.22 |