코드 그라데이션

Validator 분리 (2) 본문

Spring/Validation

Validator 분리 (2)

완벽한 장면 2024. 2. 28. 01:51

Validator 분리 (2)

스프링이 Validator 인터페이스를 별도로 제공하는 이유는 체계적으로 검증 기능을 도입하기 위해서다.

그런데 앞에서는 검증기를 직접 불러서 사용했고, 이렇게 사용해도 된다. 

그런데 Validator 인터페이스를 사용해서 검증기를 만들면 스프링의 추가적인 도움을 받을 수 있다.

 

 

WebDataBinder를 통해서 사용하기

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

 

ValidationItemControllerV2에 다음 코드를 추가

// 추가
@InitBinder
public void init(WebDataBinder dataBinder) {
    log.info("init binder {}", dataBinder);
    dataBinder.addValidators(itemValidator);
}
  • 이렇게 WebDataBinder 에 검증기를 추가하면 해당 컨트롤러에서는 검증기를 자동으로 적용할 수 있다.
    @InitBinder 해당 컨트롤러에만 영향을 준다. 
  • 글로벌 설정은 별도로 해야한다.

 

@Validated 적용

ValidationItemControllerV2 - addItemV6()

@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item, //여기
						BindingResult bindingResult, 
                        RedirectAttributes redirectAttributes, 
                        Model model) {

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

    //성공 로직
    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute("itemId", savedItem.getId());
    redirectAttributes.addAttribute("status", true);
    return "redirect:/validation/v2/items/{itemId}";
}
  • validator를 직접 호출하는 부분이 사라지고, 대신에 검증 대상 앞에 @Validated 가 붙었다.

 

 

참고
> 검증 시 @Validated @Valid 둘다 사용가능하다.
> javax.validation.@Valid 를 사용하려면 build.gradle 의존관계 추가가 필요하다.
> implementation 'org.springframework.boot:spring-boot-starter-validation'
> @Validated 는 스프링 전용 검증 애노테이션이고, @Valid 는 자바 표준 검증 애노테이션이다.
> 자세한 내용은 다음 Bean Validation에서 다룬다.

 

 

cf. 글로벌 설정

@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer { // 이렇게
	
    public static void main(String[] args) {
		SpringApplication.run(ItemServiceApplication.class, args);
	}

	// 이렇게
	@Override
	public Validator getValidator() {
		return new ItemValidator();
	}
}
  • 이렇게 글로벌 설정을 추가할 수 있다. 기존 컨트롤러의 @InitBinder 를 제거해도 글로벌 설정으로 정상 동작하는 것을 확인할 수 있다.

현재는 원상복구

728x90

'Spring > Validation' 카테고리의 다른 글

Bean Validation - 시작 및 프로젝트 세팅 V3  (1) 2024.03.01
Bean Validation - 소개  (0) 2024.02.29
Validator 분리 (1)  (0) 2024.02.28
오류 코드와 메시지 처리 (6)  (0) 2024.02.27
오류 코드와 메시지 처리 (5)  (1) 2024.02.27
Comments