Spring Validation 추상화
Validation 추상화
애플리케이션에서 사용하는 일반적인 객체 검증용 인터페이스.
Bean Validation이 제공하는 여러 Validation Annotation을 사용해서 객체의 데이터 검증용으로 사용할 수 있다.
EventValidator 인터페이스
- supports(Class clazz)
어떤 타입의 객체를 검증할 때 해당 Validation을 사용할 것인지 결정한다. - validate(Object obj, Errors e)
실제 검증 로직 구현 부분
Event.java
public class Event {
Integer id;
String title;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
EventValidator.java
public class EventValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
boolean result = false;
if(Event.class.isAssignableFrom(clazz)) {
result = true;
}
return result;
//return Event.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "title", "notEmpty", "Empty title is now allowed");
}
}
ValidationUtils
대신 아래처럼 직접 Validation 로직을 추가해서 사용할 수 있다.
Event event = (Event) target;
if(event.getTitle() == null) {
errors.reject("notEmpty", "Empty title is now allowed");
}
AppRunner.java
@Component
public class AppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
Event event = new Event();
EventValidator eventValidator = new EventValidator();
Errors errors = new BeanPropertyBindingResult(event, "event");
eventValidator.validate(event, errors);
System.out.println(errors.hasErrors());
for(ObjectError e : errors.getAllErrors()) {
System.out.println("====error code====");
for(String errMsg : e.getCodes()) {
System.out.println(errMsg);
}
System.out.println(e.getDefaultMessage());
}
}
}
Validator 인터페이스
스프링 부트 2.0.5 버전 이상 부터는 LocalValidatorFactoryBean
빈으로 자동 등록되어 있으므로 EventValidator
대신 Validator
를 의존성 주입 받아서 사용할 수 있다.
AppRunner.java
@Autowired
Validator validator;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(validator.getClass());
Event event = new Event();
//임의 Validation error를 발생하기 위해 값 설정
event.setLimit(-1);
event.setEmail("abc");
//EventValidator eventValidator = new EventValidator();
Errors errors = new BeanPropertyBindingResult(event, "event");
//eventValidator.validate(event, errors);
validator.validate(event, errors);
System.out.println(errors.hasErrors());
for(ObjectError e : errors.getAllErrors()) {
System.out.println("====error code====");
for(String errMsg : e.getCodes()) {
System.out.println(errMsg);
}
System.out.println(e.getDefaultMessage());
}
}
Event.java
@NotEmpty, @Min, @Max, @Size, @Email 등 다양한 Validation Annotaion을 쓸 수 있다.
public class Event {
Integer id;
@NotEmpty
String title;
@Min(0)
Integer limit;
@Email
String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Result
class org.springframework.validation.beanvalidation.LocalValidatorFactoryBean
true
====error code====
Min.event.limit
Min.limit
Min.java.lang.Integer
Min
반드시 0보다 같거나 커야 합니다.
====error code====
NotEmpty.event.title
NotEmpty.title
NotEmpty.java.lang.String
NotEmpty
반드시 값이 존재하고 길이 혹은 크기가 0보다 커야 합니다.
====error code====
Email.event.email
Email.email
Email.java.lang.String
Email
이메일 주소가 유효하지 않습니다.
Comments