※ 본 내용에 앞서, Member(User) 엔티티를 위와 같이 설계하였음을 알립니다.
"시작하기에 앞서"이번 소셜 jwt 로그인에 이어 또 다른 프로젝트에서 일반 회원가입에서 회원의 인증을 위해 이메일 인증 기능을 넣게 되었다.
이메일 인증 코드는 google SMTP서버, Naver SMTP서버 등 다양한 서버를 사용해서 인증코드 메일을 전송할 수 있다.
이번에는 Naver STMP서버를 통한 메일 인증을 구현하였다.
[1. SMTP용 계정 설정]spring에서 mail 라이브러리를 통해 메일 인증 코드를 전송할 때 사용할 Naver SMTP서버를 활성화 시켜주어야한다.네이버 메일 서버를 외부에서 사용하기 위해서는 pop3/SMTP 설정을 필수로 활성화 시켜주어야한다.네이버 메일을 들어가보면 왼쪽 하단에 "환경설정"을 눌러준다.
환경 설정 내부 카테고리에서 "POP3/IMAP 설정" ---> "POP3/SMTP 설정"에 들어온다.
위와 같이 설정해준다.
그리고!! 추후 spring에서 해당 SMTP서버와 연결을 하기 위해서 아래로 스크롤하면 보이는
이 정보들을 application.properties나 application.yml에서 서버와 연결시켜 줄 예정임을 기억하자.
[2. Spring에서 의존성 및 properties파일 설정]spring와 Naver SMTP서버와 연결을 .properties 에서 설정하고연결한 서버로 메일을 만들어 보낼 수 있는 기능을 사용하기 위해 의존성을 추가해주어야한다.[2-1 build.gradle]
spring에서 메일 서버와 연결해서 메일을 보내는 작업을 하는데 필요한 lib
[2-2 application.properties]
※ .yml 형식을 사용하고 있다면, https://mageddo.com/tools/yaml-converter 에서 쉽게 변환할 수 있다.
username에는 네이버 아이디를 (example123@naver.com) password에는 네이버 비밀번호를 넣어준다.
위 내용은 처음 언급했던 Naver SMTP 계정 설정에서 나왔던 값들로 설정하면 된다.
[3. MailService 구현 tymeleaf 이용]
MemberService Interface를 먼저 살펴 보자.
createCode : Random 함수를 통해 난수로 된 이메일 인증 코드를 만드는 메소드
createEmailForm : 전송할 Email 형식 세팅(가령, 받는 사람/ 보내는 사람/ 메일 내부 내용 등)
sendEmail : createCode를 통해 인증코드를 만들고 createEmailForm을 통해 최종 메일 내용을 세팅하고 나서 toEmail 주소로 만든 이메일을 전송하는 메소드
verifyEmailCode : Redis를 사용. key-value를 email_addr - auth_code로 하여 이메일을 전송할 때, redis에 저장했던 인증코드와 요청값에 넘어온 인증번호를 비교하여 검증하는 메소드
[3-1 EmailServiceImpl (EmailService구현체)]
※이전에 추가적인 의존성 추가가 필요하다.
//thymeleafimplementation 'org.springframework.boot:spring-boot-starter-thymeleaf'//SpringTemplateEngine 객체 사용을 위한 의존성 추가implementation 'org.thymeleaf:thymeleaf-spring5'//redisimplementation 'org.springframework.boot:spring-boot-starter-data-redis'import BE.MyRoute.util.RedisUtil;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.stereotype.Service;import org.thymeleaf.context.Context;import org.thymeleaf.spring5.SpringTemplateEngine;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import java.io.UnsupportedEncodingException;import java.util.Random;@Service@RequiredArgsConstructor@Slf4jpublic class EmailServiceImpl implements EmailService{//의존성 주입을 통해서 필요한 객체를 가져온다.private final JavaMailSender emailSender;// 타임리프를사용하기 위한 객체를 의존성 주입으로 가져온다private final SpringTemplateEngine templateEngine;private String authNum; //랜덤 인증 코드private final RedisUtil redisUtil;@Value("${spring.mail.username}")private String fromEmail;//랜덤 인증 코드 생성public void createCode() {Random random = new Random();StringBuffer key = new StringBuffer();for(int i=0;i