티스토리 뷰
구현하시오.
# 요청준비
- FormData 준비
- UserEntity가 가지는 모든 멤버에 대응하는 값 Append
- EmailAuthEntity 가 가지는 모든 멤버에 대응하는 값 Append(index 제외)
- XHR 준비
- 'POST' 방식으로 '/member/register'로 오픈
- 응답 결과에 따른 대응
- 'success' : 회원가입 성공. 스텝 3로 넘기기
- 'failure' : 알 수 없는 이유로 실패
- 'email_not_verified' : 이메일 인증이 완료되지 않았음. 실패 ('RegisterResult' 따로 필요함)
# 요청 받기
- 'MemberController'에 'postRegister' 메서드 맵핑하기. (+@ResponseBody)
- value : 'register'
- method : RequestMethod.POST
- produces : MediaType.APPLICATION_JSON_VALUE
- 매개변수 : UserEntity 및 EmailAuthEntity
- 'MemberService'에 'register' 메서드 만들기
- 'EmailAuthEntity' 사용하여 'IMemberMapper'의 'selectEmailAuthByEmailCodeSalt' 호출 후, null 이거나 isExpired()가 False인 경우 'EMAIL_NOT_VERIFIED'로 결과 반환
- 'UserEntity' 사용하여 'IMemberMapper'의 'insertUser' 호출 후, 결과 값이 0이면 'FAILURE'으로 결과값 반환.
- 전부 괜찮으면 'SUCCESS'함
- 'IMemberMapper'에 'insertUser' 메서드 만들고 MyBatis Mapper와 연결하기(+적절한 쿼리 작성).
- 'MemberController' 에서 응답 결과 적절하게 돌려주기.
- register.js
Cover.show('회원가입을 진행중입니다.\n\n잠시만 기다려 주세요.');
const xhr = new XMLHttpRequest();
const formData = new FormData();
formData.append('email', form['email'].value);
formData.append('code', form['emailAuthCode'].value);
formData.append('salt', form['emailAuthSalt'].value);
formData.append('password', form['password'].value);
formData.append('nickname', form['nickname'].value);
formData.append('name', form['name'].value);
formData.append('contact', form['contact'].value);
formData.append('addressPostal', form['addressPostal'].value);
formData.append('addressPrimary', form['addressPrimary'].value);
formData.append('addressSecondary', form['addressSecondary'].value);
xhr.open('POST', './register');
// 경로도 유심히 봐야한다. ./은
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
Cover.hide();
if (xhr.status >= 200 && xhr.status < 300) {
const responseObject = JSON.parse(xhr.responseText);
switch (responseObject['result']) {
case 'success':
form.querySelector('[rel="stepText"]').innerText = '회원가입 완료';
// form태그의 요소중 rel값을 stepText를 가진 태그의 Text를 추가한다.
form.querySelector('[rel="nextButton"]').innerText = '로그인하러 가기';
form.classList.remove('step2');
form.classList.add('step3');
break;
case 'email_not_verified':
Warning.show('이메일 인증이 완료되지 않았습니다.');
break;
default:
EmailWarning.show('알 수 없는 이유로 회원가입을 완료하지 못하였습니다. 잠시 후 다시 시도해 주세요.');
}
} else {
EmailWarning.show('서버와 통신하지 못하였습니다.잠시후 다시 시도해 주세요.');
}
}
}
xhr.send(formData);
- MemberController
@RequestMapping(value = "register",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String postRegister(UserEntity user, EmailAuthEntity emailAuth) {
Enum<?> result = this.memberService.register(user, emailAuth);
JSONObject responseObject = new JSONObject();
responseObject.put("result", result.name().toLowerCase());
return responseObject.toString();
}
- IMemberMapper.java
int insertUser(UserEntity user);
- MemberService
@Transactional
public Enum<? extends IResult> register(UserEntity user, EmailAuthEntity emailAuth) {
EmailAuthEntity existingStudy = this.memberMapper.selectEmailAuthByEmailCodeSalt(
emailAuth.getEmail(),
emailAuth.getCode(),
emailAuth.getSalt());
// int successStudy = this.memberMapper.insertUser(user);
if (existingStudy == null || !existingStudy.getExpired()) {
return RegisterResult.EMAIL_NOT_VERIFIED;
}
// existingStudy.setExpired(true);
if (this.memberMapper.insertUser(user) == 0) {
return CommonResult.FAILURE;
}
return CommonResult.SUCCESS;
}
XML
<insert id="insertUser"
useGeneratedKeys="true"
keyColumn="email"
keyProperty="email"
parameterType="dev.shlee.studymemberbbs.entities.member.UserEntity">
INSERT INTO `study_member`.`users` (`email`, `password`, `nickname`, `name`, `contact`, `address_postal`, `address_primary`, `address_secondary`)
VALUES (#{email}, #{password}, #{nickname}, #{name}, #{contact}, #{addressPostal}, #{addressPrimary}, #{addressSecondary})
</insert>
- RegisterResult
package dev.shlee.studymemberbbs.enums.member;
import dev.shlee.studymemberbbs.interfaces.IResult;
public enum RegisterResult implements IResult {
EMAIL_NOT_VERIFIED
}
'웹 개발 > SpringBoot' 카테고리의 다른 글
| [Spring Boot] 비밀번호 재 설정 시 이메일 존재 유무 확인 (5) | 2022.11.08 |
|---|---|
| [Spring Boot] 공통된 내용을 util 경로로 이동한 암호화 (2) | 2022.11.08 |
| [Spring Boot] 비밀번호 암호화 (0) | 2022.11.08 |
| [Spring Boot] 이메일 전송 (0) | 2022.11.07 |
| [String Boot] JSON (0) | 2022.11.07 |