[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
댓글을 사용할 수 없습니다.