데옹의 블로그

[SpringBoot] Google Email 인증 코드 mail 보내기 (JDBC) 본문

SpringBoot

[SpringBoot] Google Email 인증 코드 mail 보내기 (JDBC)

성띠용 2023. 1. 21. 21:28
이 글은 제가 처음 SpringBoot를 시작하고 JDBC를 활용할 때, 정보가 너무 없어서 도움이 되고자 작성한 글입니다.
지금은 이 프로젝트를 하고 있지 않으며, BaseResponse는 프로젝트에서 데이터를 반환할 때 편리하게 하고자 팀원들과 쓰던 것입니다.

복붙만 해도 된다는 말을 써두었지만 본인의 프로젝트에 맞춰 응답 형식만 잘 맞추신다면 바로 가능할 것이라 생각되긴 하는데... 다른 프로젝트에선 JDBC를 쓰지 않아서 테스트를 해보지 못해 오류가 있을 수도 있다는 생각이 듭니다. (해당 글을 올릴 때에는 정말 도움이 되고자 많이 보고 테스트하고 올렸습니다.)

그러니 오류가 생기면 꼭 댓글에 남겨주세요. 제가 빠르게 수정하고 올려보도록 하겠습니다. 감사합니다.
(2024.01.12)

Spring Boot를 시작했습니다. 기초가 중요하다는 것을 점점 알아가고 있습니다.

 

현재 프로젝트에서는 멤버 서비스를 담당하여 구현하고 있는데, 이 부분에 대해서 친절하게 풀어나가 보겠습니다.

물론 잘하는 분들께는 너무나 쉬운 부분이겠지만, 저는 이 기능을 구현하려고 좀 애를 먹었습니다.. 에러의 늪에 빠졌어요.

 

그래서 초심자를 위한 따라하기만 해도 되는 친절하고 쉬운 설명을 남겨두려고 합니다.

 

많은 블로그를 돌아다니면서 어떤 코드를 사용해야 나같은 초심자가 사용할 수 있을까 했습니다. 완벽한 것을 원했다면 정말 죄송하지만 더 좋은 블로그들이 있으니 찾아보시면 될 것 같습니다.

 

그 구글링에 도움이 되고자 제가 참고한 블로그를 첨부합니다.

(거의 따라하고 여기에 붙여넣기 편하게 편집한 것 뿐입니다.)


1. Google SMTP 설정

메일은 Google SMTP 서버를 사용하여 전송할 수 있습니다. 이 것을 위해 사전에 계정 설정을 변경하여야 합니다!


1.1 구글 2단계 인증 설정

 

크롬에서 환경 설정에 들어간 다음에 "Google 계정 관리" 에 들어갑니다!

 

 

다음은 왼쪽의 보안 탭을 클릭하고 2단계 인증을 활성화 해주세요.

 


2.2 앱 비밀번호 생성

위의 형광색으로 칠해진 곳을 누르면 앱 비밀번호를 설정할 수 있습니다. 입장하시면

 

 

이렇게 해주시면 됩니다. 그럼 하나의 창이 새로 뜨게 되는데요.

 

 

저기 검정색으로 칠한 부분이 앱 비밀번호 입니다. 16자리로 되어있고, 이 것을 저장해주시면 됩니다.

 

꼭 이 앱 비밀번호를 갖고 계셔야 합니다!!!!


2. 의존성 및 yml 파일 설정


2.1 build.gradle 의존성 추가

아래의 코드를 dependencies 의 아무데나 복붙해줍니다.

dependencies {
	implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.2'
}

2.2 application.yml

spring:

	// 여기는 뭔가 더 많이 들어있겠죠..
    
  mail:
    host: smtp.gmail.com
    port: 587
    username: testtest12@gmail.com # 앱 비밀번호 발급받은 google 계정
    password: abcdefghijklnmop # 발급받은 앱 비밀번호 (16자리 입니다.) -> 복붙
    properties:
      mail:
        smtp:
          starttls:
            enable: true
          auth: true

그대로 넣어보세요! (username과 password는 바꿔주셔야 합니다.)


3. EmailService.java 클래스 생성 및 구현

우선 저는 원래 작업하던 멤버 서비스(User) 폴더에 생성하였습니다. 프로젝트에 맞춰 각자 알아서 넣어주시면 됩니다.

전체 코드는 아래에 첨부하겠습니다.


3.1 createCode

인증 코드를 생성합니다.

    // 인증번호 8자리 무작위 생성
    public void createCode() {
        Random random = new Random();
        StringBuffer key = new StringBuffer();

        for(int i=0; i<8; i++) {
        	// 0~2 사이의 값을 랜덤하게 받아와 idx에 집어넣습니다.
            int idx = random.nextInt(3);

			// 랜덤하게 idx를 받았으면, 그 값을 switchcase를 통해 또 꼬아버립니다.
			// 숫자와 ASCII 코드를 이용합니다.
            switch (idx) {
                case 0 :
                	// a(97) ~ z(122)
                    key.append((char) ((int)random.nextInt(26) + 97));
                    break;
                case 1:
                	// A(65) ~ Z(90)
                    key.append((char) ((int)random.nextInt(26) + 65));
                    break;
                case 2:
                	// 0 ~ 9
                    key.append(random.nextInt(9));
                    break;
            }
        }
        authNum = key.toString();
    }

3.2 createEmailForm

이 곳에선 메일의 전체적인 설정을 해줍니다.

메일 내용, 보내는 사람, 받는 사람, 제목을 설정하여 반환해줍니다.

// 메일 양식 작성
public MimeMessage createEmailForm(String email) throws MessagingException, UnsupportedEncodingException {
        // 코드를 생성합니다.
        createCode();
        String setFrom = "testtest12@gmail.com";	// 보내는 사람
        String toEmail = email;		// 받는 사람(값 받아옵니다.)
        String title = "성띠용의 인증번호 테스트";		// 메일 제목		

        MimeMessage message = emailSender.createMimeMessage();
        
        message.addRecipients(MimeMessage.RecipientType.TO, toEmail);	// 받는 사람 설정
        message.setSubject(title);		// 제목 설정

        // 메일 내용 설정
        String msgOfEmail="";
        msgOfEmail += "<div style='margin:20px;'>";
        msgOfEmail += "<h1> 안녕하세요 test 입니다. </h1>";
        msgOfEmail += "<br>";
        msgOfEmail += "<p>아래 코드를 입력해주세요<p>";
        msgOfEmail += "<br>";
        msgOfEmail += "<p>감사합니다.<p>";
        msgOfEmail += "<br>";
        msgOfEmail += "<div align='center' style='border:1px solid black; font-family:verdana';>";
        msgOfEmail += "<h3 style='color:blue;'>회원가입 인증 코드입니다.</h3>";
        msgOfEmail += "<div style='font-size:130%'>";
        msgOfEmail += "CODE : <strong>";
        msgOfEmail += authNum + "</strong><div><br/> ";
        msgOfEmail += "</div>";

        message.setFrom(setFrom);		// 보내는 사람 설정
        // 위 String으로 받은 내용을 아래에 넣어 내용을 설정합니다.
        message.setText(msgOfEmail, "utf-8", "html");

        return message;
    }

3.3 sendEmail

실제 메일을 전송하는 코드입니다.

//실제 메일 전송
    public String sendEmail(String email) throws MessagingException, UnsupportedEncodingException {

        //메일전송에 필요한 정보 설정
        MimeMessage emailForm = createEmailForm(email);
        //실제 메일 전송
        emailSender.send(emailForm);

        return authNum; //인증 코드 반환
    }

거의 다 왔습니다.. .  .

전체 코드는 아래 더보기에 첨부할게요!

더보기
import lombok.RequiredArgsConstructor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Random;

@Service
@RequiredArgsConstructor
public class EmailService {
    private final JavaMailSender emailSender;
    private String authNum; // 인증 번호

    // 인증번호 8자리 무작위 생성
    public void createCode() {
        Random random = new Random();
        StringBuffer key = new StringBuffer();

        for(int i=0; i<8; i++) {
            int idx = random.nextInt(3);

            switch (idx) {
                case 0 :
                    key.append((char) ((int)random.nextInt(26) + 97));
                    break;
                case 1:
                    key.append((char) ((int)random.nextInt(26) + 65));
                    break;
                case 2:
                    key.append(random.nextInt(9));
                    break;
            }
        }
        authNum = key.toString();
    }

    // 메일 양식 작성
    public MimeMessage createEmailForm(String email) throws MessagingException, UnsupportedEncodingException {
        createCode();
        String setFrom = "testtest12@gmail.com";
        String toEmail = email;
        String title = "데옹 인증번호 테스트";

        MimeMessage message = emailSender.createMimeMessage();
        message.addRecipients(MimeMessage.RecipientType.TO, toEmail);
        message.setSubject(title);

        // 메일 내용
        String msgOfEmail="";
        msgOfEmail += "<div style='margin:20px;'>";
        msgOfEmail += "<h1> 안녕하세요 test 입니다. </h1>";
        msgOfEmail += "<br>";
        msgOfEmail += "<p>아래 코드를 입력해주세요<p>";
        msgOfEmail += "<br>";
        msgOfEmail += "<p>감사합니다.<p>";
        msgOfEmail += "<br>";
        msgOfEmail += "<div align='center' style='border:1px solid black; font-family:verdana';>";
        msgOfEmail += "<h3 style='color:blue;'>회원가입 인증 코드입니다.</h3>";
        msgOfEmail += "<div style='font-size:130%'>";
        msgOfEmail += "CODE : <strong>";
        msgOfEmail += authNum + "</strong><div><br/> ";
        msgOfEmail += "</div>";

        message.setFrom(setFrom);
        message.setText(msgOfEmail, "utf-8", "html");

        return message;
    }

    //실제 메일 전송
    public String sendEmail(String email) throws MessagingException, UnsupportedEncodingException {

        //메일전송에 필요한 정보 설정
        MimeMessage emailForm = createEmailForm(email);
        //실제 메일 전송
        emailSender.send(emailForm);

        return authNum; //인증 코드 반환
    }
}

4.  Controller에 구현하기

우선은 EmailCheckReq.java DTO 를 생성합니다. (직접 받아도 됩니다.)

// EmailCheckReq는 이렇게 생겼습니다.

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class EmailCheckReq {
    private String email;
}

이제 Controller에 추가해줍니다.

    @ResponseBody
    @PostMapping("/sign-up/emailCheck")		// 이 부분은 각자 바꿔주시면 됩니다.
    public BaseResponse<String> EmailCheck(@RequestBody EmailCheckReq emailCheckReq) throws MessagingException, UnsupportedEncodingException  {
        String authCode = emailService.sendEmail(emailCheckReq.getEmail());
        return new BaseResponse<>(authCode);	// Response body에 값을 반환해줄게요~
    }

따로 예외 처리를 해주면 좋지만 빠르게 만드느라 그건 이 글을 쓰고 따로 추가하겠습니다.

붙여넣기만 해도 되는 코드를 만드느라 따로 예외처리는 넣지 않았어요.

 

authcode는 sendEmail에서 모든 기능을 거쳐 나온 EmailService에서 authNum으로 저장된 값을 가져와 반환합니다.


5. POSTMAN을 이용한 테스트!

두근두근....

정확하게 온 것을 확인할 수 있습니다!

 


붙여넣기 해도 안된다면 말해주세요.. 전 될 것 같아서 썼습니다..! 죄송함다

 

[참고 블로그]

https://velog.io/@rnqhstlr2297/Spring%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9Dfeat.-%EB%84%A4%EC%9D%B4%EB%B2%84

 

Spring를 이용한 이메일 인증(feat. 네이버,구글)

프로젝트에서 일반 회원가입에서 회원의 인증을 위해서 이메일 인증 기능을 넣게 되었다. 기능을 구현하면서 진행했던 절차들을 정리해보도록 하겠다.google SMTP 서버, Naver SMTP 서버등 다양한 서

velog.io

https://limjunho.github.io/2022/08/08/EmailAuthentication.html

 

Springboot 이메일 인증 구현 - limjunho

Summry 본 문서에서는 인증번호를 생성해 이메일을 보내는 방법을 정리한다. 본 문서에서 다룬 방법은 Gmail을 기준으로 작성됨. send me email if you have any questions. 구글 계정 설정 2022년 5월 기준 보안

limjunho.github.io