[Spring MVC] 커맨드 객체의 값 검증하기 (Validation 체크)
커맨드 객체의 값 검증
폼에서 넘어온 파라미터의 값이 정상적인 값인지 검증하는 작업이 필요하다. (이를 Validation 체크라 한다.)
스프링 MVC에서는 이를 위해 2가지 인터페이스를 지원한다.
- org.springframework.validation.Validator
- org.springframework.validation.Errors
Validator 인터페이스는 다음과 같다.
public interface Validator {
boolean supports(Class<?> clazz); // Validator가 검증할 수 있는 타입인지 확인한다.
void validate(Object target, Errors errors); // target을 검증한 후, 에러값이 있다면 errors에 담는다.
}
위의 인터페이스를 구현해서 회원가입 폼에서 넘어온 커맨드 객체를 검증해보자.
public class RegisterRequestValidator implements Validator {
private static final String emailRegExp =
"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" +
"[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
private Pattern pattern;
public RegisterRequestValidator() {
pattern = Pattern.compile(emailRegExp);
}
@Override
public boolean supports(Class<?> clazz) {
return RegisterREquest.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
RegisterREquest regReq = (RegisterRequest) target;
if (regReq.getEmail() == null || regReq.getEmail().trim().isEmpty()) {
errors.rejectValue("email", "required");
} else {
Matcher matcher = pattern.matcher(regReq.getEmail());
// 패턴과 매칭되지 않으면
if (!matcher.matches())
errors.rejectValue("email", "bad");
}
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required");
ValidationUtils.rejectIfEmpty(errors, "password", "required");
ValidationUtils.rejectIfEmpty(errors, "confirmPassword", "required");
if (!regReq.getPassword().isEmpty()) {
if (!regReq.isPasswordEqualToConfirmPassword())
errors.rejectValue("confirmPassword", "nomatch");
}
}
}
구현한 검증 객체는 컨트롤러에서 사용한다.
@Controller
public class RegisterController {
private MemberRegisterService memberRegisterService;
// ...중략
@PostMapping(value = "/register")
public ModelAndView register(@RequestBody RegisterRequest regReq, Errors errors, ModelAndView mnv) {
new RegisterRequestValidator().validate(regReq, errors); // 커맨드 객체를 검증한다 !
if (errors.hasErrors()) { // 만약 검증에 실패하면, 회원가입 폼을 다시 보여준다.
mnv.setViewName("register/registerForm");
return mnv;
}
try {
memberRegisterService.regist(regReq);
mnv.setViewName("register/registerSuccess");
return mnv;
} catch (DuplicateMemberException e) {
errors.rejectValue("email", "duplicate");
mnv.setViewName("register/registerForm");
return mnv;
}
}
}
'Web > Spring Web MVC' 카테고리의 다른 글
[Spring] Spring WebFlux (0) | 2020.03.03 |
---|---|
[Spring Boot] Profile 설정 (0) | 2020.02.27 |
[Spring MVC] 정적 자원 매핑 - <mvc:resouces> 태그 (2) | 2019.11.27 |
[Spring MVC] ContextLoaderListener(전역 Context 설정) (0) | 2019.11.20 |
[Spring MVC] <spring:message> 태그로 메시지 출력하기 (0) | 2019.11.14 |
댓글
이 글 공유하기
다른 글
-
[Spring] Spring WebFlux
[Spring] Spring WebFlux
2020.03.03 -
[Spring Boot] Profile 설정
[Spring Boot] Profile 설정
2020.02.27 -
[Spring MVC] 정적 자원 매핑 - <mvc:resouces> 태그
[Spring MVC] 정적 자원 매핑 - <mvc:resouces> 태그
2019.11.27 -
[Spring MVC] ContextLoaderListener(전역 Context 설정)
[Spring MVC] ContextLoaderListener(전역 Context 설정)
2019.11.20