sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
extra_vars6 |
Spring MVC Validation 부분의 예는 jpetstore 의 유저 등록 부분인 AccountFormController 를 살펴보면 나와 있다.
AccountFormController 클래스는 SimpleFormController 를 확장한다. (AccountFormController extends SimpleFormController)
SimpleFormController 는 Spring MVC를 구현하는데에 매우 유용한 클래스이다. 이 클래스에 대한 활용은 추후에 좀 더 공부해야 할 필요가 있다.
단지 이 문서에서는 SimpleFormController 를 상속받아서 일부 Validation 체크가 이뤄지는 부분이 onBindAndValidate 메소드라는 사실만 알면 된다.
다음은 AccountFormController 클래스에 정의된 onBindAndValidate 메소드의 코드 내용이다.
위의 코드를 보면 중간쯤에 getValidator로 Validator객체를 요청하여 validation을 실행하는 것을 볼 수 있다.
요청된 클래스는 AccountValidator 클래스로써 Account 객체의 유효성을 체크한다.
AccountValidator 클래스는 Validator 인터페이스를 상속받고 있다. (AccountValidator implements Validator)
중요한 것은 Validator 인터페이스가 mvc에만 제한되어 있지 않다는 것이다.
Validator 인터페이스의 패키지를 보면 이러한 사실을 알 수 있다. (org.springframework.validation.Validator)
이는 유효성 체크가 웹계층과 연관이 없어야하고, 어떤 장소에 배치하기(localize) 쉬워야한다는 것과 어떠한 유효성 검사를 수행하고 싶은 개발자가 쉽게 플러그인 할 수 있도록 해야한다는 것을 의미한다.
그리고 Spring은 어플리케인션 모든 계층내에 기본적으로 사용할 수 있는 Validator 인터페이스를 제안하고 있다.
다음은 AccountValidator 클래스의 내용이다.
코드에서는 대부분의 항목에 대한 유효성 체크를 하고 있지만 일부 항목에 대한 유효성 체크는 누락되어 있다. (Password, RepeatedPassword)
이 항목에 대한 유효성 체크는 신규가입인지, 개인정보수정 인지에 따라 분기하기 위해 컨트롤러의 onBindAndValidate 메소드내에서 직접적으로 구현하고 있는 것이다.
나머지 설정에 관련된 코드는 컨트롤러의 생성자 부분에 setValidateOnBinding(false); 코드와 servlet.xml 화일에 정의된 컨트롤러 설정부분이다.
컨트롤러 설정부분에서는 프로퍼티로 validator 객체를 셋팅하고 있다.
AccountFormController 클래스는 SimpleFormController 를 확장한다. (AccountFormController extends SimpleFormController)
SimpleFormController 는 Spring MVC를 구현하는데에 매우 유용한 클래스이다. 이 클래스에 대한 활용은 추후에 좀 더 공부해야 할 필요가 있다.
단지 이 문서에서는 SimpleFormController 를 상속받아서 일부 Validation 체크가 이뤄지는 부분이 onBindAndValidate 메소드라는 사실만 알면 된다.
다음은 AccountFormController 클래스에 정의된 onBindAndValidate 메소드의 코드 내용이다.
·미리보기 | 소스복사·
- protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors) throws Exception {
- AccountForm accountForm = (AccountForm) command;
- Account account = accountForm.getAccount();
- if (request.getParameter("account.listOption") == null) {
- account.setListOption(false);
- }
- if (request.getParameter("account.bannerOption") == null) {
- account.setBannerOption(false);
- }
- errors.setNestedPath("account");
- getValidator().validate(account, errors);
- errors.setNestedPath("");
- if (accountForm.isNewAccount()) {
- account.setStatus("OK");
- ValidationUtils.rejectIfEmpty(errors, "account.userid", "USER_ID_REQUIRED", "User ID is required.");
- if (account.getPassword() == null || account.getPassword().length() < 1
- || !account.getPassword().equals(accountForm.getRepeatedPassword())) {
- errors.reject("PASSWORD_MISMATCH",
- "Passwords did not match or were not provided. Matching passwords are required.");
- }
- } else if (account.getPassword() != null && account.getPassword().length() > 0) {
- if (!account.getPassword().equals(accountForm.getRepeatedPassword())) {
- errors.reject("PASSWORD_MISMATCH", "Passwords did not match. Matching passwords are required.");
- }
- }
- }
요청된 클래스는 AccountValidator 클래스로써 Account 객체의 유효성을 체크한다.
AccountValidator 클래스는 Validator 인터페이스를 상속받고 있다. (AccountValidator implements Validator)
중요한 것은 Validator 인터페이스가 mvc에만 제한되어 있지 않다는 것이다.
Validator 인터페이스의 패키지를 보면 이러한 사실을 알 수 있다. (org.springframework.validation.Validator)
이는 유효성 체크가 웹계층과 연관이 없어야하고, 어떤 장소에 배치하기(localize) 쉬워야한다는 것과 어떠한 유효성 검사를 수행하고 싶은 개발자가 쉽게 플러그인 할 수 있도록 해야한다는 것을 의미한다.
그리고 Spring은 어플리케인션 모든 계층내에 기본적으로 사용할 수 있는 Validator 인터페이스를 제안하고 있다.
다음은 AccountValidator 클래스의 내용이다.
·미리보기 | 소스복사·
- public class AccountValidator implements Validator {
- public boolean supports(Class clazz) {
- return Account.class.isAssignableFrom(clazz);
- }
- public void validate(Object obj, Errors errors) {
- ValidationUtils.rejectIfEmpty(errors, "firstName", "FIRST_NAME_REQUIRED", "First name is required.");
- ValidationUtils.rejectIfEmpty(errors, "lastName", "LAST_NAME_REQUIRED", "Last name is required.");
- ValidationUtils.rejectIfEmpty(errors, "email", "EMAIL_REQUIRED", "Email address is required.");
- ValidationUtils.rejectIfEmpty(errors, "phone", "PHONE_REQUIRED", "Phone number is required.");
- ValidationUtils.rejectIfEmpty(errors, "address1", "ADDRESS_REQUIRED", "Address (1) is required.");
- ValidationUtils.rejectIfEmpty(errors, "city", "CITY_REQUIRED", "City is required.");
- ValidationUtils.rejectIfEmpty(errors, "state", "STATE_REQUIRED", "State is required.");
- ValidationUtils.rejectIfEmpty(errors, "zip", "ZIP_REQUIRED", "ZIP is required.");
- ValidationUtils.rejectIfEmpty(errors, "country", "COUNTRY_REQUIRED", "Country is required.");
- }
- }
이 항목에 대한 유효성 체크는 신규가입인지, 개인정보수정 인지에 따라 분기하기 위해 컨트롤러의 onBindAndValidate 메소드내에서 직접적으로 구현하고 있는 것이다.
나머지 설정에 관련된 코드는 컨트롤러의 생성자 부분에 setValidateOnBinding(false); 코드와 servlet.xml 화일에 정의된 컨트롤러 설정부분이다.
컨트롤러 설정부분에서는