티스토리 뷰

구현하시오.

# 요청준비
  - 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
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함