Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Validator 분리 2 본문

인프런/[인프런] 스프링 MVC 2

Validator 분리 2

Seung__ 2021. 9. 24. 23:36
  • 스프링이 Validator 인터페이스를 별도로 제공하는 이유는 체계적으로 검증 기능을 도입하기 위해서임.
  • 그런데 앞에서는 검증기를 직접 불러서 사용했음.
  • 그런데 Validator 인터페이스를 사용해서 검증기를 만들면 스프링의 추가적인 도움을 받을 수 있음.

 

1. WebDataBinder를 통해 사용


  • WebDataBinder 는 스프링의 파라미터 바인딩의 역할을 해주고, 검증 기능도 내부에 포함한다.

 

 

 

2. WebDataBinder 적용

2.1 Controller


  • @InitBinder 적용, init()
  • 해당 메서드에 WebDataBinder를 넘겨주고, WebDataBinder에 validator를 넣어준다.
  • 이렇게 되면 Controller가 호출될 때마다 WebDataBinder를 생성한다.
  • 이렇게 WebDataBinder에 검증기를 추가하면 해당 controller에서는 validator를 자동으로 적용 가능.
@Slf4j
@Controller
@RequestMapping("/validation/v2/items")
@RequiredArgsConstructor
public class ValidationItemControllerV2 {

    private final ItemRepository itemRepository;
    private final ItemValidator itemValidator;

    @InitBinder //controller가 호출될 때 마다 실행됨. 매 번 WebDataBinder가 생성됨.
    public void init(WebDataBinder dataBinder){
        dataBinder.addValidators(itemValidator);
    }

 

 

2.2 method


  • 검증 대상 앞에 @Validated를 추가하자.
  • Item에 대해 WebDataBinder에 넣어둔 Validator 가 자동으로 적용된다.
  • 별도의 검증 메서드를 추가하지 않아도 된다.
  • 검증 결과는 BindingResult에 담긴다.
    @PostMapping("/add")
    public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {

        //검증에 실패하면 다시 입력 폼으로 이동
        if(bindingResult.hasErrors()){
            log.info("errors = {}", bindingResult);
            // model.addAttribute("errors", errors);
            return "validation/v2/addForm";
        }

        //성공 로직.
        Item savedItem = itemRepository.save(item);
        redirectAttributes.addAttribute("itemId", savedItem.getId());
        redirectAttributes.addAttribute("status", true);
        return "redirect:/validation/v2/items/{itemId}";
    }

 

 

 

3. 동작 방식


  • @Validated = "검증기를 실행 하라"는 annotation
  • @Validated가 붙어있으면, WebDataBinder에 등록한Validator 실행함.
  • 만약 Validator가 여러개면??? 어떤거 사용하지???
  • 이 때 supports()가 사용됨.
    @Override
    public boolean supports(Class<?> clazz) {
        return Item.class.isAssignableFrom(clazz); //자식 클래스까지 커버 가능.
    }
  • 여기서는 supports(Item.class) 호출됨.
  • 결과가 true 이므로 ItemValidator 의 validate() 가 호출된다.

 

 

4. Global 설정 - 모든 controller에 적용


  • application이 WebMvcConfigurer를 구현.
  • 각 controller에서 @Validated가 붙으면 해당 validator 적용이 가능.
@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer {

  public static void main(String[] args) {
  SpringApplication.run(ItemServiceApplication.class, args);
  }
  
  @Override
  public Validator getValidator() {
  return new ItemValidator();
  }
}

 

5. 참고


  • @Validated @Valid 둘다 사용가능하다.
  • javax.validation.@Valid 를 사용하려면 build.gradle 의존관계 추가가 필요
  • implementation 'org.springframework.boot:spring-boot-starter-validation'
  • @Validated 는 스프링 전용 검증 애노테이션
  • @Valid 는 자바 표준 검증 애노테이션

 

6. GitHub : 210924 @Validated


 

GitHub - bsh6463/Validation-V1

Contribute to bsh6463/Validation-V1 development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글

Bean Validation - 시작  (0) 2021.09.25
Bean Validation  (0) 2021.09.25
Validator 분리 1  (0) 2021.09.24
오류코드와 메시지 처리6  (0) 2021.09.24
오류 코드와 메시지 처리 5  (0) 2021.09.24
Comments