본문으로 바로가기

회원가입 환경을 구현할때 여러가지로 고려해야할 사항이 많다.
예들들어, 비밀번호의 최소 갯수, 닉네임의 최수 글자수, email과 닉네임의 중복체크 등등이 있다.

  1. Controller에서 회원가입 진행 시 유효성 검사하기

    @PostMapping("/sign-up")  
    public String signUpSubmit(@Valid SignUpForm signUpForm, Errors errors){  
     if(errors.hasErrors()) {  
         return "account/sign-up";  
    }  
    
    //중복검사
    signUpFormValidator.validate(signUpForm,errors);  
    if(errors.hasErrors()) {  
         return "account/sign-up";  
    }  
    //회원정보등록 
    Account account = 
    accountService.processNewAccount(signUpForm);  
    
     return "redirect:/";  
    }

    @Vaild 어노테이션을 설정하면, SignUpForm에 설정한 어노테이션들을 바탕으로 유효성 검사를 진행한다. errors.hasErrors() 유효성 검사를 바탕으로 위배되는 사항이 있는경우 에러가 검출되어 다시 회원가입 창으로 이동하게 된다. 유효성 검사 이후, 중복검사를 진행한다.

 

    2.중복검사를 진행하는 Validator

 

- boolean supports : 인스턴스가 검증 대상 타입인지 확인

- void validate : 실질적인 검증 작업

 

@Component
@RequiredArgsConstructor
public class SignUpFormValidator implements Validator {

    private final AccountRepository accountRepository;
    @Override
    public boolean supports(Class<?> aClass) {
        return aClass.isAssignableFrom(SignUpForm.class);
    }

    @Override
    public void validate(Object object, Errors errors) {
    SignUpForm signUpForm = (SignUpForm)object;
    if(accountRepository.existsByEmail(signUpForm.getEmail())){
        errors.rejectValue("email", "invalid.email", 
                new Object[]{signUpForm.getEmail()}, "이미 사용중인 이메일 입니다.");
    }

        if(accountRepository.existsByNickname(signUpForm.getNickname())){
            errors.rejectValue("nickname", "invalid.nickname", 
                    new Object[]{signUpForm.getNickname()}, "이미 사용중인 닉네임 입니다.");
        }
    }
}
  1.   회원가입 폼 DTO

    @Data  
    public class SignUpForm {  
    
     @NotBlank  
     @Length(min = 3, max = 20)  
    @Pattern(regexp = "^[ㄱ-ㅎ가-힣a-z0-9-_]{3,20}$")  
    private String nickname;  
    
     @Email  
     @NotBlank  
     private String email;  
    
     @NotBlank  
     @Length(min = 8, max = 50)  
     private String password;  
    }