3 분 소요

회원 가입과 메일 인증

회원 가입과 메일 인증

  • 사이트에 회원가입을 할 때, 해당 메일주소로 메일을 발송하여 계정활성화를 하는 방법.

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에 담겠다는 뜻.
  • memberServiceemailAuth메서드로 uuid를 넘겨서 처리한 값을 result로 받은 후 member/email_auth.htmlresult로 넘김.

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) 전체 흐름

  1. 클라이언트는 회원가입 사이트에 접속하여 회원정보를 입력해서 제출버튼 클릭.
  2. 클릭 시 해당 값들이 Post방식으로 웹 브라우저 -> 서버로 전달됨.
  3. Controller는 회원가입 정보를 parameter를 받아서 memberService에 회원가입 메서드를 호출하면서 값을 넘김.
  4. memberService는 해당아이디가 중복이면 false 반환, 중복이 아니면 UUID를 포함하는 Member객체를 생성.
  5. 생성된 객체는 memberRepository로 넘어가고, 그 중 id값(메일주소)을 활용하여 계정 활성화 메일을 보냄.
  6. 메일에는 memberService가 생성한 UUID값을 Get방식으로 넘기는 하이퍼링크를 포함하고 있으며, 클릭하면 email-auth페이지로 넘어감.
  7. 해당 페이지에서 Get요청을 받은 Controller는 memberService에 메일인증 메서드를 호출하면서 UUID값을 넘김.
  8. memberService 메일인증 메서드는 uuid값이 없으면 false를 넘기고, uuid값이 있으면 해당 값을 가진 member의 인증여부와 인증시간을 업데이트하고 memberRepository에 넘김.
  9. 인증 여부를 리턴받은 Controller는 결과값을 model.addAttribute에 담아 email-auth페이지에 넘김.
  10. 페이지는 결과값에 따라 활성화 성공, 실패 여부를 클라이언트에게 보여줌.

마지막 수정일시: 2022-08-18 03:02

카테고리:

업데이트:

댓글남기기