반응형
Validation 추상화
-Bean Validation: 자바 표준 스펙 중 하나
-Validator: 주로 애플리케이션 MVC에서 사용하지만, 어떤 계층에서도 사용 가능한 인터페이스
두 가지 메소드를 제공합니다
·supports: 검증해야 하는 인스턴스의 클래스가 해당 Validator가 지원 및 검증할 수 있는 클래스인지 확인해줍니다.
·validate: 실질적으로 검증 작업이 일어나는 곳입니다.
//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
import org.springframework.validation.Validator;
//Validator를 가져올 때 스프링에 들어있는 것을 가져와야 함
public class EventValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Event.class equals(clazz);
}
//파라미터로 전달되는 타입이 이벤트인지 확인
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, field: "title", errorCode: "notempty", defaultMessage: "Empty title is now allowed");
}
//ValidationUtils를 사용하지 않고 직접 에러 코드를 담을 수도 있음
//LocalValidatorFactoryBean.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, objectName: "event");
eventValidator.validate(event, errors);
//event객체를 검사하고 errors에 검증 에러를 담아줍니다
System.out.println("errors", hasErrors());
errors.getAllErrors().forEach(e -> {
Sytem.out.println("===error code===");
Arrays.stream(e.getCodes()).forEach(System.out::println);
System.out.println(e.getDefaultMessage());
});
//errors에서 모든 에러를 가져와서 순차적으로 에러를 순회하며 에러 코드를 찍어봅니다
-스프링 부트를 사용할 경우
·LocalValidatorFactoruyBean 빈으로 자동 등록되어 사용 가능합니다
//Event.java
public class Event {
Integer id;
@NotEmpty
String title;
@NotNull @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;
}
}
//LocalValidatorFactoryBean.java
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
Validator validator;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(validator.getClass());
Event event=new Event();
event.setLimit(-1); //최솟값 0보다 작은 값 대입(오류 발생)
event.setEmail("aaa2"); //이메일 형식이 아닌 값 대입(오류 발생)
Errors errors=new BeanPropertyBindingResult(event, objectName: "event");
Validator.validate(event, errors);
System.out.println("errors", hasErrors());
errors.getAllErrors().forEach(e -> {
Sytem.out.println("===error code===");
Arrays.stream(e.getCodes()).forEach(System.out::println);
System.out.println(e.getDefaultMessage());
});
반응형
'Spring > 스프링 프레임워크 핵심 원리' 카테고리의 다른 글
[Spring] #18. 스프링 AOP: 개념 소개 (0) | 2020.12.24 |
---|---|
[Spring] #17. SpEL(스프링 Expression Language) (0) | 2020.12.24 |
[Spring] #16. 데이터 바인딩 추상화: Converter와 Formatter (0) | 2020.12.24 |
[Spring] #15. 데이터 바인딩 추상화: PropertyEditor (0) | 2020.12.24 |
[Spring] #13. Resource 추상화 (0) | 2020.12.24 |