Spring Framework + Jakarta Commons Validator
by BBarkji
Spring Framework + Jakarta Commons Validator
여기서는 Jakarta Commons Validator를 Spring Framwork와 연동하여 사용하는 방법에 대해 설명한다. Jakarta Commons Validator는 필수값, 각종 primitive type(int, long, float…), 최대-최소 길이, 이메일, 신용카드 번호 등의 값 체크를 할 수 있도록 Template이 제공된다. 이 Template은 Java 뿐만 아니라 Javascript로도 제공되어 client-side, server-side의 검증을 함께 할 수 있으며, Configuration과 에러메시지를 client-side, server-side 별로 따로 하지 않고 한 곳에서 같이 쓰는 관리상의 장점이 있다. Spring에서는 Spring Modules 프로젝트에서 연계 모듈을 제공한다.
필요 라이브러리
- commons-validator : ver 1.4.0
- commons-beanutils : ver 1.8.3
- commons-digester : ver 1.8
- commons-logging : ver 1.1.2
- junit : ver 3.8.2
- spring-modules-validation.jar
DefaultValidator, DefaultBeanValidator 설정
-
DefaultValidatorFactory 프로퍼티 ‘validationConfigLocationsApache’에 정의된 validation rule을 기반으로 Commons Validator들의 인스턴스를 얻는다.
-
DafaultBeanValidator DefaultBeanValidator는 org.springframework.validation.Validator를 implements하고 있지만, DefaultValidatorFactory가 가져온 Commons Validator의 인스턴스를 이용해 validation을 수행한다.Controller에 validation 수행할때 이 DefaultBeanValidator를 참조하면 된다.
빈 정의 파일에 ValidatorFactory, Validator, validator-rules.xml, validation.xml 파일 등록
<!-- Integration Apache Commons Validator by Spring Modules -->
<bean id="beanValidator" class="org.springmodules.validation.commons.DefaultBeanValidator">
<property name="validatorFactory" ref="validatorFactory"/>
</bean>
<bean id="validatorFactory" class="org.springmodules.validation.commons.DefaultValidatorFactory">
<property name="validationConfigLocations">
<list>
<!-- validator-rules.xml, validator.xml의 위치-->
<value>/WEB-INF/conf/validator-rules.xml</value>
<value>/WEB-INF/conf/validator.xml</value>
</list>
</property>
</bean>
validator-rules.xml 설정
validator-rules.xml은 application에서 사용하는 모든 validation rule에 대해 정의하는 파일이다. 예)
<validator name="required"
classname="org.springmodules.validation.commons.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.springframework.validation.Errors"
msg="errors.required">
<javascript>
<![CDATA[
.....
]]>
</javascript>
</validator>
구분 | 내용 |
---|---|
name | validation rule (required, mask, integer, email…) |
classname | vlidation check를 수행하는 클래스명 |
method | validation check를 수행하는 클래스의 메소드명 |
methodParams | validation check를 수행하는 클래스의 메소드의 파라미터 |
msg | 에러 메시지 key |
javascript | client-side validation을 위한 자바스크립트 코드 |
Spring Modules 에서 제공하는 validation rule
(FiledCheck 클래스는 모두 org.springmodules.validation.commons.FieldChecks)
name (validation rule) | 메소드 | 기능 |
---|---|---|
required | validateRequired | 필수값 체크 |
minlength | validateMinLength | 최소 길이 체크 |
maxlength | validateMaxLength | 최대 길이 체크 |
mask | validateMask | 정규식 체크 |
byte | validateByte | Byte형 체크 |
short | validateShort | Short형 체크 |
integer | validateInteger | Integer형 체크 |
long | validateLong | Long형 체크 |
float | validateFloat | Float형 체크 |
double | validateDouble | Double형 체크 |
date | validateDate | Date형 체크 |
range | validateRange | 범위 체크 |
intRange | validateIntRange | int형 범위 체크 |
floatRange | validateFloatRange | float형 범위 체크 |
creditCard | validateCreditCard | 신용카드번호체크 |
validateEmail | 이메일체크 |
validator.xml 설정
validator.xml은 validation rule과 validation할 Form을 매핑한다. form name과 field property의 name-rule은 Server-side와 Client-side인 경우에 따라 다르다.
Server-side validation의 경우는,
form name 과 field property는 validation할 폼 클래스의 이름, 필드와 각각 매핑된다. (camel case) e.g. 폼 클래스가 DepartmentForm 이면, departmentForm
Client-side의 경우는,
form name은 JSP에서 설정한 <validator:javascript formName=”employee” …/> 태그의 formName과 매핑되고, field property는 각각의 폼 필드의 이름과 일치하면 된다.
따라서, Server-side, Client-side 둘 다 수행하려면,
JSP의 <validator:javascript formName=”employee” …/> 태그의 formName은 폼 클래스의 이름이 되어야 하고, JSP의 폼필드들은 폼 클래스의 필드와 일치해야 한다.
예)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1.dtd">
<form-validation>
<formset>
<form name="employee">
<field property="name" depends="required">
<arg0 key="employee.name" />
</field>
<field property="age" depends="integer">
<arg0 key="employee.age" />
</field>
<field property="email" depends="required,email">
<arg0 key="employee.email" />
</field>
</form>
</formset>
</form-validation>
Subscribe via RSS