@Valid 와 validation을 이용한 중복체크 및 유효성 검사

2022. 5. 24. 15:38 Spring Framework/Spring boot #3

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

  1. Controller에서 회원가입 진행 시 유효성 검사하기@Vaild 어노테이션을 설정하면, SignUpForm에 설정한 어노테이션들을 바탕으로 유효성 검사를 진행한다. errors.hasErrors() 유효성 검사를 바탕으로 위배되는 사항이 있는경우 에러가 검출되어 다시 회원가입 창으로 이동하게 된다. 유효성 검사 이후, 중복검사를 진행한다.
  2. @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:/"; }

 

    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
  2. @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; }

 

출처 : https://1-7171771.tistory.com/108?category=885255