- 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 |