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";
}
// 회원가입 인증 메일 발송
@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 "";
}
포워딩 및 값이 잘 전달되고, 인증 코드도 잘 생성됨을 확인!
// 회원가입 인증 메일 발송
@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 "";
}
가입 시 기재한 이메일로 인증 메일이 잘 도착했다!
회원의 인증정보(회원 idx, email)를 auth_info 테이블에 저장
// 회원가입 인증 메일 발송
@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";
}
}
<!-- 회원가입 - 인증 정보 등록 -->
<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 값만 잘 바뀌는 것을 확인ㅠㅠㅠ