-
Validation추상화SPRING/스프링프레임워크 핵심개념 2021. 5. 19. 15:20
스프링에서 애플리케이션에서 사용하는 객체들을 검증용 Interface를 제공한다.
-> 모든 계층 (웹, 데이터, 서비스)에서 사용 가능 하다.
-> Validation은 DataBinder에 들어가 바인딩 할 때 같이 사용되기도 한다.
Validator Interface를 구현하는 Class는 두 가지 Method를 구현해서 사용한다.
1. supports : parameter로 받은 Instance의 클래스를 검증
2. validate : 실질적인 Validation이 이루어지는 Method
import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; public class EventValidator implements Validator { @Override public boolean supports(Class<?> aClass) { // aClass와 Event가 같은 클래스인지 boolean으로 판단 return Event.class.equals(aClass); } @Override public void validate(Object o, Errors errors) { ValidationUtils.rejectIfEmptyOrWhitespace(errors,"title", "notempty", "empty title is not allowed"); // ValidationUtils 뿐만 아니라 아래와 같은 로직을 사용할 수도 있다. Event event = (Event) o; if(event.getTitle() == null) { // errors.rejectValue("title", "not empty"); } } }
Event 클래스
public class Event { Integer id; String title; Integer limit; 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; } }
@Component public class AppRunner implements ApplicationRunner { //@Autowired //Validator eventValidator; @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()); errors.getAllErrors().forEach(e->{ System.out.println("========== error ============"); Arrays.stream(e.getCodes()).forEach(System.out::println); System.out.println(e.getDefaultMessage()); }); } }
최근에는 위와 같이 Validator를 사용하는 방법 보다는 LocalValidatorFactoryBean을 이용한 Validation 방법을 더 많이 사용한다. 스프링부트 2.3.0부터는 starter-validation을 추가로 설정해줘야 한다.
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; } }
Event 클래스에 위와 같이 Validation 어노테이션을 추가합니다.
@Component public class AppRunner implements ApplicationRunner { @Autowired Validator eventValidator; @Override public void run(ApplicationArguments args) throws Exception { Event event = new Event(); event.setLimit(-1); event.setEmail("jump"); //EventValidator eventValidator = new EventValidator(); Errors errors = new BeanPropertyBindingResult(event, "event"); eventValidator.validate(event, errors); System.out.println(errors.hasErrors()); errors.getAllErrors().forEach(e->{ System.out.println("========== error ============"); Arrays.stream(e.getCodes()).forEach(System.out::println); System.out.println(e.getDefaultMessage()); }); } }
결과
'SPRING > 스프링프레임워크 핵심개념' 카테고리의 다른 글
데이터 바인딩 추상화 : Converter와 Formatter (0) 2021.05.23 데이터 바인딩 추상화: PropertyEditor (0) 2021.05.19 Resource 추상화 (0) 2021.05.18 ResourceLoader (0) 2021.05.17 ApplicationEventPublisher (0) 2021.05.16