Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

Been_DevStep

Spring Boot 회원 가입 본문

공부/SpringBoot

Spring Boot 회원 가입

JChBeen 2022. 11. 8. 16:42

회원가입을 진행하기 위해서 JS에서 모든 항목을 입력했는지 확인하고,  입력한 데이터를 FormData에 담아서  Controller에 보내줍니다.

if (!form['emailSend'].disabled || !form['emailVerify'].disabled) {
        Warning.show("이메일 인증을 완료해 주세요.");
        return;
    }
    if (form['password'].value === '') {
        Warning.show("비밀번호를 입력해주세요.");
        return;
    }
    if (form['passwordCheck'].value === '') {
        Warning.show("비밀번호를 재입력해주세요.");
        return;
    }

    if(form['password'].value !== form['passwordCheck'].value) {
        Warning.show('비밀번호가 일치하지 않습니다. 다시 작성해 주세요. ');
        return;
    }

    if (form['nickName'].value === '') {
        Warning.show("닉네임을 입력해 주세요.");
        return;
    }
    if (form['name'].value === '') {
        Warning.show("이름을 입력해 주세요.");
        return;
    }
    if (form['contact'].value === '') {
        Warning.show("연락처를 입력해 주세요.");
        return;
    }
    if (form['addressPostal'].value === '' || form['addressPrimary'].value === '') {
        Warning.show("주소찾기를 통해 주소를 입력해주세요.");
        return;
    }

    if (form['addressSecondary'].value === ''){
        Warning.show("상세주소를 입력해주세요.");
        return;
    }

    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.send(formData);
}

 

Controller에서 FormData를 통해서 값을 전달받습니다. 

전달받을때 각각의 값을 미리 선언해둔 Entity들을 통해서 받아줍니다.

 

@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();
}

Service에서 Controller에서 전달받은 값을 통해서 DB에 저장하는 작업을 진행합니다.

public Enum<? extends IResult> register(UserEntity user, EmailAuthEntity emailAuth) {
    // 1 emailAuth 가 가진 email code salt 값 기준으로 새로운 EmailAuthEntity select
    EmailAuthEntity existingEmailAuth = this.memberMapper.selectEmailAuthByEmailCodeSalt(
            emailAuth.getEmail(), emailAuth.getCode(), emailAuth.getSalt());
    // 가져온 새로운 객체가 null or isExpired() == false  경우
    // RegisterResult.EMAIL_NOT_VERIFIED 를 결과에 반환하기
    if (existingEmailAuth == null || !existingEmailAuth.isExpired()) {
        return RegisterResult.EMAIL_NOT_VERIFIED;
    }
    //전화번호가 중복일 경우
    if (this.memberMapper.selectUserByContact(user.getContact()) != null) {
        return RegisterResult.CONTACT_DUPLICATED;
    }
    //닉네임이 중복일 경우
    if (this.memberMapper.selectUserByNickname(user.getNickname()) != null) {
        return RegisterResult.NICKNAME_DUPLICATED;
    }

    user.setPassword(CryptoUtils.hashSha512(user.getPassword()));

    return this.memberMapper.insertUser(user) > 0 ? CommonResult.SUCCESS : CommonResult.FAILURE;
}

입력받은 password는 평문임으로 암호화해서 다시 담아줍니다.

 

Service에서 insert를 실행하기 위해서 Mapper Interface에서 insert를 정의해줍니다.

int insertUser(UserEntity user);

returnType int는 영향을 받은 레코드의 갯수를 반환해줍니다.

결과 0 이라면 값이 제대로 DB에 들어가지 않았다는 의미이기 때문에 실패를 돌려줍니다.

return this.memberMapper.insertUser(user) > 0 ? CommonResult.SUCCESS : CommonResult.FAILURE;

 

 

Mapper Interface와 연결되는 xml에 sql을 작성합니다.

<insert id="insertUser"
        parameterType="dev.test.study_member_bbs.entities.member.UserEntity">
    INSERT INTO `study_member`.`user` (`email`, `password`, `nickname`, `name`, `contact`, `address_postal`, address_primary, address_secondary)
    VALUES (#{email}, #{password}, #{nickName}, #{name}, #{contact}, #{addressPostal}, #{addressPrimary}, #{addressSecondary})
</insert>
useGeneratedKeys="true"
keyProperty="index"
keyColumn="index"

해당 구문에서  useGeneratedKeys, keyProperty, keyColumn은 AUTO-INCREMENT 를 사용하는 index를 사용할때만 사용기 때문에 사용하지 않습니다.

현재의 기본키는 email임으로 사용하지 않았습니다.

 

Comments