Spring 3 의 JSR 303(Bean Validation) 지원 - 귀찮은확인, 쉽고편하게하자!- 2010. 9. 11 KSUG 안세원 kingori@gmail.com
목차 JSR 303 (Bean Validation) 소개 JSR 303 개요 JSR 303 주요구성요소 Spring 3 의 JSR 303 지원 Spring 3 의 JSR 303 활용 Spring MVC 의 JSR 303 활용 2
확인 (Validation) 시스템구성단위가목표한대로동작하기위한작업으로, 시스템의모든계층에꼭필요함! 하지만 상당히귀찮으며중복이많음 개발편의와일관성을위해다양한 Validation 도구들이개발됨 if( input.getname() == null input.getaddress() == null input.getemail() == null ) { throw new Exception( invalid input! ); } 3
JSR 303 Bean Validation 도메인객체를확인하기위한 Java 표준기술 애노테이션으로확인규칙을명시 < 도메인객체를이용한확인개념도 > [1] 4 [1] Hibernate Validator Reference Guide
살짝둘러보기 < 확인 Application - ValidateCar> 확인실패!! doors:must be greater than or equal to 2 name:may not be null < 도메인객체 Car> <Console 결과 > 5
JSR 303 의 4 대구성요소 구성요소 Constraint Annotation Constraint Validation 구현체 설명 확인기준을표현하는애노테이션 Constraint Annotation 과쌍을이루며, 확인로직을구현함 Validator 도메인객체인스턴스에대한확인을실행함 ConstraintViolation 확인기준의위반내용 6
Constraint Annotation 클래스에적용할수있음 예 ) 여러속성에대한확인규칙 사용자가직접정의할수있음 속성을가질수있음 필드에적용할수있음 메시지를별도로정의할수있음 Bean 속성 (Property) 에적용할수있음 (getter 메서드 ) 주의 ) 필드와속성에중복적용하지말것! 7
Constraint Annotation 정의 @Past 의코드 [1] Target: Annotation 적용대상정의 Retention: RUNTIME 으로고정 Constraint: validatedby 에 Constraint Validation 구현체정의 message(): 필수정의속성. 표준기본값은 annotation 의 fully qualified class name +.message groups(): 필수정의속성 payload(): 필수정의속성 8 [1] JSR 303 Spec
기본제공 Constraint Annotation Annotation 통과조건 Annotation 통과조건 @AssertFalse 거짓인가? @Max 지정값이하인가? @AssertTrue 참인가? @Min 지정값이상인가? @DecimalMax 지정값이하실수인가? @NotNull Null이아닌가? @DecimalMin 지정값이상실수인가? @Null Null인가? @Digits (integer=, fraction=) 대상수가지정된정수, 소수자리수이내인가? @Pattern (regex=, flag=) 정규식을만족하는가? @Future 미래날짜인가? @Size (min=, max=) 문자열, 배열등의크기가지정크기를만족하는가? @Past 과거날짜인가? @Valid 대상객체의확인조건을 만족하는가? 9
Constraint Validation 구현체 확인로직을구현하는클래스 Constraint Annotation 의 @Constraint( validatdateby ) 에명시함 Constraint Annotation 별, 확인대상 Class 별로정의해야함 예 ) @Past 에대한 Hibernate Validator 의구현체는 org.hibernate.validator.constraints.impl.pastvalidatorforcalendar 와 org.hibernate.validator.constraints.impl.pastvalidatorfordate 10
Constraint Validation 구현체정의 인터페이스 javax.validation.constraintvalidator 를구현함 Constraint Annotation, 확인형을명시 메서드 initialize(): 확인준비로직을수행함. 예 ) annotation 의정보를가져와 field 에저장 메서드 isvalid() : 대상객체에대한확인로직을수행하고, 결과를 boolean 형태로반환함. ConstraintViolation 을변경할땐인자로받은 ConstraintValidatorContext 를활용함 11
Validator 12
ConstraintViolation 확인위반결과를반환함 메서드명설명예 getmessage() 메시지내용을반환 may not be null getmessagetemplate() getrootbean() getleafbean() Constraint Annotation 에정의한메시지 key 를반환 확인대상 Root Bean 인스턴스를반환 확인대상 Leaf Bean 인스턴스를반환 { javax.validation.constraint s.notnull.message} getpropertypath() 대상속성에대한경로를반환 driver.name getinvalidvalue() 확인위반값인스턴스를반환 null <ConstraintViolation 주요메서드 > 13
확인규칙의상속과포함 1. 자식클래스는부모클래스의확인규칙을상속한다. 2. @Valid 를통해필드클래스의확인규칙을포함한다. 좌석수가 null 이아니어야함 (Car 로부터상속 ) 승객수가 null 이아니어야함 (Car 로부터상속 ) 운젂자가 null 이아니어야함 ( 직접정의 ) 운젂자. 이름이 null 이아니어야함 (@Valid 를통해 Person 의확인기준을적용 ) 14
확인그룹 (Validating Group) 상황에따라확인기준이달라질경우어떻게할까? 매번새로운도메인객체를정의? 상속? 확인그룹사용 interface/ class 모두가능 15 확인실패!! 승객수 :may not be null
Custom Constraint Constraint 를직접만들어쓸수있음 1. 기본제공되는 Constraint 를조합 별도의 Constraint Validation 구현체가필요없으며, Constraint Annotation 과메시지만정의하면됨 2. 새로운검증로직구현 Constraint Annotation, Constraint Validation 구현체, 메시지를정의함 16
Custom Constraint 조합 @NotNull, @Min, @Max 를조합한새로운 Constraint Annotation 을정의함 Constraint Validation 구현체는필요없으므로 validatedby 부분은 {} Constraint 에대한메시지정의와등록이필요함 17
Custom Constraint 로직구현 18
메시지처리 - 우선순위 Constraint Annotation 의 message 속성값 등록된 Custom MessageInterpolator 호출 기본 ResourceBundle 인 ValidationMessage 의메시지 구현체자체제공 ResourceBundle 의메시지 19
메시지처리 message 속성활용 20
메시지처리 MessageInterpolator <META-INF/validation.xml> ValidationMessages2 이라는이름의 ResourceBundle 에서메시지를가져오도록정의함 21
메시지처리 ResouceBundle ValidationMessage ResourceBunlde 생성 <ValidationMessages_ko.properties> <ValidateCar.java - 위반항목출력로직 > < 프로젝트구조 > 확인실패!! name: 값을입력해주세요 doors:2 보다크거나같아야합니다. 22 < 실행결과 >
실행환경구성 구현체선택 JSR 303 실행 Implementation Hibernate Validator: JSR 303 참조구현체 (http://www.hibernate.org/subprojects/validator.html) Apache Bean Validation (http://incubator.apache.org/bval/cwiki/index.html) 본자료는 Hibernate Validator 를기준으로함 23
실행환경구성 라이브러리설정 Hibernate Validator 를다운로드한다음, 다음의 jar 파일을프로젝트 classpath 에등록함 hibernate-validator- 버젂.jar log4j- 버젂.jar slf4j-*.jar validation-api- 버젂.jar 24
복습 - JSR 303 의 4 대구성요소 구성요소 Constraint Annotation Constraint Validation 구현체 설명 확인기준을표현하는애노테이션 Constraint Annotation 과쌍을이루며, 확인로직을구현함 Validator 도메인객체인스턴스에대한확인을실행함 ConstraintViolation 확인기준의위반내용 25
Spring 3 의 JSR 303 지원 Spring 3 의 JSR 303 지원 org.springframework.validation.beanvalidation Javax.validation.Validator 를 spring.validation.validator 로활용가능 Constraint Validation Implementation 에 @Autowire 등의 DI 가능 Spring 의 Locale 적용가능 @Controller 의 parameter 에 @Valid 활용 26
JSR 303 지원클래스의구조
Spring 기본설정 <applicationcontext.xml> Custom MessageInterpolator 사용예시 + JSR 303 구현체 : spring 자체가 JSR 303 구현체를제공하지않음 28
Validator vs. Validator javax.validation.validator 를 spring.validation.validator 로활용가능 org.springframework.validation.beanvalidation.springvalidatoradapter 의역할 Spring 의 Errors 형태로확인위반결과를활용 단, 확인그룹 (Validation Group) 활용은불가! 동일한 instance! 29
Constraint Validator 에 @Autowire 사용 Custom Constraint Validator 구현체에 @Value, @Autowire 를사용가능 org.springframework.validation.beanvalidation.springconstraintvalidator Factory Constraint Validator 가 Service, Property, 기타스프링 Bean 을손쉽게활용가능 30
Spring MVC 의 @Valid 지원 @Controller 의 Model 인자에대한자동확인수행가능 위반결과는 BindingResult 에저장 그러나, 확인그룹은적용할수없음 javax.validation.valid 31
Spring MVC 의 @Valid 지원 <dispatcher-servlet.xml> 32 validator 를설정할수있음 (org.springframework. validation.validator) 별도설정이필요치않다면 validator 관련모든설정을생략해도무방!
복습 - Spring 3 의 JSR 303 지원 Spring 3 의 JSR 303 지원 org.springframework.validation.beanvalidation Javax.validation.Validator 를 spring.validation.validator 로활용가능 Constraint Validation Implementation 에 @Autowire 등의 DI 가능 Spring 의 Locale 적용가능 @Controller 의 parameter 에 @Valid 활용 33
더공부할내용 XML으로확인기준정의하기 프로그램코드로확인기준정의하기 더복잡한 Custom Constraint 정의하기 GroupSequence 적용하기 Payload 활용하기 validation.xml 사용하기 34
참고자료 JSR303 Specification (http://jcp.org/en/jsr/detail?id=303) Hibernate Validator (http://www.hibernate.org/subprojects/validator.html) Spring Reference Chap 5. Validation, Data Binding, and Type Conversion (http://static.springsource.org/spring/docs/3.0.x/springframework-reference/html/validation.html) 35
Q & A 36