본문 바로가기

Server Programming/Spring Boot Full-Stack Programming

[스프링 풀스택 클론 코딩 - 회원가입] (1-17) 가입 확인 이메일 재전송

반응형

 

이메일 확인 페이지 작성

이메일 재전송 가능하면 재전송

-> 1시간 이내 재전송한 경우 재전송하지 않는다.


check-email

<!DOCTYPE html>
<html>

<head th:replace="fragments.html :: head"></head>
<meta charset="UTF-8">
<title>인증 이메일 확인</title>
</head>

<body>
	<nav th:replace="fragments.html :: main-nav"></nav>

	<div class="container">
	<!-- 에러메시지 있을 때 블럭-->
		<div class="py-5 text-center" th:if="${error !=null}">
			<p class="lead"> 데모 가입</p>
			<div class="alert alert-danger" role="alert" th:text="${error}"></div>
			<p class="lead" th:text="${email}"> your@email.com</p>
		</div>
		<!-- 에러메시지 없을 때 블럭-->
		<div class="py-5 text-center" th:if="${error==null}">
			<p class="lead">데모 가입</p>
			<h2> 데모 서비스를 이용하려면 인증 이메일을 확인하세요. </h2>
			<div>
				<p class="lead" th:text="${email}"> your@email.com</p>
				<a class="btn btn-outline-info" th:href="@{/resend-confirm-email}"> 인증 이메일 다시 보내기</a>
			</div>
		</div>


		<div th:replace="fragments.html :: footer"></div>

	</div>
</body>

</html>

 

AccountController -> checkEmail(), resendConfirmEmail()

	//이메일 확인 페이지, 이메일 재전송
	@GetMapping("/check-email")
	public String checkEmail (@CurrentUser Account account, Model model) {
		model.addAttribute("email", account.getEmail());
		//모델의 email에 account의 이메일을 담는다.
		return "account/check-email";		
	}
	@GetMapping("/resend-confirm-email")
	public String resendConfrimEmail(@CurrentUser Account account, Model model) {
		//이메일 전송 가능 여부 확인 -> 재전송한 시간이 1시간이내인 경우 불가능
		
		//재전송한 시간이 1시간이내인 경우
		if(!account.canSendConfirmEmail()) {
			model.addAttribute("error", "인증 이메일은 1시간에 한번만 전송할 수 있습니다.");
			model.addAttribute("email", account.getEmail());
			return "account/check-email";
		}
		
		//재전송한 시간이 1시간이내가 아닌 경우
		accountService.sendSignUpConfirmEmail(account);
		return "redirect:/";
		//redirect로 보내는 이유는 새로고침시 재전송하는 것을 미연에 방지하기위해
	}

}

 

 

AccountService에서 sendSignUpConfirmEmail()

//재전송 기능을 사용하기위해 private -> public으로 변경
	public void sendSignUpConfirmEmail(Account newAccount) {
		// 관련 객체 정의 후 -> 빈 정의 후 발송
		SimpleMailMessage mailMessage = new SimpleMailMessage();

		// 받는 주소
		mailMessage.setTo(newAccount.getEmail());
		// 제목 작성
		mailMessage.setSubject("Demo, 회원 가입 인증");
		// 본문 작성 -> 가입인증 링크 만들어 제공 -> 토큰값을 생성해 가입인증 진행
		mailMessage.setText("/check-email-token?token=" + newAccount.getEmailCheckToken() +
                "&email=" + newAccount.getEmail());
		// 메일 발송 ->
		javaMailSender.send(mailMessage);
		// 만약에 발송을 하지않는다면, test에서 오류를 내뿜게된다.
	}

 

반응형