본문 바로가기

My Proect/파이널 프로젝트 - CineDate

17일차 - 이메일 인증 구현 수정

의존성에 추가한 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

때문에 메인에서 이메일 인증 코드화면에서 넘어가질 않은 거 같다.



 

 

[ 코드 수정 ]

application.yml
  mail:
    host: smtp.gmail.com #Google의 SMTP 서버 호스트
    port: 587 #SMTP 서버의 포트 번호
    username: 123@email.com #발신자 이메일
    password: 16자 메일주소 앱 비밀번호
    properties: #이메일 구성에 대한 추가 속성
      mail:
        smtp:
          auth: true #SMTP 서버에 인증 필요한 경우 / 구글은 서버 인증을 요구하기 때문에 true로 설정
          starttls: #SMTP 서버가 TLS를 사용하여 안전한 연결을 요구하는 경우 true로 설정 / 암호화하여 안전한 전송을 보장
            enable: true #StartTLS
            required: true
        connectiontimeout: 5000
        writetimeout: 5000
        timeout: 5000 #Socket Read Timeout(5)
    auth-code-expiration-millis: 300000  # 이메일 인증 코드의 만료 시간(Millisecond)  30 * 60 * 1000 == 05분

 

 

 

build.gradle
// 이메일 의존성 추가
	implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '3.2.8'
	implementation 'javax.mail:javax.mail-api'
	implementation 'org.springframework.boot:spring-boot-starter-mail'
	implementation 'org.springframework.boot:spring-boot-starter-validation'

 

 

 

EmailConfig
package com.tenco.movie.config;

import java.util.Properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

@Configuration
public class EmailConfig {

    @Value("${spring.mail.host}")
    private String host;

    @Value("${spring.mail.port}")
    private int port;

    @Value("${spring.mail.username}")
    private String username;

    @Value("${spring.mail.password}")
    private String password;

    @Value("${spring.mail.properties.mail.smtp.auth:true}")
    private boolean auth;

    @Value("${spring.mail.properties.mail.smtp.starttls.enable:true}")
    private boolean starttlsEnable;

    @Value("${spring.mail.properties.mail.smtp.starttls.required:true}")
    private boolean starttlsRequired;

    @Value("${spring.mail.properties.mail.smtp.connectiontimeout:5000}")
    private int connectionTimeout;

    @Value("${spring.mail.properties.mail.smtp.timeout:5000}")
    private int timeout;

    @Value("${spring.mail.properties.mail.smtp.writetimeout:5000}")
    private int writeTimeout;

    @Bean(name = "mail")
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setUsername(username);
        mailSender.setPassword(password);
        mailSender.setDefaultEncoding("UTF-8");
        mailSender.setJavaMailProperties(getMailProperties());
        return mailSender;
    }

    private Properties getMailProperties() {
        Properties properties = new Properties();
        properties.put("mail.smtp.auth", auth);
        properties.put("mail.smtp.starttls.enable", starttlsEnable);
        properties.put("mail.smtp.starttls.required", starttlsRequired);
        properties.put("mail.smtp.connectiontimeout", connectionTimeout);
        properties.put("mail.smtp.timeout", timeout);
        properties.put("mail.smtp.writetimeout", writeTimeout);
        return properties;
    }
}

 

 

 

MailController
package com.tenco.movie.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.tenco.movie.dto.EmailVerificationResult;
import com.tenco.movie.service.MailSendService;


@Controller
@RequestMapping("/mail")
public class MailController {
	
	@Autowired
	private MailSendService mailSendService;
	
	String authCode;

	/**
	 * 이메일 인증 보내는 영역
	 * @param email
	 * @return
	 * @author 형정
	 */
	@PostMapping("/verification-requests")
	public ResponseEntity<Map<String, Object>> sendMessageProc(@RequestParam("email")String email){
		
		authCode = mailSendService.sendCodeToEmail(email);
		
		Map<String, Object> response = new HashMap<>();
		response.put("success", true);
		System.out.println("성공핸니?? 이자식아");
		return new ResponseEntity<Map<String, Object>>(response, HttpStatus.OK);
		
	}

	/**	
	 * 이메일 인증 확인 영역
	 * @param email
	 * @return
	 * @author 형정
	 */
	@GetMapping("/verifications")
	public ResponseEntity<EmailVerificationResult> handleVerificationEmail(@RequestParam("email") String email, @RequestParam("code") String authCode){
		
		EmailVerificationResult result = mailSendService.verifiedCode(email, authCode);
		System.out.println("email : " + email + ", " + "authCode : " + authCode);
			
		return new ResponseEntity<>(result, HttpStatus.OK);
		
	}
	
}

 

 

 

[DTO] EmailVerificationResult
package com.tenco.movie.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class EmailVerificationResult {

	private boolean success;
	
	// 정적 팩토리 메서드로 결과 생성
	public static EmailVerificationResult of(boolean success) {
		return new EmailVerificationResult(success);
	}
	
}

 

 

 

UserRepository
// 이메일 발송
	public Optional<User> findByEmails(@Param("email") String email);

 

 

 

emailVerification.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div style="margin:100px;">
	    <h1>안녕하세요 !</h1>
	    <h1>CineDate 시네데이트입니다.</h1>
	    <br>
	        <p>아래 코드를 회원가입 창에서 입력해주세요.</p>
	    <br>
	
	    <div align="center" style="border:1px solid black;">
	    	<h3 style="color:#ff2588"> 회원가입 인증 코드 입니다.</h3>
	        <div style="font-size:48px">${code}</div>
	    </div>
	    <br/>
	</div>
</body>
</html>

 

 

 

user.xml
<select id ="findByEmails" resultType="com.tenco.movie.repository.model.User">
	select * from user_tb where email = #{email}
</select>

 

 


 

처음 메일 화면이 이랬는데 간단하게 인증코드만 왔었는데

 

이렇게 수정했다.

 

 

ERROR

이메일 코드를 입력하면 회원가입 창으로 넘어가서 바로 입력할 수 있거나

회원가입창에서 메일 인증 요청을 하면 값을 받아오기, 인증 코드 적는 칸에 시간 띄우기 등

여러가지 기능을 좀 더 추가해보고 싶었는데 이메일 인증 구현하는데 시간이 너무 오래 걸려서 여기서 타협하기로 했다.

나중에 혼자 프로젝트 할 때 해봐야징~

728x90