Spring Projcect/[팀플] In & Out 가계부

회원 가입 API

계란💕 2022. 10. 27. 13:33

 

  • error code
    • 비밀번호 정책, 가입 요구사항을 만족하기 위한 에러코드를 만든다.
<hide/>
@Getter
@AllArgsConstructor
public enum MemberErrorCode {

    /**
     * 회원가입 - 이미 존재하는 이메일, 휴대폰, 닉네임 오류
     */
    EMAIL_EXIST("이미 가입된 이메일입니다."),
    PHONE_EXIST("동일한 휴대폰 번호가 존재합니다. 다른 번호를 입력하세요."),
    NICKNAME_EXIST("동일한 닉네임이 존재합니다. 다른 닉네임을 입력하세요"),

    /**
     * 회원가입 - 비밀번호 오류
     */
    PASSWORD_LENGTH_MORE_THAN_8("비밀번호는 8자리 이상이어야합니다.(영문자, 숫자, 특수문자를 각각 1글자 이상 포함)"),
    PASSWORD_NOT_CONTAIN_DIGIT("비밀번호는 숫자를 한 글자 이상 포함해야합니다."),
    PASSWORD_NOT_CONTAIN_SPECIAL("비밀번호는 특수 문자를 한 글자 이상 포함해야합니다."),
    PASSWORD_NOT_CONTAIN_CHARACTER("비밀번호는 영문자를 한 글자 이상 포함해야합니다."),
    PASSWORD_NOT_CONTAIN_DIGIT_AND_SPECIAL("비밀번호는 숫자, 특수 문자를 각각 한 글자 이상 포함해야합니다."),
    PASSWORD_NOT_CONTAIN_DIGIT_AND_CHARACTER("비밀번호는 숫자, 영문자 문자를 각각 한 글자 이상 포함해야합니다."),
    PASSWORD_NOT_CONTAIN_CHARACTER_AND_SPECIAL("비밀번호는 영문자, 특수 문자를 각각 한 글자 이상 포함해야합니다."),

    private final String description;

}

 

 

  • service
    • 회원 가입 정보를 맞게 입력했는지 확인한다.
    • 아이디, 연락처, 닉네임이 중복되면 가입 불가
<hide/>
public void validateInput(JoinMemberInput input) {

    Optional<Member> existsMember = memberRepository.findByEmail(input.getEmail());
    if (existsMember.isPresent()) {
        throw new MemberException(EMAIL_EXIST);
    }

    existsMember = memberRepository.findByPhone(input.getPhone());
    if (existsMember.isPresent()) {
        throw new MemberException(PHONE_EXIST);
    }

    existsMember = memberRepository.findByNickName(input.getNickName());
    if (existsMember.isPresent()) {
        throw new MemberException(NICKNAME_EXIST);
    }

    validatePassword(input.getPassword());
}
<hide/>
@Override
public void join(JoinMemberInput input) {
    validateInput(input);
    String password = input.getPassword();
    String encPassword = bCryptPasswordEncoder.encode(password);
    Member member = Member.builder().email(input.getEmail()).address(input.getAddress())
        .birth(input.getBirth()).gender(input.getGender()).password(encPassword)
        .nickName(input.getNickName()).phone(input.getPhone()).build();
    memberRepository.save(member);
}

 

 

  • ctrl
<hide/>
@PostMapping("/signup")
@ApiOperation(value = "회원 가입 API", notes = "이메일을 아이디로 사용하여 가입할 수 있다.")
public ResponseEntity<?> signUp(
    @ApiParam(value = "회원 가입 정보 입력") @RequestBody JoinMemberInput memberInput) {
    memberService.join(memberInput);
    String message = "회원 가입이 완료됐습니다.";
    return new ResponseEntity(message, HttpStatus.OK);
}

 

 

  • test
<hide/>
@Test
@DisplayName("회원가입")
void signUp() throws Exception {

    // given
    JoinMemberInput memberInput = JoinMemberInput.builder().email("egg@naver.com")
        .address("서울특별시").phone("010-2222-0000")
        .birth(LocalDate.from(LocalDate.of(2000, 9, 30))).gender("남").nickName("원빈")
        .password("1").build();
    String memberInputJson = mapper.writeValueAsString(memberInput);

    //when
    mockMvc.perform(
            post("/api/signup").contentType(MediaType.APPLICATION_JSON).content(memberInputJson))
        .andExpect(status().isOk()).andDo(print());
    ArgumentCaptor<JoinMemberInput> captor = ArgumentCaptor.forClass(JoinMemberInput.class);

    //then
    Mockito.verify(memberServiceImpl, times(1)).join(captor.capture());
    assertEquals(captor.getValue().getEmail(), memberInput.getEmail());

}
<hide/>
@Test
@DisplayName("회원가입")
void join() {

    // given
    given(memberRepository.findByEmail(anyString())).willReturn(Optional.empty());
    Member member = Member.builder().email("egg@naver.com").phone("010-2222-0000")
        .password(bCryptPasswordEncoder.encode("abc!@#12")).build();
    memberRepository.save(member);

    // when
    JoinMemberInput memberInput = JoinMemberInput.builder().email("egg@naver.com")
        .address("서울특별시").phone("010-2222-0000")
        .birth(LocalDate.from(LocalDate.of(2000, 9, 30))).gender("남").nickName("원빈")
        .password("abc!@#12").build();
    memberService.join(memberInput);

    // then
    verify(memberRepository, times(1)).save(member);

}

 

'Spring Projcect > [팀플] In & Out 가계부' 카테고리의 다른 글

회원 탈퇴 API  (0) 2022.10.30
회원 이메일 인증 API  (0) 2022.10.28
회원 로그아웃 API  (0) 2022.10.26
회원 예외 처리 MemberErrorCode, ExceptionHandler  (0) 2022.10.25
회원 로그인 API  (0) 2022.10.25