Validator 분리 2
스프링이 Validator 인터페이스를 별도로 제공하는 이유가 체계적으로 검증 기능을 도입하기 위해서라고 한다. 이번에는 Validator인터페이스를 사용해 검증기를 만들어 스프링의 추가적인 도움을 받아 적용해 보는 강의를 들었다.
@InitBinder //항상 호출이 되다. 여기에서 검증기를 넣는다. 이 컨트롤에서만 실행이 된다.
public void init(WebDataBinder dataBinder) {
dataBinder.addValidators(itemValidator);
}
@InitBinder를 만들어 주었다. InitBinder는 컨트롤러가 호출이 될 때마다 항상 호출이 된다. 여기에 검증기를 넣었다 지금은 이 컨트롤러에서만 실행이 되는데
@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Override
public Validator getValidator() {
return new ItemValidator();
}
}
이렇게 SpringBootApplication에 적어주면 글로벌 설정이 가능하다. 이렇게 되면 모든 컨트롤러에서 모두 다 적용이 가능한데 잘 사용은 안 한다고 한다. 또, 이렇게 설정하면 BeanValidator가 자동 등록되지 않는다고 한다. 이부분에 대해서는 다음 강의에서 제대로 알려주시겠다고 하신다.
@PostMapping("/add") //바인딩은 모델어트리뷰터 뒤에 와야한다. 바인딩이 아이템 객체에 대한 바인딩을 가지고 있기 떄문이다. 꼭 순서가 중요하다.
public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
여튼 위처럼 InitBinder 어노테이션을 활용하고 매핑에서는 @Validated를 넣어주었는데 이 어노테이션이 검증기를 실행하라는 어노테이션이다. 이 어노테이션이 붙으면 앞에 WebDataBinder에 등록한 검증기를 찾아 실행한다고 하는데 만약 여러 검증기를 등록했다면 그 중 어떤 검증기가 실행이 되어야 하는지 구분이 필요하기 때문에 그떄 supports()가 사용된다고 한다.
@Override
public boolean supports(Class<?> clazz) {
return Item.class.isAssignableFrom(clazz);
}
supports()는 검증 로직을 모아둔 클래스에 있는데 클래스의 item 정보를 가져와 true면 ItemValidator의 validate()가 호출이 되는 방식으로 작동한다고 한다.
@Validated는 스프링 전용 검증 어노테이션이고 @Valid는 자바 표준 검증 어노테이션이라고 하는데 자세한 내용은 다음 강의에서 다룬다고 한다.
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : Bean Validation 에러 코드 (0) | 2022.02.16 |
---|---|
[Spring Boot] : Bean Validation 소개 및 스프링 적용하기 (0) | 2022.02.14 |
[Spring Boot] : Validator 분리(1) (0) | 2022.02.11 |
[Spring Boot] : 검증 오류 코드 2가지 확인하기 (0) | 2022.02.11 |
[Spring Boot] : 구체적에서 덜 구체적으로 오류 코드 메시지 처리하기 (0) | 2022.02.11 |
댓글