Spring MVC Validation Testing
참조 :
Spring MVC 9장
springmodules의 valang을 활용한 Validation 테스트
Where is ErrorsVerifier class mentioned in Expert Spring MVC?
본문에서 Validator를 테스트 하는 방법을 소개하고 있습니다.
public void testEmptyPersonValidation() {
Person person = new Person();
Validator validator = new PersonValidator();
BindException errors = new BindException(person, "target");
validator.validate(person, errors);
new ErrorsVerifier(errors) {
{
forProperty("firstName").hasErrorCode("person.firstName.required")
.forProperty("lastName").hasErrorCode("person.lastName.required")
.otherwise().noErrors();
}
}
}
}
위의 소스 코드는 Spring MVC 281페이지 그대로 입니다. 하지만 위의 코드는 선뜻 이해가 가지 않았습니다.
언뜻 봤을 때 person 객체를 두번이나 사용한 것부터 뭔가 이상하게 느껴졌으며(좀 더 보고 있으니까 바인딩 할 때 한번 검증할 때 한 번 사용하는 의도 인것 같습니다.)
ErrorsVerifier라는 익명 클레스의 사용이 낯설었습니다.
ErrorsVerifier를 사용한 것을 보면 fluent interface 개념으로 구현하여 매우 재밌고 직관적으로 작명된 메소드의 이름들을 확인할 수 있습니다. 하지만 안타깝게도 책에 나온 설명과 달리 저 클레스(?)는 spring 프레임웤에 존재하지 않습니다.
이 클레스를 찾느라 여러명이 고생한 흔적을 구글에서 찾을 수 있었는데 그 곳에서 보다 더 값진 것을 발견했습니다. 바로 뛰어난 선배님의 재미난 참여를 살펴 볼 수 있었습니다.
위 링크에 가시면 Spring에는 전혀 없던 ErrorsVerifier 코드를 만들어 낸 과정이 들어있습니다.
ErrorsValidator 다운dm231.java
ErrorsValidator를 사용한 예제 코드
public void testEmptyMemberInfo() {
MemberInfo memberInfo = new MemberInfo();
Validator validator = new MemberInfoValidator();
BindException errors = new BindException(memberInfo, "target");
validator.validate(memberInfo, errors);
ErrorsVerifier errorsVerifier = new ErrorsVerifier(errors);
errorsVerifier.forProperty("name").hasErrorCode("required")
.forProperty("password").hasErrorCode("required")
.forProperty("confirmPassword").hasErrorCode("required")
.forProperty("email").hasErrorCode("required");
}
}
음~ 좋네요. 다시 보니까 Spring MVC 에 나온 코드는 컴파일 에러가 나지 않을까 싶네요;; 클레스파일이 없기도 없거니와 인너 클래스의 사용이 이상해요. 중괄호 연속 두 개씩.. 대체 무슨 의미인건지;;; 어떻게 하라는건지~ㅋㅋ