프로그래밍/JAVA2013.01.30 13:57

oval는 java object를 어노테이션 기반으로 손쉽게 검증할 수 있도록 하는 validation framework입니다.


OVal is a pragmatic and extensible validation framework for any kind of Java objects (not only JavaBeans). Constraints can be declared with annotations (@NotNull, @MaxLength), POJOs or XML. Custom constraints can be expressed as custom Java classes or by using scripting languages such as JavaScript, Groovy, BeanShell, OGNL or MVEL. Besides field/property validation OVal implements Programming by Contract features by utilizing AspectJ based aspects. This for example allows runtime validation of method arguments.


maven을 통한 설치

<dependency>
	<groupId>net.sf.oval</groupId>
	<artifactId>oval</artifactId>
	<version>1.81</version>
</dependency>

또는 아래 링크에서 라이브러리 및 문서를 다운로드할 수 있습니다.


http://oval.sourceforge.net/


OVal를 이용해 java object validation을 수행하기 위한 첫 번째 단계는 아래 예제 처럼 class field에 어노테이션을 사용해 제약조건을 설정하는 것입니다. 제약조건은 class field외에도 getter 메소드에 사용할 수 있습니다.)


OVal는 아래 예제에서 사용된 제약조건외에도 pre-built 된 다양한 제약조건을 제공합니다.

(사용가능한 제약조건 어노테이션은 net.sf.oval.constraint package에서 확인할 수 있습니다.)

public class Person {

	@NotNull
	@NotEmpty
	@Length(max=10)
	private String name;
	
	@NotNull
	@Digits
	private Integer age;
	
	@NotNull
	@NotEmpty
	@Length(max=10)
	private String city;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}
}

제약조건들의 AND 또는 OR와 같은 logical한 제약조건 검사를 실행하기 위해 expression language를 사용할 수도 있습니다.


 @Assert(expr = "_value ==_this.deliveryAddress || _value == _this.invoiceAddress", lang = "jexl")


  • _value : contains the value to validate (field value or getter return value)
  • _this : is a reference to the validated object


위 예제에서 age의 경우 항상 0보다 커야 하므로 @Assert를 다음과 같이 활용할 수 있습니다.


@Assert(expr="_value>0", lang="jexl")
private Integer age;


사용가능한 expression language는 


  • bsh or beanshell for BeanShell
  • groovy for Groovy
  • jexl for JEXL
  • js or javascript for JavaScript (via Mozilla Rhino)
  • mvel for MVEL
  • ognl for OGNL
  • ruby or jruby for Ruby (via JRuby)

위와 같으며, 해당 language의 라이브러리가 필요합니다.
필자의 경우 apache commons의 jexl을 주로 사용합니다.

<dependency>
    	<groupId>org.apache.commons</groupId>
	<artifactId>commons-jexl</artifactId>
	<version>2.1.1</version>
</dependency>

자 이제 제약조건을 설정한 object를 실제 validation 하는 방법은 다음과 같습니다.

Validator validator = new Validator();

Person p = new Person();

// collect the constraint violations
List<ConstraintViolation> violations = validator.validate(p);

if( violations.size() > 0 ) {
	for(ConstraintViolation violation : violations) {
		System.out.println(violation.getMessage());
	}
}

object에 제약조건에 위반되는 field값이 있다면 validator.validate 메소드의 실행 결과 리스트 사이즈는 0보다 큽니다. 


위 코드에서 Person object는 name, age, city filed에 대한 값이 null 이기 때문에 위 예제에서 설정한 제약조건을 위반하였고, 다음과 같은 메세지를 확인할 수 있습니다.


  • Person.name cannot be null
  • Person.age cannot be null
  • Person.age does not satisfy condition: _value>0
  • Person.city cannot be null

OVal는 위에 설명한 기능외에도 다양한 방식을 통해 object validation을 수행할 수 있고, Spring 등과 같은 프레임워크에 통합도 가능합니다. 보다 자세한 정보는 http://oval.sourceforge.net/ 에서 확인할 수 있습니다.

저작자 표시 비영리 변경 금지
신고
Posted by devop