반응형
org.springframework.validation.Validator
애플리케이션에서 사용하는 객체 검증용 인터페이스
특징
- 어떠한 계층과도 관계가 없다 ⇒ 모든 계층(웹, 서비스, 데이터)에서 사용해도 좋다.
- 구현체 중 하나로, JSR-303(Bean Validation 1.0)과 JSR-349(Bean Validation1.1)을 지원한다. (LocalValidatorFactoryBean)
- DataBinder에 들어가 바인딩 할 때 같이 사용되기도 한다.
인터페이스
- boolean support(Class clazz) : 어떤 타입의 객체를 검증할 때 사용할 것인지 결정함
- void validate(Object obj, Error e) : 실제 검증 로직을 이 안에서 구현
- 구현할 때 ValidationUtils를 사용하면 편리함
스프링 부트 2.0.5이상 버전을 사용할 때
- LocalValidatorFactoryBean 빈으로 자동 등록
- JSR-380(Bean Validation 2.0.1) 구현체로 hibernate-validator 사용
Bean Validation
- 자바 표준 스펙(JEE) - beanvalidation.org
Event.class
@Getter
@Setter
public class Event {
Integer id;
String title;
}
Event에서 title이 빈값이 아니여야 한다면, 아래와 같이 Validator를 구현할 수 있다.
public class EventValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return Event.class.equals(aClass); // Event class만 검증한다.
}
@Override
public void validate(Object o, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title", "notempty", "Empty title is now allowed");
// ValidationUtils를 안사용할 경우, errors를 사용해서 작성할 수 있다.
Event event = (Event) o;
if(event.getTitle() == null){
errors.rejectValue("title", "notempty");
}
}
}
Event Validator 사용하기(원시적인 방법)
public class ValidatorAppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
Event event = new Event();
EventValidator validator = new EventValidator();
Errors errors = new BeanPropertyBindingResult(event, "event"); // target, name
validator.validate(event, errors); // validate
System.out.println(errors.hasErrors());
errors.getAllErrors().forEach(e ->{
System.out.println("==== error code =====");
Arrays.stream(e.getCodes()).forEach(System.out::println);
System.out.println(e.getDefaultMessage());
});
}
}
==== error code =====
notempty.event.title // 자동으로 생성됨
notempty.title // 자동으로 생성됨
notempty.java.lang.String
notempty
Empty title is now allowed
스프링 부트를 사용하면, LocalValidatorFactoryBean이 자동으로 등록되기 때문에 Validator를 주입 + @어노테이션으로 손쉽게 사용할 수 있다.
@Component
public class ValidatorAppRunner implements ApplicationRunner {
@Autowired
Validator validator;
@Override
public void run(ApplicationArguments args) throws Exception {
Event event = new Event();
Errors errors = new BeanPropertyBindingResult(event, "event"); // target, name
validator.validate(event, errors);
System.out.println(errors.hasErrors());
errors.getAllErrors().forEach(e ->{
System.out.println("==== error code =====");
Arrays.stream(e.getCodes()).forEach(System.out::println);
System.out.println(e.getDefaultMessage());
});
}
}
@Getter
@Setter
public class Event {
Integer id;
@NotEmpty
String title;
}
==== error code =====
NotEmpty.event.title
NotEmpty.title
NotEmpty.java.lang.String
NotEmpty
반드시 값이 존재하고 길이 혹은 크기가 0보다 커야 합니다.
사실 위처럼 validation을 사용하기보단 Spring MVC를 활용할때 데이터 바인딩시에 간편하게 validation체크를 하는 방법이 있기 때문에 그 방법을 많이 사용한다.
반응형
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] 데이터바인딩 - Converter와 Formatter (0) | 2020.03.26 |
---|---|
[Spring] 데이터 바인딩 - PropertyEditor (0) | 2020.03.25 |
[Spring] ResourceLoader, Resource 추상화 (0) | 2020.03.22 |
[Spring] MessageSource (0) | 2020.03.16 |
[Spring] Environment 프로파일/프로퍼티 (0) | 2020.03.11 |