728x90
Validation 추상화
org.springframework.validation.Validator
주로 spring MVC 에서 사용하지만, 웹 MVC 전용은 아니다. 애플리케이션에서 사용하는 객체 검증을 위한 일반적 인터페이스이다.
예제를 만들기 위해 이벤트를 하나 생성한다.
@Getter
@Setter
public class RedEvent {
Integer id;
String title;
}
(lombok 을 사용하여 자동 게터, 세터를 생성한다고 하자)
이제 위 이벤트를 가지고 Validator 를 구현해보자.
Validator를 사용하려면 두 가지 메소드를 구현해야 한다.
supports, validate
public class RedEventValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return RedEvent.class.equals(aClass);
}
@Override
public void validate(Object o, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title", "notempty", "제목이 있어야 합니다.");
}
}
애플리케이션 러너에 이벤트와 에러를 등록한 후 validate()
메소드를 사용해보자.
@Component
public class AppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// event 설정
RedEvent event = new RedEvent();
// error 설정
// BeanPropertyBindingResult 는 spring MVC 가 직접 만들어준다.
Errors errors = new BeanPropertyBindingResult(event, "event");
RedEventValidator eventValidator = new RedEventValidator();
eventValidator.validate(event, errors);
errors.getAllErrors().forEach(e -> {
System.out.println("-------- error code --------");
Arrays.stream(e.getCodes()).forEach(System.out::println);
System.out.println(e.getDefaultMessage());
});
}
}
}
title 이 없을 때 에러가 발생하는 것을 보여준다.
Springboot 에서 이를 더 쉽게 이용해보자.
springboot 2.3 버전 이후 부터는 validation 을 따로 등록해야 한다.
pom.xml (maven)
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
build.gradle (gradle)
depedencies {
...
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
이벤트에 아래와 같은 필드를 등록시키고 애노테이션을 넣어서 검증 조건을 추가해주자.
@NotEmpty
, @NonNull
등의 애노테이션을 위해 spring-boot-starter-validation 의존성이 필요하다.
@Getter
@Setter
public class RedEvent {
Integer id;
@NotEmpty
String title;
@NotNull @Min(0)
Integer limit;
@Email
String email;
}
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
Validator validator;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(validator.getClass());
// event 설정
RedEvent event = new RedEvent();
event.setLimit(-1);
event.setEmail("abc32®");
// error 설정
Errors errors = new BeanPropertyBindingResult(event, "event");
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());
});
}
}
세가지 에러가 출력되는 것을 확인할 수 있다.
728x90
'Java, Kotlin, Spring > Spring, Spring Boot' 카테고리의 다른 글
Spring - spEL(스프링 Expression Language) (4) | 2021.01.13 |
---|---|
Spring - 데이터 바인딩 (4) | 2021.01.13 |
Spring - ResourceLoader (64) | 2021.01.12 |
Spring - ApplicationEventPublisher (4) | 2021.01.12 |
Spring - Messagesource (2) | 2021.01.12 |
댓글