회원 가입과 메일 인증
회원 가입과 메일 인증
회원 가입과 메일 인증
- 사이트에 회원가입을 할 때, 해당 메일주소로 메일을 발송하여 계정활성화를 하는 방법.
1. 전체 순서
- 디펜던시 및 프로젝트 설정파일 추가.
- Entity 수정
- MVC 수정
2. 디펜던시 및 프로젝트 설정파일 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
mail:
host: smtp.gmail.com
port: 587
username: 보내는 메일 계정
password: 보내는 메일 계정에서 smtp 설정 후 제공받는 키
properties:
mail:
smtp:
starttls:
enable: true
- 구글 메일에서는 Google 계정 관리 - 보안 - Google에 로그인(2단계 인증 활성화 상태) - 앱 비밀번호에서 생성. 이후 메일 설정에서 POP, IMAP 사용 활성화 하면 됨.
3. Entity 수정
- DB에 계정 활성화에 대한 정보가 추가로 담겨야 함.
@Data
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
private String userId;
private String userName;
private String password;
private String phone;
private LocalDateTime regDt;
// 아래는 계정 활성화를 위한 정보
private boolean emailAuthYn; // 승인 받았는지
private LocalDateTime emailAuthDt; // 승인 받은 일시
private String emailAuthKey; // 계정 승인에 필요한 uuid값
}
4. MVC 수정
1) email_auth.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"> -> thymeleaf 문법 사용
<head>
<meta charset="UTF-8">
<title>회원 활성화</title>
</head>
<body>
<h1>회원 활성화</h1>
<div th:if="${result eq true}">
<p>회원님의 계정이 활성화 되었습니다.</p>
</div>
<div th:if="${result eq false}">
<p>회원님의 계정 활성화에 실패했습니다.</p>
</div>
</body>
</html>
- 계정이 활성화 되면 result값에 true가 저장되어 오게 됨.
2) MemberController.java
@GetMapping("/member/email-auth")
public String emailAuth(Model model, HttpServletRequest request) {
String uuid = request.getParameter("id");
System.out.println(uuid);
boolean result = memberService.emailAuth(uuid);
model.addAttribute("result", result);
return "member/email_auth";
}
request
는 Web -> Server로 넘어오는 정보.getParameter("id")
는 결국/member/email-auth?id=_______
이 부분의 값을 넘겨받아String uuid
에 담겠다는 뜻.memberService
의emailAuth
메서드로 uuid를 넘겨서 처리한 값을result
로 받은 후member/email_auth.html
에result
로 넘김.
3) MemberService.java / MemberServiceImpl.java
public interface MemberService {
boolean register(MemberInput parameter);
boolean emailAuth(String uuid);
}
@RequiredArgsConstructor
@Service
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
private final MailComponents mailComponents;
/**
* @return 회원가입 성공여부
*/
@Override
public boolean register(MemberInput parameter) {
Optional<Member> optionalMember = memberRepository.findById(parameter.getUserId());
if(optionalMember.isPresent()) {
return false;
}
String uuid = UUID.randomUUID().toString(); //uuid 생성
// Member 객체 생성
Member member = Member.builder()
.userId(parameter.getUserId())
.userName(parameter.getUserName())
.password(parameter.getPassword())
.phone(parameter.getPhone())
.regDt(LocalDateTime.now())
.emailAuthYn(false)
.emailAuthKey(uuid)
.build();
/* 위에 .builder().build()와 동일
member.setUserId(parameter.getUserId());
member.setUserName(parameter.getUserName());
member.setPassword(parameter.getPassword());
member.setPhone(parameter.getPhone());
member.setRegDt(LocalDateTime.now());
member.setEmailAuthYn(false);
member.setEmailAuthKey(uuid);
*/
// memberRepo 객체에 save -> DB에 보내지기 위해서.
memberRepository.save(member);
String email = parameter.getUserId();
String subject = "fastLMS 사이트 가입을 축하드립니다.";
String text = "<p>fastLMS 사이트 가입을 축하드립니다.</p><p>아래 링크를 클릭하셔서 가입을 완료하세요.</p>"
+ "<div><a href='http://localhost:8080/member/email-auth?id=" + uuid + "'> 가입 완료 </a></div>";
mailComponents.sendMail(email, subject, text);
return true;
}
/**
* @return 계정활성화 성공여부
*/
@Override
public boolean emailAuth(String uuid) {
Optional<Member> optionalMember = memberRepository.findByEmailAuthKey(uuid);
if(!optionalMember.isPresent()) {
return false;
}
Member member = optionalMember.get();
member.setEmailAuthYn(true); // 계정 활성화 성공 true로
member.setEmailAuthDt(LocalDateTime.now()); // 계정 활성화 시간 입력
memberRepository.save(member); // 해당 정보를 memberRepo에 저장
return true;
}
}
4) MailComponents.java
import lombok.RequiredArgsConstructor;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Component;
import javax.mail.internet.MimeMessage;
@Component
@RequiredArgsConstructor
public class MailComponents {
// 테스트용
private final JavaMailSender javaMailSender;
public void sendMailTest() {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("받을 메일주소");
message.setSubject("안녕하세요, 제로베이스입니다.");
message.setText("메일인증 테스트입니다.");
javaMailSender.send(message);
}
public boolean sendMail(String mail, String subject, String text) {
boolean result = false;
MimeMessagePreparator msg = new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
mimeMessageHelper.setTo(mail);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(text, true);
}
};
try {
javaMailSender.send(msg); // 메일이 발송되면 true
result = true;
} catch (Exception e) {
System.out.println(e.getMessage());
}
return result;
}
}
spring-boot-starter-mail
라이브러리를 사용한 메일 전송을 위한 클래스. mail - 받는 메일 주소 / subject - 제목 / text - 본문.
5) MemberRepository.java
public interface MemberRepository extends JpaRepository<Member, String> {
Optional<Member> findByEmailAuthKey(String emailAuthKey);
}
JpaRepository
를 상속받아 DB에 Member 객체를 저장.
6) 전체 흐름
- 클라이언트는 회원가입 사이트에 접속하여 회원정보를 입력해서 제출버튼 클릭.
- 클릭 시 해당 값들이 Post방식으로 웹 브라우저 -> 서버로 전달됨.
- Controller는 회원가입 정보를 parameter를 받아서 memberService에 회원가입 메서드를 호출하면서 값을 넘김.
- memberService는 해당아이디가 중복이면 false 반환, 중복이 아니면 UUID를 포함하는 Member객체를 생성.
- 생성된 객체는 memberRepository로 넘어가고, 그 중 id값(메일주소)을 활용하여 계정 활성화 메일을 보냄.
- 메일에는 memberService가 생성한 UUID값을 Get방식으로 넘기는 하이퍼링크를 포함하고 있으며, 클릭하면
email-auth
페이지로 넘어감. - 해당 페이지에서 Get요청을 받은 Controller는 memberService에 메일인증 메서드를 호출하면서 UUID값을 넘김.
- memberService 메일인증 메서드는 uuid값이 없으면 false를 넘기고, uuid값이 있으면 해당 값을 가진 member의 인증여부와 인증시간을 업데이트하고 memberRepository에 넘김.
- 인증 여부를 리턴받은 Controller는 결과값을
model.addAttribute
에 담아email-auth
페이지에 넘김. - 페이지는 결과값에 따라 활성화 성공, 실패 여부를 클라이언트에게 보여줌.
마지막 수정일시: 2022-08-18 03:02
댓글남기기