의존성에 추가한 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
'My Proect > 파이널 프로젝트 - CineDate' 카테고리의 다른 글
19일차 - 슈퍼 리스트 화면 구현 및 기능 구현 (2) | 2024.09.13 |
---|---|
18일차 - 헤더 서브 네비 추가 및 공지사항 화면 구현 (헤더 레이아웃 수정 예정) (5) | 2024.09.13 |
14일차 - 이메일 인증 구현 에러 (0) | 2024.09.05 |
12일차 - 메인 페이지에서의 검색 기능 구현 및 배너 (4) | 2024.09.03 |
11일차 - 헤더, 이미지 슬라이드 화면 구현 (0) | 2024.09.03 |