[스프링] Form validation


Controller에 전달되는 파라미터(form)를 검증할 수 있는 방법

Validator interface

  • 전달받은 객체를 검증하고, 실패 시 errors를 설정해줌
    • supports : 파라미터로 전달된 클래스가 검증이 가능한지 여부를 반환
    • validate : 실제 검증 로직, 실패 시 errors 설정

예제 코드 링크

@Component
@RequiredArgsConstructor
public class SignUpFormValidator implements Validator {

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

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

    private final SignUpFormValidator signUpFormValidator;

    @InitBinder("signUpForm")  // signUpForm에만 Validator 적용
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.addValidators(signUpFormValidator);   
    }
}
@PostMapping(SIGNUP_URL)
public String signUpSubmit(@Valid SignUpForm signUpForm, Errors errors){
    if (errors.hasErrors()) {
        return SIGNUP_VIEW_NAME;
    }
    Account account = accountService.processNewAccount(signUpForm);
    accountService.login(account);
    return "redirect:/";
}





© 2020.02. by blupine