본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : Validator 분리(2)

by 오주현 2022. 2. 11.
반응형

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편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.

반응형

댓글