이전 글을 작성하다가 다른 사이트에서는
메일이 전송될때 지연시간이 없어요.
그런데 제가 구현한 메일 전송에서는 지연시간이 발생해서
이 문제를 수정하려고 합니다.
지연시간을 없애는 방법은 비동기 처리하여
눈으로 보기에는 지연시간이 없다고 느끼게 됩니다.
메일 전송에 대한 기본적인 내용은
이전 글에서 미리 보고오시면 좋아요!
비동기 처리를 위해 3개 파일에서 부분적으로 수정했어요.
MailauthApplication.java
MailauthController.java
MailService.java
이렇게 위에 세가지 부분을 수정했어요.
먼저 MailService.java 를 수정했어요.
src/main/java/com/mailauth/MailService.java
package com.mailauth;
import java.util.concurrent.ThreadLocalRandom;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Repository;
@Repository
public class MailService {
@Autowired
private JavaMailSender javaMailSender;
@Async
public void sendMail( String strTo ) {
// 받는사람을 담을 변수 선언
String to = strTo;
try {
// 텍스트로 구성된 메일을 생성할때
SimpleMailMessage simpleMessage = new SimpleMailMessage();
// 인증키 6자리 랜덤으로 생성 후 초기화
String authKey = Integer.toString( ThreadLocalRandom.current().nextInt(100000, 1000000) );
// 받는사람 설정
simpleMessage.setTo( to );
// 제목
simpleMessage.setSubject("[메일 인증] ㅇㅇㅇㅇ에서 인증번호를 보냈습니다.");
// 메일 내용
simpleMessage.setText("인증번호는 " + authKey + " 입니다.\n정확하게 입력해주세요.");
System.out.println(javaMailSender);
// 메일 발송
javaMailSender.send(simpleMessage);
} catch (MailException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
수정된 부분은 public int였던것을 public void로 바꿔서
return 값을 제거해줬어요.
그리고 @Async를 추가해서 비동기 처리로 바꿨어요.
이제 MailauthController.java 를 수정할게요.
src/main/java/com/mailauth/MailauthController.java
package com.mailauth;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MailauthController {
@Autowired
MailService ms;
/* main */
@RequestMapping( {"/main.do", "/"} )
public ModelAndView main() {
System.out.println( "main() 호출" );
ModelAndView modelAndView = new ModelAndView( "index" );
return modelAndView;
}
/* mail_ok */
@RequestMapping( "/mail_ok.do" )
public ModelAndView mail_ok(HttpServletRequest req) {
System.out.println( "mail_ok() 호출" );
ms.sendMail( req.getParameter( "email" ) );
ModelAndView modelAndView = new ModelAndView( "mail_ok" );
return modelAndView;
}
}
컨트롤러에서는 mail_ok.do부분을 수정했어요.
return되는 값이 없으니
ms.sendMail( req.getParameter( "email" ) );로 수정
그리고 결과값을 mail_ok로 보내줬던 코드를 제거
이렇게 컨트롤러를 수정했어요.
그리고 마지막으로 Application을 수정할게요.
src/main/java/com/mailauth/MailauthApplication.java
package com.mailauth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@SpringBootApplication
public class MailauthApplication {
public static void main(String[] args) {
SpringApplication.run(MailauthApplication.class, args);
}
}
Application에서는 어노테이션만 추가했어요.
@EnableAsync를 추가해서 비동기 처리를 가능하게 해줬어요.
마지막으로 views에 있는 mail_ok.jsp를 수정할게요.
src/main/webapp/WEB-INF/views/mail_ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<script type="text/javascript">
alert('메일이 전송이 완료되었고\n메일이 오지않을경우 다시시도해주세요.');
location.href="/main.do";
</script>
위에 코드로 짧게 수정되었습니다.
결과값을 받는 로직이 아닌 스크립트로 바로 처리 후
비동기 처리로 메일을 전송하는 방식을 택했어요.
결과는 아래와 같습니다.
이번 결과는 메일을 미리 적어놓았고
메일 전송 버튼을 누르면 alert창을 띄웁니다.
위 메시지가 뜨고 다서 메일 입력창으로 돌아갑니다.
제가 생각하는 메일 전송은 전송만 할수 있지만
데이터베이스를 연동하고, 메일 전송과
메일 인증까지 진행할 예정입니다.
이 글을 작성하는데 참고했던 글은 아래와 같아요.
이 글에서 작성했던 코드는 github에서 확인가능
'Spring' 카테고리의 다른 글
Spring Boot 메일 전송 구현 (구글 메일) (0) | 2021.10.06 |
---|