회원가입_인증 메일 발송-2

hiyayeah·2023년 1월 16일
0

MVC_Model1 -> Spring_MVC

목록 보기
10/12

계획

  • 회원 가입이 성공적으로 완료되면 (회원 insert 작업이 되면) 인증 메일을 발송하는 서블릿 주소를 호출한다. (이때, 가입한 회원의 idx값과 email값을 함께 넘긴다.)
  • sendAuthMail 메서드에서 인증코드를 생성한다.
  • 인증 메일을 발송한다.
  • 인증 정보(회원 idx, 인증코드)를 DB에 INSERT 한다.
  • 인증 메일 발송 실패 또는 인증 정보 INSERT 실패일 경우 새로운 인증 정보를 발송한다.
  • 둘 다 성공했을 경우 가입 완료 페이지로 포워딩

1. 회원 가입 성공 시 인증 메일 발송 서블릿 주소 호출

  • MemberController.java

join 메서드를 변경

if(insertCount > 0 && insertCount2 > 0) {	// ← 회원가입 성공 시
			// 회원 인증 메일 발송을 위한 sendAuthMail로 포워딩
			// => 파라미터로 가입자의 idx와 이메일주소를 함께 전송
			return "redirect:/sendAuthMail?idx=" + member.getMember_idx() + "&email=" + member.getMember_email();
		} else {
			model.addAttribute("msg", "가입 실패!");
			return "fail_back";
		}

2. sendAuthMail 서블릿 매핑, 인증코드 생성

  • MemberController.java
// 회원가입 인증 메일 발송
@GetMapping (value = "sendAuthMail")
public String sendAuthMail(@RequestParam int idx, @RequestParam String email, Model model) {
	
	// GenerateUserAuthenticationCode 클래스 인스턴스 생성 및 Getter 호출하여 인증코드 리턴받기
	// => 파라미터로 생성할 코드의 길이 전달(ex. 50글자)
	GenerateUserAuthenticationCode genAuthCode = new GenerateUserAuthenticationCode(50);
	String authCode = genAuthCode.getAuthCode();
	System.out.println("인증코드 : " + authCode);
	
	return "";
}

포워딩 및 값이 잘 전달되고, 인증 코드도 잘 생성됨을 확인!

3. 인증 메일 발송

  • MemberController.java
// 회원가입 인증 메일 발송
@GetMapping (value = "sendAuthMail")
public String sendAuthMail(@RequestParam int idx, @RequestParam String email, Model model) {
	
	// GenerateUserAuthenticationCode 클래스 인스턴스 생성 및 Getter 호출하여 인증코드 리턴받기
	// => 파라미터로 생성할 코드의 길이 전달(ex. 50글자)
	GenerateUserAuthenticationCode genAuthCode = new GenerateUserAuthenticationCode(50);
	String authCode = genAuthCode.getAuthCode();
    // ---------------------------------------------------⬆️위에 했던 작업
	
	// 인증 메일 발송에 사용될 정보(수신자 메일 주소, 메일 제목, 메일 본문) 생성
	// => 수신자 메일 주소는 가입자의 email 주소를 그대로 사용
	String subject = "[ooo] 오운완 가입 인증 메일입니다.";
	String content = "<a href='http://localhost:8081/ooo/memberAuth?idx=" + idx + 
						"&authCode=" + authCode + "'><b>인증하려면 클릭하세요.</b></a>";
			
	// 인증 메일 발송을 위해 SendMail 클래스 인스턴스 생성 및 sendMail() 메서드 호출하여 메일 발송
	// => 파라미터 : 수신자 메일 주소, 메일 제목, 메일 본문
	SendMail sendMail = new SendMail();
	boolean isSendSuccess = sendMail.sendMail(email, subject, content);
	System.out.println(isSendSuccess);
	
	// AuthInfoBean 객체 생성 및 아이디, 인증코드 저장
	AuthInfoVO authInfo = new AuthInfoVO(idx, authCode);
	
	return "";
}

가입 시 기재한 이메일로 인증 메일이 잘 도착했다!

4. 인증 정보를 DB에 INSERT

회원의 인증정보(회원 idx, email)를 auth_info 테이블에 저장

  • MemberController.java
// 회원가입 인증 메일 발송
@GetMapping (value = "sendAuthMail")
public String sendAuthMail(@RequestParam int idx, @RequestParam String email, Model model) {
	
	.
    .
    .
	
	// AuthInfoBean 객체 생성 및 아이디, 인증코드 저장
	AuthInfoVO authInfo = new AuthInfoVO(idx, authCode);
	
	// 인증 정보 → DB 등록 작업 요청
	int insertCount = service.registAuthInfo(authInfo);
    
    
    // 만약, 인증 메일 발송 실패 또는 인증 정보 등록 실패일 경우
	// => 새로운 인증 정보 발송을 위해 sendAuthMail 요청(Redirect)
	//    (파라미터 : idx, 이메일)
	// 아니면, 회원 가입 완료 페이지(joinSuccess.jsp) 요청
	if(!isSendSuccess || insertCount < 0) {
		return "redirect:/sendAuthMail?idx=" + idx + "&email=" + email;
	} else {
		return "member/joinSuccess";
	}
	
	
}
  • MemberMapper.xml
<!-- 회원가입 - 인증 정보 등록 -->
	<insert id="insertAuthInfo">
	INSERT
		INTO auth_info
		VALUES (
				#{member_idx},
				#{auth_code}
				)
		ON DUPLICATE KEY UPDATE auth_code = #{auth_code}		
</insert>

INSERT를 할 때 인증 오류가 나서 이미 인증코드가 발급 돼 있는 회원이 재 발급을 하는 경우가 있을것이다.
그렇기 때문에
1. member_idx가 존재하지 않을 경우 member_idx와 auth_code 모두 INSERT
2. member_idx가 중복일 경우 auth_code만 UPDATE한다.

어떻게 해야할지 구글링을 하다가 [MySQL] 없으면 insert, 있으면 update 하기 해당 링크를 참고해
ON DUPLICATE KEY UPDATE auth_code = #{auth_code}
코드를 작성해보았다.

#시행착오-1

member_idx 7인 멤버가 회원가입 됐으니 auth_info 테이블에도 member_idx가 7로 들어가야하는데

6이요..?

6으로 넘어가네요..

mapper.xml로 넘어가서 생각을 해보니까

<!-- 회원가입 작업 수행 -->
<insert id="insertMember">
	<selectKey keyProperty="member_idx" resultType="integer" order="BEFORE">
		SELECT IFNULL(MAX(member_idx),0) FROM member
	</selectKey>
	INSERT 
		INTO member
		VALUES (
				#{member_idx} + 1,
				#{member_id},
				#{member_passwd},
				#{member_name},
				#{member_gender},
				#{member_email},
				#{member_phone},
				DATE_FORMAT(now(), '%y-%m-%d'),
				'N'
				)
</insert>

회원가입 때 member_idx를 그대로 가져오는데
MAX(member_idx) 그 전 회원의 idx이고 INSERT 할 때 +1을 해주니까 member_idx 값 자체는 그 전 회원의 idx로 그대로인 것 같았다.

<!-- 회원가입 작업 수행 -->
<insert id="insertMember">
	<selectKey keyProperty="member_idx" resultType="integer" order="BEFORE">
		SELECT IFNULL(MAX(member_idx),0) + 1 FROM member
	</selectKey>
	INSERT 
		INTO member
		VALUES (
				#{member_idx},
				#{member_id},
				#{member_passwd},
				#{member_name},
				#{member_gender},
				#{member_email},
				#{member_phone},
				DATE_FORMAT(now(), '%y-%m-%d'),
				'N'
				)
</insert>

그래서 애초에 +1을 해서 설정을 해둬버리는걸로 바꿔버림..처음부터 이렇게 할걸ㅠ

다시 테스트를 해보자

맞게 잘 들어감ㅠㅠㅠㅠㅠ

#시행착오-2
인증 코드를 동일 회원에게 재전송 했을 때, 인증코드만 UPDATE 되어 잘 들어가나 확인을 했는데

저런식으로 들어가버렸다..
^^..재미없어요

아무래도 ON DUPLICATE KEY UPDATE 를 잘 못 사용한 것 같았다.
다시 읽어보니 저 구문을 사용하려면 auth_info 테이블에 PK나 UNIQUE 제약조건이 필요했고,
member_idx 컬럼에 UNIQUE 제약조건을 추가했다.

ALTER TABLE `ooo`.`auth_info` 
ADD UNIQUE INDEX `member_idx_UNIQUE` (`member_idx` ASC) VISIBLE;

auth_code 값만 잘 바뀌는 것을 확인ㅠㅠㅠ


회원 가입 후 인증 메일을 발송하고 인증 정보까지 DB에 INSERT 하는 작업 완료!!

0개의 댓글